0

デザインの質問があります。私は誰かが書いたコード化されたUIテストフレームワークを使って作業していて、私はそれを維持しています。私はこれが間違って設計されている方法を確信していますが、私は他の意見を得るだろうと思いました。これは基本的に、他のオブジェクトを作成して返すことを唯一の目的とする大きな静的クラスです。

良い/悪い...なぜですか?私はかなり重要なリファクタリングを行うようロビー活動を行っており、私のケースを上司に納得のいくように喜ばせたいと思っています。

public static class ParentClass
{
    private static ChildClass1 childClass1;
    private static ChildClass2 childClass2;
    // 10+ more of the same

    // Properties
    public ChildClass1 ChildClass1
    {
        get 
        {
            if (childClass1 == null)
            {
                childClass1 = new ChildClass1();
            }
            return childClass1;
        }
     }

    public ChildClass2 ChildClass2
    {
        get 
        {
            if (childClass2 == null)
            {
                childClass2 = new ChildClass2();
            }
            return childClass2;
        }
    }
    // 10+ more of the same
}



[TestClass]
public class TestClass1
{
    [TestMethod]
    public void TestMethod1()
    {
        var x = ParentClass.ChildClass1.SomeMethod();
        Assert.IsNotNull(x);
    }

    [TestMethod]
    public void TestMethod2()
    {
        var x = ParentClass.ChildClass2.SomeMethod();
        Assert.IsNotNull(x);
    }

    // 10+ more of the same
}
4

4 に答える 4

1

これはシングルトンパターンのようなものですが、提供されたコードから、なぜこのように設計されているのかは明らかになりません。

var x = ParentClass.ChildClass1.SomeMethod();

簡単に置き換えることができます

var x = new ChildClass1().SomeMethod();

次に、何度も使用され、メソッド呼び出しからメソッド呼び出しに状態を伝達ParentClass.ChildClass1ParentClass.childClass1ない限り、を取り除くことができます。ParentClass.ChildClass1

しかし、これは実際にはエレガントに見えず、過度に冗長になる可能性がありますが、これを大きな問題とは見なしません。

個人的にはこの方法で実装したと思いますが、省略されたすべてのコードでこれが機能するかどうかを判断するのは困難です。

[TestClass]
public class TestClass1
{
    private static void ExecuteTestCore<T>() where T : new(), IHaveAMethod
    {
        var x = new T().SomeMethod();

        Assert.IsNotNull(x);
    }

    [TestMethod]
    public void TestMethod1()
    {
        TestClass1.ExecuteTestCore<ChildClass1>();
    }

    [TestMethod]
    public void TestMethod2()
    {
        TestClass1.ExecuteTestCore<ChildClass2>();
    }

    // 10+ more of the same.
}

internal interface IHaveAMethod
{
    void SomeMethod();
}
于 2012-12-13T02:15:43.207 に答える
0

これが「良い」か「悪い」かは、使い方がわからないとわかりませんが、IoCコンテナを検討することをお勧めします。これらは、このタイプの機能と、箱から出してすぐに使用できる機能を提供します。

一般に、IoCコンテナーは、依存性注入の一部として使用すると非常に便利です。DIを使用していない場合、この静的クラスはおそらくあまり役​​に立ちません

https://stackoverflow.com/questions/2515124/whats-the-simplest-ioc-container-for-c

于 2012-12-13T02:12:03.107 に答える
0

私が見ることができるのは、このクラスが「シングルトンコンテナ」であるということです。これで問題ないと思います。それを行うためのより良い方法が存在する場合は?使用状況にもよると思います。

便利なリンク: SingletonPattern ObjectFactory

于 2012-12-13T02:13:50.500 に答える
0

IoCをスーツに提案するのに苦労している場合(他の人が提案しているように)..おそらく彼らに小さなコードを見せますか?

public class ParentClass<T> where T : class, new() {
    private static T _instance = null;
    private static readonly object _locker = new object();

    public static T GetObject() {
        if (_instance == null) {
            lock (_locker) {
                if (_instance == null) {
                    return new T();
                }
                return _instance;
            }
        }
    }
}

(免責事項:テストされていません。おそらく、スレッドセーフな実装としても最適ではありません)

また:現状の設計は維持するのが難しいです..そしてDRY違反の痕跡。

于 2012-12-13T02:15:50.407 に答える