2016-09-21 12 views
0

次のコードが正しいかどうか確認してください。実際には、私は誘導コードに似たものがあることを知っていて、Open/Closedの原則と一致するかどうかは疑問です。オープン/クローズド原理とカプセル化違反

public abstract class CustomClass { 

    private ClassThatSetEnvironmentProperty sysProp = new ClassThatSetEnvironmentProperty("SYS_PROPETY", "SYS_PROPERTY_VALUE"); 

    // some code here 

    void setSysProp(ClassThatSetEnvironmentProperty sysProp) { 
     this.sysProp = sysProp; 
    } 
} 

私の理解は、セッターのみ(ClassThatSetEnvironmentPropertyを模擬するために)ユニットテスト可能性のために定義されています。しかし、この場合、セッターは、コンクリートの継承者が定義された状態を変更することを可能にします。私の見解からは、カプセル化に違反しています。私はそれがオープン/クローズドなprinicpleに違反していると思います。率直に言えば、私の同僚の何人かは逆の意見を持っています。私は本当にあまり経験がないので、それを認識することは難しいです。あなたの意見をここで共有してください。ありがとうございました。

+0

私はセッター・インジェクションを介してコンストラクタ・インジェクションを好むだろう。 – duffymo

+0

あなたは正しいです、私はあなたに完全に同意します。しかし、現在のケースはどうですか? – aime

+1

オープン/クローズの原則の定義では、ソースコードを変更せずにクラスの動作を変更できる必要があると規定されています。この場合、私はそれが原則に全く違反しているとは思わない。ソースコードは同じままですが、 'sysProp'は変更されます。 – christopher

答えて

5

これは直接開閉原理は、ちょうどあなたが新しい実装するクラスを作成するのではなく古いものを変更する必要があり、あなたのシステムに新しい振る舞いを追加することを意味し、オープンクローズドの原則とは関係ありません。そのために抽象クラスを使用すると問題ありません。 (別の原則である)カプセル化に違反し

一つのことは、パッケージがアクセス可能な依存関係のセッターです。この問題は、保護された設定者に変更することで修正できます。拡張クラスは独自のクラスを設定できますが、外部呼び出し元はオブジェクトの状態を変更できません。

protected final void setSysProp(ClassThatSetEnvironmentProperty sysProp) { 
    this.sysProp = sysProp; 
} 
+0

私は同意します。ありがとうございます – aime

+0

プロテクトは、パッケージプライベート(デフォルト)よりも少ない*制限*です。 –

+0

@ OleV.V。彼らは違った制限があります。 Protectedは、すべての拡張クラスがそのクラスにアクセスできるようにします。共有APIの場合、これは重要な要件です。 –

関連する問題