web-dev-qa-db-ja.com

既存のクラスに数千の既存の行がある場合でも、新しいフィールドと論理エンティティの操作が単一のクラスにある場合

レガシーJavaプロジェクトでは、新しい機能を追加するときに、既存の電子メールフィールドをその親システムに基づいて編集可能または編集不可にすることができました。開発者は新しいクラスを追加して新しい機能を追加しました。フィールドの編集可能性を決定するロジックは簡単ではないため、これは、数千行を含む既存のクラスにインスタンスフィールドとして追加されます。

ただし、あるコードレビューアは、論理エンティティのすべてのフィールドと操作は単一のクラスで表す必要があるとコメントしました。

質問:論理エンティティのすべてのフィールドと操作は、単一のクラスがすでに数千行を持っている場合でも、単一のクラスで表す必要があります

3
Rui

新しいクラスが適切な抽象化を独自に定義し、責任を独自に定義する場合、この新しいクラスを導入することはおそらく良いアイデアです。

ただし、新しいクラスが既存のクラスへの醜い循環依存関係でのみ実装でき、既存のクラスのLOCの数を現在のサイズに維持するのが人為的な試みである場合、新しいクラスは、多くの意味。

それでも、リファクタリングによって少なくともいくつかの改善の機会を探すのは良い考えかもしれません。私はいつも「ボーイスカウトの原則」を適用しようとしました。コードを以前よりもクリーンな状態にしておくことです。

上記のコメントで、1つの(public?)メソッドEmailFieldのみを含む新しいクラスisEditableについて言及しました。一見すると、それは抽象化のように思えます。ただし、EmailFieldは既存のクラスAに直接依存しないでください(コンストラクターでタイプAのオブジェクトを取得するなど)。単純な型の明示的なパラメーター、またはコールバック、またはコンストラクターパラメーターのインターフェイス型のいずれかが必要です。これにより、Aとは別に、EmailFieldを個別に単体テストできます。

1
Doc Brown

ただし、あるコードレビューアは、論理エンティティのすべてのフィールドと操作は単一のクラスで表す必要があるとコメントしました。

エンティティは多くのサブシステムで構成されている可能性があり、各サブシステムは独自のタイプとして存在する必要があります-notはすべて1つのクラスで処理される必要があります。


Personには名前があり、名前を変更する機能があります。ただし、雇用を検索する機能も必要になる場合があります。

すべての雇用プロパティをPersonクラスに押し込むと、人が必要とする可能性のある他の責任があるため、Personクラスの維持が難しくなります。


コードは責任の観点から考える必要があります。雇用を見つける能力が必要な場合は、そのタイプを作成します。

そこから、誰が責任を構成するかを決定できます。

2
Vince Emigh

はい。

これは 沈下したコストの誤り に似ています。新しい小さなクラスを作成することは、新しいフィールドを追加することよりもはるかに手間がかからず、コードの柔軟性とテスト性と保守性の向上に役立ちます。理想的な世界では、何千もの行クラスを分割することもできます。

実際的な問題は、フィールドをジャイアントクラスに追加することを意味するかもしれませんが、少なくとも状況を悪化させていることを認識して、そのトレードオフを行う必要があります。

2
Telastyn