2012-03-07 32 views
2

AbstractAgentという抽象クラスがあり、現在このクラスを拡張している27のクラスがあります。Java継承または静的メソッド

私はいくつかのエージェントの開発を開始しており、私の5人のエージェントはすべてAbstractAgentクラスを拡張しています。

今私は、5つのエージェントすべてにコピー貼り付けをしているgetFilePath()があることを知りました。それから、私は、既存の27のクラスの中にも、このメソッドを持つクラスがたくさんあることに気付きました。このメソッドを基底クラスAbstractAgentに配置し、誰もがこのメソッドを使用できるようにすることをお勧めします。しかし、私は自分のコードを変更するすべての既存のクラスを望んでいない私は誰もそれを使用することができるようにメソッド名を変更しました。

私のコードレビューをした人は、既に既存のクライアントによって使用されているので、AbstractAgentクラスに触れないように勧めました。このメソッドは、いくつかのユーティリティクラスです。

私は彼の議論では納得できません。誰もが自分の思考に投げたい。

+1

imho、それは貧弱な議論です。私はリファクタリングをサポートしています。 –

答えて

3

getFilePath()のメソッドがAbstractAgentのすべてのサブクラスでまったく同じ場合は、すべての方法で抽象クラス(IDEのリファクタリングツールを使用)にプルし、サブクラスから削除してユニットを実行しますテスト(あなたを行うユニットテストがありますか?)すべてが正常に動作していることを確認してください。

getFilePath()一部実装の違いがありますが、それらのほとんどが同一である場合、それは、抽象クラスに最も一般的な実装を引き上げ、それを使用するサブクラスからそれを削除して上書きするのは良い考えです実装が異なる場合のサブクラスのメソッド

ここで、メソッドのさまざまな実装間のバラツキが大きすぎる場合は、コードベースを変更しないでください。

ユーティリティクラス(たとえば、FileUtil)で静的メソッドを定義するのは、メソッドがエージェントクラスの機能に直接関係しない場合、またはメソッドがオブジェクトの他の部分で使用できるエージェントに直接関連していない。

+0

getFilePath()メソッドの機能はすべてのクラスで同じです – user977263

3

親クラスに共通ロジックを追加することは、抽象クラスの強力な側面の1つです。このような追加は、順方向互換の変更です。もちろん、あなたはこのクラスのいくつかの使い方について知らず、新たに追加されたメソッドも同じ名前を持っています。しかし、それでもサブクラスがそのようなメソッドを上書きすると、それ自身のメソッドが呼び出されるため、それでも順方向互換性があります。

+0

意味があります。これは私の思考とインラインである。 – user977263

+0

一般的に該当しません。オーバーロードの問題は簡単に問題になり、互換性を損なう可能性があります。「関数を追加して申し訳ありませんが、コードが間違った関数を呼び出しています」というのは、ライブラリのクライアントと友だちをする素晴らしい方法です。 – Voo

+0

+1 。オーバーロードされたメソッドを追加しても、下位互換性は損なわれません。最悪のシナリオでは、別の名前を付けてしまいます。***間違いなく、***は後方互換性を損なうものではありません。 – Perception

5
この場合

AbstractAgentクラスがすでに他のクラスによって使用されているので、あなたは、このメソッドを実装し、自分自身にませすべてのクラスを述べたように、あなたは確かにAbstractAgentを変更しないでください。しかしAbstractAgentをsay AbstractAgentWithFilePathという別の抽象サブクラスに拡張することができます。このサブクラスでは、追加のメソッドを宣言してから、代わりにAbstractAgentWithFilePathクラスを拡張します。

+0

これは良い解決策ですが、1つだけのクラス階層をもう1つ作成してください方法は私には意味がありません。 AbstractAgentは何か標準であり、誰もがこのクラスを拡張しています。 AbstractAgentWithFilePathを使用するように尋ねるのは少し難しいです。しかし、論理的にはあなたは正しいです。 – user977263

+1

私は、おそらく重要ではないユーティリティメソッドに基づいて、階層内に新しいクラスを導入したことで彼が批判されるかもしれないことを除いて、私はこれを好きです。しかたがない。 –

0

メソッドがエージェントクラスと密接に関連している場合は、抽象クラス内に配置するのは良いオプションですが、そうでない場合は、ファイル関連のすべてのアクションを処理する別のユーティリティクラスに入れてください。

0

ここに正解はありません。あなた、あなたの同僚、あなたの会社だけが、どのように、どこでAbstractAgentが使用されているのか、それをどのように変えてさまざまなチーム、部門、または顧客に影響を与えるのかを知っています。コードをどこに配置するかについての決定は、「クリーンルーム」の設計選択よりも、しばしば政治的、社会的です。

純粋なコードの観点から、私は根本的なリファクタリングをサポートしています.ActiveAgentのすべてのサブクラスで重複コードをすべて削除し、AbstractAgentの新しいgetFilePath()にすべてのメンバを移動します。

しかし、あなたはこれを行う権限を持っておらず、プッシュバックを受けるかもしれません。または、おそらくgetFilePath()が(あなたはこれについてはっきりしていなかった)若干時々変化します。その場合、あなたの選択肢は妥協のようです。あなたのコードレビュー担当者は、コードの再利用が不完全であるという問題を明らかにし、スーパークラスを一時的な回避策で "汚染"しているように見えるので、AbstractAgentのgetFilePath2()に対してプッシュバックしている可能性があります。スーパークラスの本当に共通の共有コードを使用しています。知るか。

おそらく、完全なリファクタリングを実行できるようになるまでは、静的ユーティリティメソッドが適しています。

関連する問題