翻訳者から。 これは、Mark Simanのブログからの一連の投稿の翻訳です。 投稿のサイズが小さいにもかかわらず、いくつかの投稿を結合したくありませんが、Markによって提案された構造を忠実に守ろうとしています。翻訳者からもう少し。 POKA-YOKEは「フールプルーフ」またはフォールトトレラントと翻訳できます。カプセル化は、オブジェクト指向プログラミング(OOP)で最も誤解されている概念の1つです。 ほとんどの人は、カプセル化に関連して、「
情報を隠す 」という概念は、パブリックプロパティ(またはプロパティサポートを持たない言語のゲッター\セッターメソッド)を介してプライベートフィールドを開くことを意味すると考えているようです)
次のようなコードを継承することの
本当の利点は何か疑問に思ったことはありますか?
private string name; public string Name { get { return this.name; } set { this.name = value; } }
私にとって、このコードはひどく冗長に見えます(そして
自動プロパティは答えではありません。これはコンパイラのトリックであり、フィールドを作成します)。 実際に情報は隠されていません。
Derik Baileyは、
このカプセル化方法が狭すぎる理由についての良い投稿を書いたので、ここで彼の結論を繰り返しません。
カプセル化とは
どういう意味ですか?
オブジェクト指向の主な利点は、特定の問題を完全に解決する関連コード(クラス)の生成であり、プログラマーは内部実装の詳細について何も知らなくてもこれらのクラスを使用できます。
これがカプセル化の本質です。つまり、消費者が対象分野を完全に理解することを必要としない、問題の解決策の提案(開示)です。
適切に設計されたクラスが提供するもののリストは次のとおりです。
- ADO.NETをSQL Serverと組み合わせて使用するために、テーブルデータストリーム( TDS )の内部詳細を理解する必要はありません。
- WPFまたはWinFormsを使用するために、画面上の描画の内部詳細を理解する必要はありません。
- DIコンテナを使用するために、リフレクションの内部の詳細を理解する必要はありません。
- .NET Frameworkを使用してリストを並べ替えるために、リストを効率的に並べ替える方法を理解する必要はありません。
- 等
カプセル化を非常に重要にしているのはこの特性です。 クラスは、「単純な」ユーザーから保護するために、カプセル化する情報を非表示にする必要があります。
ウィキペディアは次のように述べています:オブジェクトの内部を非表示にすると、オブジェクトの整合性が確保され、一貫性のない状態や誤った状態で内部コンポーネントデータをインストールすることからユーザーが保護されます。
ユーザーがクラス実装の内部
を完全に理解することは
期待されて
いないことに留意してください。 これにより、カプセル化の定義が明確になります。
カプセル化は、フォールトトレランスを確保するためのメカニズムです。
このことから、カプセル化が複雑さを隠すことを意味するわけではありません。
プロバイダーパターンの場合のように、複雑さが隠さ
れている場合は常に、フィードバック時間が長くなります。 高速フィードバックが非常に望ましいため、フィードバックの遅延は可能な限り回避するのが最善です。
カプセル化は、複雑さを隠すことではなく、フォールトトレラントな方法で複雑さを明らかにする方法に関するものです。
リーン(
翻訳者のメモ:無駄のないソフトウェア開発プロセス )では、これはフールプルーフネス(
poka-yoke )として知られていますが、カプセル化をPoka-yokeデザインと考えるのは真実だと思います。たぶん。
コンパイルが最も安価なフィードバックメカニズムであることを考えると、クラスが正しく使用されている場合にのみコードがコンパイルできるようにAPIを設計することをお勧めします。 (
p。rem。Translator。「APIを(可能であれば)誤って使用すると、ユーザーは問題を示すコンパイルエラーを受け取り、それが不可能な場合は通知を受け取るようにAPIを設計する方が正しいと思います。できるだけ早くプログラムを実行します。 )
一連の投稿で、カプセル化を破るさまざまな「デザインの匂い」を見て、より安全にするためにデザインされたコードを改善する方法のガイドを準備し、「匂い」から香りに移行します。
- デザインの「におい」:一時的につながります。
- デザインの「におい」:プリミティブへの執着。
- コードの匂い:自動プロパティ。
- デザインのにおい:必要な冗長属性。
- Design Smell:デフォルトのコンストラクター。
追記:
境界では、アプリケーションはオブジェクト指向ではありません。