メルマガ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にはほど遠いが、まぁ、楽しみながらやっていこう。