【C#】FizzBuzz問題を考えてみました。

有名な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くらいのロジックであれば、リファクタリング前の方が見やすいかもしれないですね…。でももし仕事で書くとしたら先のことを考えてリファクタリング後のように書くと思います。

soon
  • soon
  • 1986年生まれのjavaプログラマー。28歳の時に7年働いた販売士からプログラマーに転職をする。常駐先を転々としながら日々生きています。