1

n 型のデータを受け取り、データの計算に基づいて値を返す Calculator クラスがあります。Main クラスでデータを生成していますが、Calculator クラスの設計方法について 2 つのオプションに直面しています。

最初のオプション:

public class Main 
{
    Dictionary<DataType, Calculator> dataTypeToCalculator = new Dictionary<DataType, Calculator>()
    void RecordResult(Data data) 
    {
        Calculator calculator = dataTypeToCalculator[data.DataType]; //assume this exists
        int result = calculator.Calculate(data);
        StoreResult(result); //pretend this is implemented, it stores the result somewhere in Main object
    }
}

public class Calculator 
{
    int field1 = 1;
    int field2 = 2;
    int Calculate(Data data) 
    {
        return data.Value + field1 + field2;
    }
}

2 番目のオプション:

public class Main 
{
    Calculator calculator = new Calculator();
    void RecordResult(Data data) 
    {
        calculator.Calculate(data);
    }
}

public class Calculator 
    {
    Dictionary<DataType, int> dataTypeToField1 = new Dictionary<DataType, int>();
    Dictionary<DataType, int> dataTypeToField2 = new Dictionary<DataType, int>();
    void Calculate(Data data) 
    {
        int field1 = dataTypeToField1[data.DataType];
        int field2 = dataTypeToField2[data.DataType];
        return data.Value + field1 + field2;
    }
}

内部フィールドを持たないいくつかのクリーンなクラスがあり、インスタンスを 1 つ持つことができ、Main クラスから Data を渡すだけで、さまざまな DataTypes を処理できます。ただし、複数の必要なフィールドを持つ他のクラスがあり、それぞれの内部辞書を作成するのは悪いようです。この種の状況に対する標準的な「ベスト プラクティス」はありますか? この例では、Calculator がすべての計算タスクをカプセル化し、Main クラスに依存してデータを分離する必要がないようにしたいと考えています。ただし、クラスに多くのフィールドがある場合、これは私には正しくないようです。

4

1 に答える 1

1

あなたのケースは本当に具体的なものなので、あなたの問題に合った「ベストプラクティス」はないと思います。Single Responsibility Principle (SRP)幸いなことに、原則の中から私のお気に入りの一般原則がありますSOLID

私があなたのケースを正しく理解していれば、次のようになります。

  • Calculator計算を担当する
  • FactoryCalculatorインスタンスの作成を担当
  • Configurationのデータを含むCalculators
  • Repositoryデータの永続化を担当

したがって、特定の機能を担当する個別のクラスを作成することをお勧めします: Calculator、CalculatorFactory、CalculatorConfiguration、CalculationResultsRepository など。

複数の責任を持つクラスを作成すると、通常、コードの管理、テスト、および将来の開発が困難になります。

于 2013-04-09T21:05:44.187 に答える