【C#】FizzBuzz問題を考えてみました。
2019-10-10
2020-02-28
有名なFizzBuzz問題を考えてみました。
■ルール
・1から100まで表示
・3で割り切れる数字は『Fizz』と表示
・5で割り切れる数字は『Buzz』と表示
・3でも5でも割り切れる数字は『FizzBuzz』と表示
今回は最近仕事でよく使っているC#で書いてみました。
とりあえず動くことを優先させて何も考えず書いたら以下のようになりました。
using System; namespace FizzBuzz { class Program { static void Main(string[] args) { for (int i = 1; i <= 100; i++) { if (i % 3 == 0 && i % 5 == 0) { Console.WriteLine("FizzBuzz"); } else if (i % 3 == 0) { Console.WriteLine("Fizz"); } else if (i % 5 == 0) { Console.WriteLine("Buzz"); } else { Console.WriteLine(i); } } } } }
実行結果
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
・・・(省略)
実行結果も問題なく動いています。おそらくFizzBuzz問題をググってみたらこんな感じのコードになるのではないでしょうか?
しかし上記コードはまだリファクタリングの余地があると思います。ということでここからさらに改良してみました。
リファクタリング
改良点
・ロジックはメソッドに切り出す
・for文よりforeachにしたほうが1から100までというのが分かりやすい気がした(個人の好み)
・変数名を修正(i→currentNumなど)
・メソッドコメントを記載
ということで以下のようにリファクタリングをしてみました。
using System; using System.Linq; namespace FizzBuzz { class Program { static void Main(string[] args) { foreach (int currentNum in Enumerable.Range(1,100)) { if (FizzBuzz(currentNum)) { ConsoleDisplay("FizzBuzz"); } else if (Fizz(currentNum)) { ConsoleDisplay("Fizz"); } else if (Buzz(currentNum)) { ConsoleDisplay("Buzz"); } else { ConsoleDisplay(currentNum.ToString()); } } } // 3で割り切れるか判定 private static bool Fizz(int currentNum) { return currentNum % 3 == 0; } // 5で割り切れるか判定 private static bool Buzz(int currentNum) { return currentNum % 5 == 0; } // 15で割り切れるか判定 private static bool FizzBuzz(int currentNum) { return currentNum % 15 == 0; } // コンソールに表示 private static void ConsoleDisplay(string value) { Console.WriteLine(value); } } }
今回は書いていませんが、テストコードも書きやすくなったと思います。
ただFizzBuzzくらいのロジックであれば、リファクタリング前の方が見やすいかもしれないですね…。でももし仕事で書くとしたら先のことを考えてリファクタリング後のように書くと思います。
関連記事
仕事が遅いプログラマーを観察してみる
未経験プログラマー物語【第二章 研修編③】先輩に顔を売る
Microsoft OfficeでOffice365とかPersonalとかあってよくわからない人向けに簡単にまとめました
『プログラミング言語図鑑』を読んで
会社に対する優しさはほどほどにという話
完全に準備不足でAtCoder(AtCoder Beginner Contest 154)に敗北しました。
VirtualBoxをインストールしてCentOS7環境を構築・前編
AWSのMFA認証コードがわからなくなってしまいました
VBAでひどいコードに出会った
『アップルのデザイン ジョブズは”究極”をどう生み出したのか』を読みました