0

ロジックの2つの層の間で適応する必要がある静的クラスManagerがあります。静的クラスをその中にネストして機能を分割するのは悪い習慣ですか?私には、それぞれ2〜3の機能で管理する約20の異なる科目があります。このために2ダースのクラスを作成することは避けたいと思います

私はこれを使うことを意味します:

static class Manager
{
    static class Type1
    {
        static void Method1();
        static void Method2();
        static void Method3(); 
    }
    static class Type2
    {
        static void Method4();
        static void Method5();
        static void Method6(); 
    }
    static class Type3
    {
        static void Method7();
        static void Method8();
        static void Method9();
    }
}

それ以外の:

static class Manager
{
        static void Method1();
        static void Method2();
        static void Method3(); 
        static void Method4();
        static void Method5();
        static void Method6(); 
        static void Method7();
        static void Method8();
        static void Method9();
}

名前空間のようなものですが、クラス内にあります。

4

2 に答える 2

1

デザインの選択については、いくつかのオプションがあります。

まず、デバッグが非常に難しく、いくつかの責任が混在する単一のクラスにすべてを注ぐことができます。

第二に、あなたが指摘したように、ネストされたクラスを作成できます。ここでは、懸念/コードをより適切に分離できますが、すべてがハードコードされ、1 つの大きなソースコード ファイルに含まれています。

3つ目は、はるかに拡張性が高く、任意のコンテナー パターンを検討できます。クラスを分離し、必要に応じてより簡単にテストできるようにし、スワップ可能にするものを以下にリストしました。

interface IManagementRole 
{
}

class Dummy1: IManagementRole
{
    public void Method1() { Console.WriteLine("Dummy1.Method1()"); }
    public void Method2() { Console.WriteLine("Dummy1.Method2()"); }
}

class Dummy2: IManagementRole
{
    public void Method3() { Console.WriteLine("Dummy2.Method3()"); }
    public void Method4() { Console.WriteLine("Dummy2.Method4()"); }
}

static class Manager
{
    private static Dictionary<Type, IManagementRole> myTypes = new Dictionary<Type, IManagementRole>();

    static Manager()
    {
        myTypes.Add(typeof(Dummy1), new Dummy1());
        myTypes.Add(typeof(Dummy2), new Dummy2());
    }

    public static T GetManagableType<T>() where T: class
    {
        if (myTypes.ContainsKey(typeof(T)))
        {
            return myTypes[typeof(T)] as T;
        }

        throw new ArgumentException("Type is not a managable type.", "T");
    }
}

class Program
{
    public static void Main(string[] args)
    {
        Manager.GetManagableType<Dummy1>().Method1();
        Manager.GetManagableType<Dummy1>().Method2();
        Manager.GetManagableType<Dummy2>().Method3();

        Console.Write("Press any key to continue . . . ");
        Console.ReadKey(true);
    }
}
于 2012-04-19T07:36:35.760 に答える
0

はい、そうです。悪いデザインではないようです、imo。

これを行う別の方法も検討してください。

あなたは持つことができますList<Type> list = bew List<Type>{new Type1(), new Type2()..., new TypeN()};

このコレクションからインジェクションに適したクラスを選択するクラスがあります。このようにして、大きなクラスを持つことを避けます。

于 2012-04-19T07:29:18.150 に答える