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