2

データベースにアクセスするために使用するマネージャークラスがたくさんあります。メソッドにアクセスするには、マネージャーのインスタンスを作成する必要があります。

私は個人的にこれに静的クラスを好むので、このアプローチについてどう思うか知りたいです:

public static class Managers
{
    public static SomeManager Manager
    {
         get { return new SomeManager(); }
    }
}

var stuff = Managers.SomeManager.DoStuff();

欠点はありますか?

4

4 に答える 4

6

これの最大の欠点は、あなたのコードに不慣れな人にとってはわかりにくいことです: 私にとっては、このような呼び出し

Managers.SomeManager.DoStuff();

SomeManagerとは対照的に、何らかの方法で固定されたアクセスを意味します。

new SomeManager().DoStuff();

SomeManagerこれは、オンデマンドで作成されていることを明示的に示しています。

SomeManagerプロパティを適切な名前のメソッド、たとえば に変換すると、MakeSomeManager()可読性が回復します。

Managers.MakeSomeManager().DoStuff();

インスタンス化のプロセスを隠すために、このようなことをしたい場合がありますSomeManager。そのコンストラクターは、持ち歩きたくないいくつかのパラメーターを必要とする場合があります。

于 2013-09-12T12:56:39.270 に答える
4

プロパティが呼び出されるたびに新しいインスタンスを作成しているため、これはシングルトン パターンの不適切な実装です。

これはより良いでしょう:

public static class Managers
{
    private static SomeManager someManagerInstance;

    public static SomeManager Manager
    {
         get
         {
             if (someManagerInstance == null)
             {
                 someManagerInstance = new SomeManager();
             }
             return someManagerInstance;
         }
    }
}

もちろん、毎回新しいインスタンスが必要な場合を除きますか? その場合、プロパティではなくメソッドで作成をラップします。

public static class Managers
{
    public static SomeManager GetNewManager()
    {
         return new SomeManager();
    }
}
于 2013-09-12T12:55:45.250 に答える
0

このような静的クラスとメソッドの使用は悪い習慣であるため、代わりにシングルトンを使用できます。たとえば、実装用の単体テストを作成してみてください...

1)このようなシングルトンクラスを作成します

    public static class Singleton<T>
    where T : class, new()
{
    /// <summary>
    /// The syncRoot.
    /// </summary>
    private static readonly object syncRoot = new object();

    /// <summary>
    /// The instance.
    /// </summary>
    private static volatile T instance;

    /// <summary>
    /// Gets the instance.
    /// </summary>
    public static T Instance
    {
        get
        {
            if (instance == null)
            {
                lock (syncRoot)
                {
                    if (instance == null)
                    {
                        instance = new T();
                    }
                }
            }

            return instance;
        }
    }
}

2)このようにクラスを作成します

public class YourClass
{
    /// <summary>
    ///     Singleton instance of 
    /// </summary>
    public static YourClass Instance
    {
        get { return Singleton<YourClass>.Instance; }
    }
...methods etc...
}

3) コード YourClass.Instance.SomeMethodCall(); からシングルトンを呼び出します。

于 2013-09-12T13:01:54.280 に答える