2011年1月1日土曜日

プログラム言語で書初めしてみた。

皆さん。明けましておめでとうございます。

今日はお正月らしく、書初めをしようと思います。しかし、書初めと言っても半紙とか硯とか筆とか持っていないので、プログラマらしく「無いなら実装すれば良い」とのスタンスで、プログラムで書初めをします。

使用する言語はC#。それでは書初めスタート!!

※遊びでやってるので、ところどころ変な実装や設計があっても大目に見てください。

■美しい実装は美しい設計から

いくらビールを飲みながらとはいえ、いきなりコーディングを開始するほどわたしも愚かではありません。まずは設計です。クラス図をきちんと書いてから、実装を始めましょう。

書初めは日本の伝統的な行事であります。したがって、クラス図も日本のソフトウェア業界における伝統的なツールである、「Excel方眼紙」に書くとしましょう。


Excel方眼紙の枠線が邪魔なので、これも消しちゃいましょう。


オプションの「枠線」のチェックボックスを外すと、枠線が消えます。もうお馴染みですよね。

そうして出来上がったクラス図が下記の通りです。



硯も実装しようと思ったのですが、「墨をする」という振る舞いをどう実装するか悩んだ結果、面倒なのでやめました。まあ、お正月のお遊びですから、簡単で良いでしょう。

クラス図ができあがったところで早速実装です。

■いよいよ実装!!

まずは筆クラスから始めましょう。
こんな感じになりました。

namespace ConsoleApplication1
{
    public class Fude
    {

        private enum FudeStatus {ExistInk, NoneInk}

        private FudeStatus _status = FudeStatus.NoneInk;

        public void InkApplied()
        {
            _status = FudeStatus.ExistInk;
        }

        public bool IsInk()
        {
            return _status == FudeStatus.ExistInk;
        }
    }
}

最初の列挙型「FudeStatus」は筆に墨がついているかどうかの状態を表現するために作りました。そして「_status」が筆の状態です。

InkApplied()」が筆にすみをつけるという振る舞い。「IsInk()」は筆に墨がついているかを検査するメソッドです。

さてさて、続いては半紙クラス。

namespace ConsoleApplication1
{
    public class Hanshi
    {
        private string _writtenString = string.Empty;

        public void WriteString(Fude f, string s)
        {
            if (!f.IsInk())
            {
                throw new NoInkException();
            }

            _writtenString = s;
        }

        public string GetWrittenString()
        {
            return _writtenString;
        }

    }
}

「_wittenString」は半紙に書かれている文字を表現する属性。「WriteString()」で筆を使って文字を書きます。筆に墨がついていないと文字が書けないので、筆クラスのIsInk()がFalseを返した場合はエラーとしましょう。Exceptionの派生クラスであるNoInkExceptionを実装し、それをThrowすることにします。

「GetWrittenString()」で何が書かれているかのお披露目です。

そして最後にわたしこと粕谷クラスの実装です。

namespace ConsoleApplication1
{
    public static class Kasuya
    {

        public static Hanshi Kakizome()
        {
            Fude f = new Fude();
            Hanshi h = new Hanshi();

            f.InkApplied();

            h.WriteString(f, "一富士二鷹三茄子");

            return h;
        }

    }
}

わたしは今年一年も永続的に元気でいたいので、そういう思いを込めてstaticで実装しました(笑)。
「Kakizome()」で書初めをして半紙クラスを返します。筆と半紙を用意(インスタンス生成)し、筆に墨をつけて書初めをします。

あとはわたしの振る舞いをMain()に書いて実行しましょう!

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Hanshi h = Kasuya.Kakizome();

            Console.WriteLine(h.GetWrittenString());
        }
    }
}

みごと、書初め完了です!!


皆さん、今年もよろしくお願いします。

0 件のコメント:

コメントを投稿