放浪軍師のXamarin.Formsアプリ開発局

Xamarin.Forms+Prism+ReactivePropertyで素人がAndroidやUWPのアプリを右往左往しながら開発している様を発信していきます。性質上間違いも多いのでご注意ください。

乱ちゃんProjectその2(ランダム機能の追加)

放浪軍師のXamarin.Formsによるアプリ開発
今回はランダム機能を追加しますよ!
まず、初めて訪問された方は以下をお読みください。

www.gunshi.info

とりあえずランダム機能追加

とりあえず簡素にランダム機能を追加してみます。
MainPageViewModelのRundumCommandGetを改造する感じですね。

using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloXamarin.ViewModels
{
    public class MainPageViewModel : ViewModelBase
    {
        public MainPageViewModel(INavigationService navigationService) 
            : base (navigationService)
        {
            //進言コマンドボタンが押された際に何をする?
            SingenRundumCommand = new DelegateCommand(RundumCommandGet);
        }

        /// <summary>
        /// 進言コマンドを取得する
        /// </summary>
        private void RundumCommandGet()
        {
            //シード値を取得(乱数固定化の阻止に必須)
            int seed = Environment.TickCount;
            // Randomクラスのインスタンス生成
            Random rnd = new System.Random();
            // 1以上4未満の乱数を取得する
            SingenLabel = (rnd.Next(1, 4)).ToString();
        }
    }
}

とりあえずこれでボタンを押した際に1以上4未満の整数。つまり1,2,3のいずれかをランダムで表示できます。こんな感じ。
f:id:roamschemer:20180313015242g:plain:w150

Modelの実装

ただ、これはMVVMの観点からして問題かもしれないと気が付く。
他からも使える機能だからViewModelに配置せずにModelに配置するすべき?
となるとModelに相当するフォルダとクラスが必要ですね。こんな感じかな?
f:id:roamschemer:20180313020747j:plain

…という事で、ここからが俺にとっての鬼門、C#におけるクラスの生成に深く切り込むことになります。

恥ずかしながら俺は普段仕事でプログラムを扱っているとはいえ、最早骨董品と呼べるような言語であるVB6の使用を余儀なくされており、プログラミング知識もお察しレベルです。しかもそのVB6のコードもほんとお見せできないぐらい恥ずかしい記述を余儀なくされております。クラスとか使ったこと殆どありません。モジュールオンリーです。
※ちなみにそんな俺が食っていけてるのは、プログラム以外のとある知識が必要な物凄く特殊でニッチな分野にいるからです。C#か、せめてVB.NETに移行してくれと進言しまくってるんですけど…

…で、そんな状況から今回のブログをおっ立てた為、XamarinどころかC#もろくに書けない。。。
for文やif文でさえ、調べながらじゃないと書けないとか笑えるでしょ?ハハハ…(自虐)
そんな俺が特に苦戦するのがクラスとかプロパティの作成になります。

一応オブジェクト指向は知識としてはあるのですが、配列とか絡むと一気にワケワカメになります。
しかも何故か配列の絡むプロパティの解説ページが殆どないんですよね。何故でしょうか?
もしかして配列を使う事自体が間違っている?
ま、そんなわけで試行錯誤しながら作ったコードがこちら。
※ついでにRundumをRandomに綴り修正。中学時代の英語の点数は10点台とかでした。

[MainPageViewModel.cs]

using HelloXamarin.Models;
using Prism.Commands;
using Prism.Mvvm;
using Prism.Navigation;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HelloXamarin.ViewModels
{
    public class MainPageViewModel : ViewModelBase
    {
        public MainPageViewModel(INavigationService navigationService) 
            : base (navigationService)
        {
            //進言コマンドボタンが押された際に何をする?
            SingenRandomCommand = new DelegateCommand(RandomCommandGet);
        }

        /// <summary>
        /// 進言コマンドを取得する
        /// </summary>
        private void RandomCommandGet()
        {
            //数字を範囲指定
            RandomData r1;
            r1 = new RandomData(1,3);
            SingenLabel = r1.RandomDataGet();

            //文字列を指定
            //RandomData r2;
            //r2 = new RandomData(new string[] {"藤崎","紐緒","虹野"});
            //SingenLabel = r2.RandomDataGet();

        }
    }
}

[RandomData.cs]

using System;
using System.Collections.Generic;
using System.Text;

namespace HelloXamarin.Models
{
    class RandomData
    {
        List<string> list = new List<string>();

        /// <summary>
        /// コンストラクタ ランダム取得範囲を指定
        /// </summary>
        /// <param name="fast">〇以上</param>
        /// <param name="rast">〇以下</param>
        public RandomData(int fast,int rast)
        {
            for(int i = fast; i <= rast; i++)
            {
                //リストに追加
                list.Add(i.ToString());
            }
        }

        /// <summary>
        /// コンストラクタ ランダム取得範囲を指定 配列要素
        /// </summary>
        /// <param name="s">配列で要素を指定</param>
        public RandomData(string[] s)
        {
            for (int i = 0; i < s.Length; i++)
            {
                //リストに追加
                list.Add(s[i]);
            }
        }

        public string RandomDataGet()
        {
            //シード値を取得(乱数固定化の阻止に必須)
            int seed = Environment.TickCount;
            // Randomクラスのインスタンス生成
            Random rnd = new System.Random();
            // listの数からダンダムで整数を取得
            int i = rnd.Next(0, list.Count);
            // 返答
            return list[i];
        }
    }
}

動くかどうか不安でしたが動いてくれました!
ついでに使ってみたかったオーバーロードも実装。
数字の範囲指定または文字配列指定でランダム化してくれます。
やっぱり配列を使うのは間違ってたようですね。動的配列でやろうと思ったがどうもしっくりこなくて、listを使うべきだと気が付くまでに結構な時間がかかりました。

しかし不安なのがクラスや変数の名称の付け方。な~んかわかりにくい気がする…。
どういう風につければわかりやすいんだろうね。

あ、そうそう。もし文法的に間違ってたら指摘していただけるとほんと助かります。
ではまた!