なか日記

一度きりの人生、楽しく生きよう。

C#プログラミングレッスン−どう書く?org編「バイナリクロック」

メルマガC#プログラミングレッスンで、どう書く?orgの「バイナリクロック」が紹介されてたのでやってみた。


テストコード
実時間ではテストが書きにくいので、自分が設定した時間を返すクラス(FakeTime)を使って、
実際に使う時には実時間を返すクラス(RealTime)を使用することにする。

    [TestFixture]
    class No275
    {
        [Test]
        public void 時刻取得()
        {
            var time = new FakeTime("20:18");
            Assert.AreEqual(20, time.Hour);
            Assert.AreEqual(18, time.Minute);
        }

        [Test]
        public void 二進数を四角で表現する()
        {
            var clock = new BinaryClock(new FakeTime("20:18"));
            Assert.AreEqual(" ■□■□□", clock.Hour);
            Assert.AreEqual(" ■□□■□", clock.Minute);

            clock = new BinaryClock(new FakeTime("23:48"));
            Assert.AreEqual(" ■□■■■", clock.Hour);
            Assert.AreEqual("■■□□□□", clock.Minute);
        }

        [Test]
        public void 実時間で表示_テストじゃないし()
        {
            var clock = new BinaryClock(new RealTime());
            Console.WriteLine(clock.Hour);
            Console.WriteLine(clock.Minute);
        }
    }

テストじゃない物も含まれているけど気にしない気にしない。

で、実装コード

    internal class BinaryClock
    {
        private readonly ITime _time;

        public BinaryClock(ITime time)
        {
            _time = time;
        }

        public string Hour
        {
            get { return ToBox(_time.Hour); }
        }

        public string Minute
        {
            get { return ToBox(_time.Minute); }
        }

        private static string ToBox(int num)
        {
            return Convert.ToString(num, 2).Replace("0", "□").Replace("1", "■").PadLeft(6, ' ');
        }
    }

    internal interface ITime
    {
        int Hour { get; }
        int Minute { get; }
    }

    internal class RealTime : ITime
    {
        public int Hour
        {
            get { return DateTime.Now.Hour; }
        }

        public int Minute
        {
            get { return DateTime.Now.Minute; }
        }
    }

    internal class FakeTime : ITime
    {
        private readonly string _time;

        public FakeTime(string time)
        {
            _time = time;
        }

        public int Hour
        {
            get { return int.Parse(_time.Split(':')[0]); }
        }

        public int Minute
        {
            get { return int.Parse(_time.Split(':')[1]); }
        }
    }

BinaryClockクラスから、RealTime、FakeTimeを意識しないようにインタフェース(ITime)を作成した。
まぁ、そんなもん

TDDにはほど遠いが、まぁ、楽しみながらやっていこう。