3 つの可能な設計があり、どれが優れているか、どの場合に優れているかを判断しようとしています。すべての設計の一般的な考え方は、データを格納するデータ オブジェクトと、データを分析するアナライザー オブジェクトがあるということです。
これらのデザインから選択する必要がありますが、デザイン 2 が一番気に入っています。しかし、私が一緒に働いている開発者は、私が最悪だと思うデザイン 3 を推し進めています。どのデザインにも欠けている長所や短所はありますか? 説明が必要な場合はお知らせください。
デザイン1
設計 1 では、DataAnalyzer には、構築中に提供される Data オブジェクトがあります。クライアントが呼び出すときdataAnalyzer.analyze()
、データが分析されます。この設計では、各オブジェクトの責任は明確です。Data オブジェクトは単にデータを保持し、DataAnalyzer オブジェクトはデータを分析します。格納されたデータを変更すると Data クラスのみが変更され、分析メソッドの種類を追加すると DataAnalyzer クラスのみが変更されます。この設計の問題点の 1 つは、DataAnalyzer オブジェクトは構築中に渡された Data オブジェクトにしか使用できないため、データ オブジェクトが多数ある場合は、多数の DataAnalyzer を作成する必要があることです。もう 1 つの欠点 (設計 3 から明らかになります) は、クライアントが 1 つではなく 2 つのクラスについて知る必要があることです。Data に関連するクラスが他にもある場合、クライアントはこれらすべてのクラスを処理する必要があります。
デザイン 2
設計 2 は設計 1 と非常に似ていますが、DataAnalyzer が (異なるデータ オブジェクトに対して) 再利用可能になったことを除きます。クライアントは、設計 3 のように 1 つではなく、2 つのクラスで作業する必要があります。責任は依然として非常に明確であり、保守は簡単です。
デザイン3
設計 3 では、クライアントは 1 つのオブジェクトで作業できます。クライアントはdata.analyze()
、DataAnalyzer について何も知らなくても、何も言うことができません。これが単一責任規則に違反しているかどうかはわかりません。Data オブジェクトには分析を可能にするインターフェースがありますが、責任は実際には DataAnalyzer に委譲されています。もう 1 つの問題は、データを分析する必要があるかどうかに関係なく、作成されたすべてのデータ オブジェクトに対して DataAnalyzer が作成されることです。さらに機能が追加されれば、多くのことが変わるでしょう。DataPrinter クラスが作成された場合 (これは、データにデータ自体を印刷させるよりも優れていると仮定しましょう)、クライアントは dataPrinter オブジェクトの作成と の呼び出しについて心配する必要はなく、dataPrinter.printData()
単に呼び出すことができます。data.print()
. ただし、このクラスを追加することで、Data のインターフェイスを変更する必要がありました。DataXX クラスのいずれかにメソッドを追加すると、メソッドが Data クラスに追加されます。