Nemerle for OOP Programmers Week 1 (3)

続きは明日,とかいいながらずいぶん時間が経ちました.
まぁ,のんびりといきましょう.
前回はNemerleでSingletonってどうするの?って話でした.こんなときはとりあえずC#で実装(^^;;

using System;

namespace ConsoleApplication1
{
  class NameSingleton
  {
    static private string name;
    static public string Name
    {
      get { return name; }
    }

    static private NameSingleton singleton;

    static public NameSingleton GetInstance()
    {
      if (singleton == null)
      {
        singleton = new NameSingleton();
      }
      return singleton;
    }

    private NameSingleton()
    {
      name = "kurip";
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      NameSingleton singleton = NameSingleton.GetInstance();
      Console.WriteLine("Hello, {0}", NameSingleton.Name);
    }
  }
}

まぁ,このプログラム自体がどうなの?って話もありますが,問題はNameSingletonコンストラクタです.それ以外のメソッドは全てstaticだけどここだけインスタンスメソッドですね.Nemerleだとstaticメソッドからインスタンスメソッドを呼べないのでアウトですね.
さて,staticなコンストラクタって作れるんでしょうか?
……自分はこれまで知らなかった(というか,使ったことがないので忘れていた!)のですが,その名もstaticコンストラクタというものがあります.これを使うと

static NameSingleton()
{
  name = "kurip";
}

と書けます(この場合アクセス修飾子を付けるとエラーになる).これを使うとして,GetInstanceメソッドとかは不要なので削除したりすると

namespace ConsoleApplication1
{
  class NameSingleton
  {
    static private string name;
    static public string Name
    {
      get { return name; }
    }

    static NameSingleton()
    {
      name = "kurip";
    }
  }

  class Program
  {
    static void Main(string[] args)
    {
      Console.WriteLine("Hello, {0}", NameSingleton.Name);
    }
  }
}

???
これって誰がみてもSingletonではないよなー.
Singletonはインスタンスがただ1つであることを保証するものであって,インスタンスを作れなくさせることとは違いますよね.
そう考えると,そもそもアプローチの仕方が間違っていたのかもしれないと気がつきました.

  • インスタンスの生成は出来るようにする
  • でもnewによる生成は出来ないようにする(複数生成されるのは避けたい)
  • staticメソッドで生成させる
  • でもstaticメソッドではnewによるインスタンス生成はできない
  • staticコンストラクタは使える
  • staticメソッドによるインスタンス生成は不要だから削除
  • でもこれってSingleton?
  • 最初にもどる

この無限ループのどこかに致命的なバグが含まれているようです.たぶん,もっと別のやり方で実現させるのでしょうね.とりあえず今は手持ちがないので,Nemerleに戻ろうと思います