0

反対票を投じる前に、私の質問を説明させてください。私はアーキテクチャの設計に少し経験があり、進歩しようとしています。private1 つ目は、バグを修正していたときに、メソッドを使用するよりも、メソッドを有効にする必要があるという結論に達しましpublicた。それが私の仕事を終わらせ、バグを修正する最速の方法でした。私はチームリーダーのところに行き、それを言いました。彼から顔をしかめた後、私はどのpublic方法も非常に高価な喜びであると説明されました. プロジェクトの存続期間中、すべての public メソッドをサポートする必要があると言われました。そして、はるかに..

私は考えていた。それはそう!コードを調べたときに、なぜそれほど明確ではなかったのですか。私が独自のアーキテクチャを設計したときも、それほど明白ではありませんでした。私はそれについての私の考えを覚えています:

ああ、私はこの方法を残しておきpublicます。システムが成長したときに役立つかもしれません。

私は混乱し、スケーラブルなシステムを作成したと思っていましたが、実際にはインターフェイスに大量のゴミがありました。

私の質問:

メソッドが本当に重要であり、その価値があるかどうかをどのように説明できますpublicか? それをチェックするための反例はありますか?private/publicアストラルで何時間も過ごすことなく、選択を行うための訓練をどのように受けますか?

4

3 に答える 3

2

オブジェクトが存在するドメインについて自問できる質問がいくつかあります。

  • このメンバー (メソッド、プロパティなど)は、他のオブジェクトからアクセスする必要がありますか?
  • 他のオブジェクトには、このメンバーにアクセスするビジネスがありますか?

カプセル化はしばしば「データの隠蔽」または「メンバーの隠蔽」と呼ばれ、多くの混乱を招くと思います。経験の浅い開発者は、当然のことながら、「コードの残りの部分から何かを隠したいと思うのはなぜですか?そこにあるのであれば、それを使用できるはずです。結局のところ、それは私のコードです。」

あなたのチーム リーダーの返答の仕方にはあまり納得できませんが、彼は非常に良い点を述べています。オブジェクト間の接続ポイントが多すぎると、接続が多すぎます。オブジェクトはますます緊密に結合され、1 つの大きなサポート不可能な混乱に融合します。

アーキテクチャ全体で関心の分離を明確かつ厳密に維持することで、これを防ぐことができます。オブジェクトを設計するときは、パブリック インターフェイスがどのように見えるかを考えてください。外見上、どのような属性や機能を持っているでしょうか? その機能の一部として合理的に期待されないものは、公開すべきではありません。

たとえば、 というオブジェクトを考えてみましょうCustomer。次のような を説明するいくつかの属性を合理的に期待できますCustomer

  • 名前
  • 住所
  • 電話番号
  • 処理された注文のリスト

また、いくつかの機能が利用できることを期待するかもしれません:

  • 支払いの処理
  • すべての注文を保留

その中に技術的な考慮事項もあるとしますCustomer。たとえば、オブジェクトのメソッドはCustomer、クラスレベルの接続オブジェクトを介してデータベースに直接アクセスする場合があります。その接続オブジェクトは公開する必要がありますか? 現実の世界では、顧客にはデータベース接続が関連付けられていません。したがって、明らかに、公開すべきではありません。これは、 の外部から見えるインターフェイスの一部ではない内部実装の問題Customerです。

もちろん、これは非常に明白な例ですが、要点を示しています。public メンバーを公開するときはいつでも、そのオブジェクトの機能の外部から見える「コントラクト」に追加します。そのオブジェクトを、同じコントラクトを満たす別のオブジェクトに置き換える必要がある場合はどうすればよいでしょうか? 上記の例で、データベースではなく XML ファイルにデータを格納するバージョンのシステムを作成したいとします。外部の他のオブジェクトCustomerが公開データベース接続を使用している場合、それは問題です。の内部実装だけでなく、全体的な設計についてさらに多くの変更を加える必要がありCustomerます。

原則として、最初に最も厳密なメンバーの可視性を優先し、必要に応じてそれらを開くことが通常は最善です。そのガイドラインを、オブジェクトが表す現実世界のエンティティと、それらのエンティティに表示される機能の観点からオブジェクトを考えるアプローチと組み合わせると、特定の状況に対する正しい行動方針を決定できるはずです。

于 2013-07-15T22:57:56.737 に答える