【パワー系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の行を抽出し出力****** あいうえお かきくけこ さしすせそ たちつてと なにぬねの はひふへほ まみむめも らりるれろ
便利な機能は逐次利用していこう。