全知全能を目指す人のありがたい雑記

何かしら意味のあるありがた~い話か、意味のない雑念だらけの日記を書く予定です。

【パワー系PG】変数を連番で命名はNG!配列やコレクションを使おう

あなたのプログラム、「変数を連番で命名」してませんか?

まさかいないとは信じたいけれど。。

けれども、
某質問サイトのユーザーから頂いたコードを拝見した結果…
存在した。存在してしまった!
(しかも意外に多い…)

先輩や知人、友人等に教わる人がいなかったのだろう。
少し可哀想だと思い、記事を作った。

変数を連番で命名しちゃっている方は、
今からでも遅くない!
しっかり覚えて、修正していこう。

今回は「五十音を取り扱うプログラム」を題材にした。

以下を出力するプログラム

あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
やゆよ
らりるれろ
わおん

コレクション(List等)を使いたいので書きやすいC#で書きます。

まず駄目コードから。

パワー系PGのコード

using System;

public class GojuonProgram{
    public static void Main()
    {
        string value1;
        string value2;
        string value3;
        string value4;
        string value5;
        string value6;
        string value7;
        string value8;
        string value9;
        string value10;
        
        value1 = "あいうえお";
        value2 = "かきくけこ";
        value3 = "さしすせそ";
        value4 = "たちつてと";
        value5 = "なにぬねの";
        value6 = "はひふへほ";
        value7 = "まみむめも";
        value8 = "やゆよ";
        value9 = "らりるれろ";
        value10 = "わおん";
        
        Console.WriteLine(value1);
        Console.WriteLine(value2);
        Console.WriteLine(value3);
        Console.WriteLine(value4);
        Console.WriteLine(value5);
        Console.WriteLine(value6);
        Console.WriteLine(value7);
        Console.WriteLine(value8);
        Console.WriteLine(value9);
        Console.WriteLine(value10);
    }
}

パワーを感じるぞ。。
書くの疲れた。。

突っ込みたいのは何点か

  • valueが何なのか変数名だけ見てるとわからん
  • や行を「やいゆえよ」にしたいとき変数を一々上から見ていかないといけない

とか、色々ある。
はい、じゃあ配列を使おう。

配列を使った実装

using System;

public class GojuonProgram{
    public static void Main()
    {
        string[] gojuon = new string[]
        {
            "あいうえお",
            "かきくけこ",
            "さしすせそ",
            "たちつてと",
            "なにぬねの",
            "はひふへほ",
            "まみむめも",
            "やゆよ",
            "らりるれろ",
            "わをん"
        };
        
        for(int line = 0; line < gojuon.Length; ++line)
        {
            Console.WriteLine(gojuon[line]);
        }
    }
}

大分楽になったね。
これならやゆよはgojuonっていう配列1個を修正すればいいってすぐに分かる。

個人的には配列の要素0が「あ行」、要素1が「か行」って言う
作りがあんまり直感的じゃなくて嫌だなぁと思ってる。

コレクション(List)を使った実装

using System;
using System.Collections.Generic;

public class GojuonProgram{
    public static void Main()
    {
        List<string> gojuon = new List<string>
        {
            "あいうえお",
            "かきくけこ",
            "さしすせそ",
            "たちつてと",
            "なにぬねの",
            "はひふへほ",
            "まみむめも",
            "やゆよ",
            "らりるれろ",
            "わをん"
        };
        
        foreach(var line in gojuon)
        {
            Console.WriteLine(line);
        }
    }
}

配列と似たような作りに見えるね。

ただ、配列とリストは似ているようで、ぜんぜん違う。
データの構造が違う。

↓が参考になるかな。
qiita.com

大雑把に言うと
配列は要素数が固定。
リストは要素数が可変。

今回のプログラムでは
gojuonというデータに対して
"きゃきゅきょ"や"しゃしゅしょ"、"ちゃちゅちょ"なども
追加する想定であれば、リストを使うべき。

そうでなければ、
ランダムアクセスが早い(=処理速度に影響する)ので、
配列を使うべき。

↑に書いたとおり、
配列の要素数は「固定」なので、
宣言時にしか要素数を指定できない。

配列を大きさの違う配列に移すことは可能だが、
頻繁に移すようならコレクションを使おう。

あと、C#のクラスだが、自分ならDictionaryを使いたい。

コレクション(Dictionary)を使った実装(とLINQを少々。。)

using System;
using System.Collections.Generic;
using System.Linq;

public class GojuonProgram{
    public static void Main(){
        Dictionary<string, string> gojuon = new Dictionary<string, string>();
        
        gojuon.Add("あ行","あいうえお");
        gojuon.Add("か行","かきくけこ");
        gojuon.Add("さ行","さしすせそ");
        gojuon.Add("た行","たちつてと");
        gojuon.Add("な行","なにぬねの");
        gojuon.Add("は行","はひふへほ");
        gojuon.Add("ま行","まみむめも");
        gojuon.Add("や行","やゆよ");
        gojuon.Add("ら行","らりるれろ");
        gojuon.Add("わ行","わをん");
        
        Console.WriteLine("******キーと値を交互出力******");
        foreach(var line in gojuon)
        {
            Console.WriteLine(line.Key);
            Console.WriteLine(line.Value);
        }
        
        Console.WriteLine("******キーを元に値を表示******");
        Console.WriteLine(gojuon["さ行"]); //さ行の文字列がほしい!
        Console.WriteLine(gojuon["わ行"]); 
        
        Console.WriteLine("******五十音の中で文字列のサイズが5の行を抽出し出力******");
        foreach(var line in gojuon.Values.Where(v => v.Length == 5))
        {
            Console.WriteLine(line);
        }
        
        
    }
}

出力

******キーと値を交互出力******
あ行
あいうえお
か行
かきくけこ
さ行
さしすせそ
た行
たちつてと
な行
なにぬねの
は行
はひふへほ
ま行
まみむめも
や行
やゆよ
ら行
らりるれろ
わ行
わをん
******キーを元に値を表示******
さしすせそ
わをん
******五十音の中で文字列のサイズが5の行を抽出し出力******
あいうえお
かきくけこ
さしすせそ
たちつてと
なにぬねの
はひふへほ
まみむめも
らりるれろ

便利な機能は逐次利用していこう。

まとめ

  • 変数を連番に命名するようなら
  • 似たような意味を持つ変数を使っているようなら

配列やコレクションを利用しよう。