2010-11-23 16 views
1

私の同僚は、次のようなクラスを設計する傾向があります。この初期設定のアンチパターンと、場合によっては他のパターンとの間に、簡潔でよく書かれた議論がどこにありますか?

class ImportantClass 
{ 
    public SomeClass ImportantField; 
    public SomeOtherClass OtherImportantField; 
    // etc. 
} 

コンストラクタは書きません。

ImportantClass x; 

try 
{ 
    // This is problematic enough to begin with, as every field (which is public) 
    // is set manually, which causes code duplication wherever this type is 
    // instantiated as well as maintenance problems in the event new fields are 
    // introduced or internal implementation is changed. 
    x = new ImportantClass(); 
    x.ImportantField = new SomeClass(); 
    x.OtherImportantField = new SomeOtherClass(); 
} 
catch (Exception ex) 
{ 
    // ...what's even worse: now x can easily be in a totally invalid state, 
    // with some fields initialized and some not. 
    HandleAnyException(ex); 
} 

明らかに、上の例は単純すぎる(誇張された)例です。しかし、私はあなたがポイントを得ると思います。

私は同僚を批判するためにこれを投稿していません。むしろ、私はこのようなクラスを開発する上で多くの問題を抱えて彼に正しい方向に向かわせたいと思っています。私は個人的には、このデザインはかなり貧しいものの、簡単に「固定」されていると感じています。

私が主に関心を持つのは、彼を説得したいのであれば、強い(よくサポートされている)、理解しやすい、の簡潔な議論を持つことが重要です。彼のコードを変更する必要があると思う理由を伝える2ページの電子メールを読んでください)。

このようなうまく作られた議論を提供する良いリソースはありますか?これと他の悪いアドバイスされたデザインのアンチパターンの欠点に取り組んでいますか? 「共通のソフトウェア設計ミス」の概要のようなものが存在する場合、非常に有益です。

メモ:単にそれについて話すことは、アドバイスを与えるための最も直接的でおそらく最も破壊的ではない方法であることを認識しています。私はちょうど考えている、もしこのようなリソースが存在すれば、私が参照として指し示すことができるこのリソースを持っていることもまたうれしい。

+1

ワウ。彼らはそのようなものを書くために彼に支払う? –

答えて

2

これは責任の原則に違反します。 ImportantClassが正常に動作するためには他の2つのインスタンスが必要な場合は、ImportantClassは、何か他のことが起こる前に、それらが正常な状態にあることを確認する責任があります。

2

そのコードは、私が強く推薦した優れた本「効果的なJava」のJoshua Blochに記載されているいくつかの原則に違反しています。たとえば、パブリックインスタンスフィールド上:

インスタンスフィールドが非最終である、または は可変 オブジェクトへの最後の参照である場合は、そのフィールド を公表することで、あなたは に能力をあきらめますフィールドに格納できる値を に制限します。つまり、 には、フィールドに関連する不変式 を強制する機能をあきらめることもできます。また、 フィールドが変更されたときに何らかのアクションをとることを諦めるので、 public mutableフィールドのクラスは スレッドセーフではありません。たとえフィールドが最終的に で不変オブジェクトを参照していても、 フィールドを公開すると、 フィールドには フィールドが存在しない新しい の内部データ表現に切り替える柔軟性が失われます。

さらに、これらのフィールドを公開してカプセル化することはできません。

本書では、オブジェクトの初期化を安全かつ正確に行う方法について多くのことを述べています。あなたが投稿したコードは非常に問題があると言っても過言ではありません。

1

このコーディング方法は、もちろんカプセル化であるオブジェクト指向開発の3つの基本概念の1つに違反していると言えるでしょう。

本当に難しい内部のデータにアクセスするための単一の方法になりますプライベートメソッドとは対照的に、デバッグを行い、彼のオブジェクトの状態は、そのユーザーが直接変更することができるという事実...これより

詳細彼のクライアントは自分のクラスに密接に結びついているので、内部的な変更を加えたい場合、変更されたものが使用に影響を与えないにもかかわらず、クライアントは再コンパイルする必要があります。

最新の年の間に、OOシステムにおけるデータカプセル化の適用が過去と比較して緩和されたことである。

たとえば、SPRINGやLINQなどのテクノロジは、IOCまたは「機能的に類似」の動作をアーカイブしようとする実装の詳細のプライバシーに直接違反します。

この傾向の直接の結果は

1

...セット/取得するプロパティなどの個人データの直接のエクスポージャーを単純化するために使用されている自動プロパティのC#のから最近の採用であることが理由の消費者としてPrinciple of Least Astonishmentに違反しますクラスは、例外なく動作させるためにクラスの作業知識が必要です(または、$$に大きな苦痛を与える例外がなくなるまで実行します)。

http://portal.acm.org/citation.cfm?id=1176622からいくつかの引用符:

APIは使いやすく、誤用へのハードでなければなりません。簡単なことをするのは簡単なはずです。複雑なことをすることは可能です。不可能な、または少なくとも困難な、間違ったことをすること。

APIに実装の詳細は無料で保存してください。彼らはユーザーを混乱させ、進化の柔軟性を阻害します。実装の詳細が何であるかは必ずしも明らかではありません。過剰指定に注意してください。

関連する問題