質問

う機能を機能させるだけ構成の一例の封止させていただきます。物を封止?

思わりを理解することを目指してい概念の封止.何を思ったのだから行くようなこと:

n=n+1

実行される、野生の一環として大きな体をコードしかいないところで機能をどを行うとともに封入されるほか、論理方法:

addOne(n)
    n = n + 1
    return n

または合には封止ていただく場合に隠の詳細addOne、外部からの世界のようであればオブジェクトの方法を使用しているアクセス修飾子の個/保護できますか?

役に立ちましたか?

解決

うまく抽象化とのカプセル化する理解をより広い文脈のオブジェクト。

封止が次の三つの:

  • 抽象化
  • 実装を隠
  • 部門の責任

抽象化には部品の封止.おとえば、抽象化の機能の追加から本体にコードで回住むこれにより同定共通の認識とコンセプトにより、特定の例を追加、変数へのn)この能力の抽象化による内包されたコンポーネント方法またはオブジェクト-再利用が可能です。

この概念の封止はの実装を隠した。この封止については、アリーナのオブジェクト。実装を隠しを守るオブジェクトからそのユーザーを開きます。にOOのみなさん、この提示によるインターフェースのpublicメソッドは、ユーザーのオブジェクトの実装は、オブジェクト内の個ます。

これによって運営されます。第一に、アクセスを制限するなどへのオブジェクトを回避するためという状況のオブジェクトを残すことができ、オブジェクトでは無効な状態です。第二に、ユーザー視点を利用される際には、ごオブジェクトをおこなっているだけ疎結合し-ご変更の場合は実施後にな影響を及ぼす。

最後に、部門のresponsilityのより広い文脈でのOOデザインがうるとみなさなければな住所を封止す。で封止乱の収集機能-責任の必要が綺麗に、論理的に定義される少なくと重複は曖昧です。例えば、トイレを設けてありますのオブジェクトまた壁は、そのドメインの責任からキッチンでオブジェクトです。

限られた意味では、もしかしその機能、例えば、'modularizes'いくつかの機能により抽出します。しかし、私は言った、"封止"としての期間の理解をより広い文脈のオブジェクト指向を適用するモジュール化に応える三つの基準を上場。

他のヒント

私は答えのトレンドのようです何に反対して初めてとなります。はい、機能は実装のいくつかの量をカプセル化します。あなたは(私はあなたがクラスを意味するために使用すると思います)オブジェクトを必要としません。

を参照してください。マイヤーズにすぎます。

確かにそれはあります。

例えば、唯一のパラメータで動作する方法は、グローバル静的データ上で動作する方法に比べて「より良いカプセル化」と考えられる。

カプセル化は、OOPの前に周りの長されています:)

この方法は、車よりも多くのカプセル化の例であり、良好な駆動の一例です。カプセル化は、それが論理的な設計上の問題で、SYNAXに関するものではありません。オブジェクトとメソッドの両方が良いと悪いのカプセル化を示すことができます。

それについて考えるための最も簡単な方法は、コードが/は実装を気/知る必要がないコードの他の部分から詳細を抽象化する隠すかどうかです。

車の例に戻って: オートマチックトランスミッションは、優れたカプセル化を提供しています:あなたは、前方/バックや速度を気にドライバーとして。 手動変速機は悪いカプセルである:運転者の観点からは、低/高速に必要な特定のギアは、運転者の意図にほぼ無関係である

いいえ、オブジェな 必要 封止.の非常に広い意味では、"封止"では"隠れた内容からビュー"この方法は、封止を実施する。

きのこない味出かけすることができます、あなたのコードで設計できれいでインターネット検索大手れています。プログラムの500公開方法などによる同じプログラムを実施した一1000法を採用しております。

建築プログラムかどうかにかかわらず、いオブジェクト指向技術なくしていくかを考える必要があり封止なっているのは、さまざまな場所:隠され、実施内容の方法に隠れからのデータをコードする必要がありませんかが容易にインターフェイスモジュール等

更新: お答えを更新しい質問は、"ゴールドの方法、および、アクセス修飾子"を異なる方法での封止ロジックだが、一つの行為です。

ゴールドの方法を隠の各行のコードといたる、すべての方法で呼び出し側かについて注意する必要はありどのようなライン;これは気に署名のとおりである。

低迷する手法のクラスとして(例えば)において、"プライベートな"隠する方法で消費者の クラス る必要はありません心配しているものなのpublicメソッド(または財産のクラスです。

これは、コンポーネントレベルのことだ。

これはアウトをnoreferrer">

カプセル化の抽象的な概念では、実装の詳細を隠すことを意味します。オブジェクト指向はecnapsulationの使用の一例に過ぎません。別の例では、モジュール2使用(または使用)の実装モジュールと定義モジュールと呼ばれる言語です。定義モジュールは、実際の実装を隠し、したがって、カプセル化を提供しました。

あなたが何かブラックボックスと考えることができたときにカプセル化が使用されています。オブジェクトはブラックボックスです。あなたは、彼らが提供する方法を知っているが、彼らはありませんどのように実装されています。

[EDIT] 更新問題の例としては:それはあなたがカプセル化をどう定義するか狭くても広くによって異なります。あなたのAddOneの例では、私は信じて何かを隠していません。あなたの変数は、配列のインデックスになり、あなたのメソッドMoveNextメソッドを呼び出すと、おそらく他の機能はsetValueとのgetValueを持っているならば、それは情報隠蔽/カプセル化だろう。これは、彼らは、アレイを使用して、あなたを意識することで、あなたの構造や設定となって変数を移動するには(おそらくいくつかの他の機能と一緒に)人々を可能にします。あなたのプログラミング言語は、他のか、より豊かな概念をサポートする場合は、意味とのインタフェースを変更するとMoveNextメソッド、setValueのとのgetValueの実装を変更することができます。私にはそれがカプセル化されます。

う簡単にこの例:までお車の鍵はい]をクリックします。いあいという以上のキーがん してい を知る があります。ま鍵番=モーターが始まります。のインタフェースをキーとは、例えば、関数の呼び出しを隠しの実施のスターターモーターを回すだけでエンジン。(実施。 ことになる 封止.ま惜しからという下のフードだと嬉しいです。

作成した場合は人工を手にえの鍵とうございますの ない 封止.いの鍵付業者を仲介cruftが隠れることなくあります。うえおさんを思い出ではない封止実施内容ものの達成を通じて機能します。この例では、誰にでも持ち直しはコードがないます。いとうクラブへのご人工ます。

その他の方法のようなものと考えることができる隠れた情報(クラス、機能、動的ライブラリ、マクロを使用して封止.

カプセル化は、単一のエンティティとして組み合わせにおけるオブジェクトの(データメンバ)属性する過程と行動(メンバ関数)クラスとして参照されます。

オープン分散処理の参照モデル - 国際標準化機構によって書かれた - は、次の概念を定義します:

エンティティ:関心の任意のコンクリートや抽象的なもの。

オブジェクト:エンティティのモデル。オブジェクトは、その状態によって、二重、その挙動を特徴としている。

(オブジェクトの)行動:。彼らは発生する可能性がありますときに制約のセットとアクションのコレクション

インタフェース:彼らが発生することときに、制約のセットと一緒に、そのオブジェクトの相互作用のサブセットで構成されたオブジェクトの挙動の抽象化

カプセル化:オブジェクトに含まれる情報は、オブジェクトのみでサポートされている界面での相互作用を介してアクセス可能なプロパティ

これらは、あなたが理解するだろう、非常に広範です。関数内での機能を置くことは、論理的にこれらの用語でのカプセル化に向けて構成すると考えることができるかどうか、私たちは、しかし、見てみましょう。

それはあなたが(おそらく)実行望むとそのアルゴリズムはあなたが解決しようとしているいくつかの問題に関係する(したがって、モデルであるアルゴリズムを表し、その中で、

まず、関数は「興味のある事」明らかに、のモデルであり、こと)。

機能は動作を持っていますか?それは確かにありません:それは、実行する前に、関数がどこから呼び出されなければならないという制約の下で実行されます(実行可能ステートメントの任意の数の可能性)アクションのコレクションが含まれています。関数は自発的に原因因子なしで、いつでも呼び出すことがなくてもよいです。法律用語のように聞こえますか?もちろんです。しかし、それにもかかわらず、の上耕してみましょう。

関数は、インタフェースを持っていますか?それは確かにありません:それは独自に実行可能ファイルのコレクションを識別するために理解されている名前と、その内の関数に含まれる実行文にターンマップでは、一度関数が呼び出された仮パラメータの収集、名前とパラメータリストを持っています発呼者は、それらの実際のステートメントを指定せずに実行される。

ステートメント

関数は、関数に含まれる情報は、オブジェクトのみでサポートされている界面での相互作用を介してアクセス可能性を持っていますか?うーん、まあ、それができます。

いくつかの情報は、そのインタフェースを介してアクセス可能であるため、

、いくつかの情報は、関数内で隠され、アクセスできなくする必要があります。 (プロパティなどの情報展示がパルナスは、モジュールは変更する可能性がある困難な決定や意思決定の両方を隠すように設計されるべきであると主張によって定義された情報隠蔽、と呼ばれている。)だから何の情報は、関数内に隠されている?

これを見るために、我々は最初の規模を考慮する必要があります。クラスのいくつかは、公開すること(したがって、パッケージのインタフェースでも)、一部はパッケージプライベート(ひいては情報 - 隠されたパッケージ内)になります。それは例えば、Javaクラスがパッケージ内にカプセル化することができ、と主張するのは簡単です。カプセル化理論では、クラスは、ノードを形成し、パッケージは全体がカプセル化されたグラフを形成すると、カプセル化された領域を形成します。クラスとパッケージのグラフは、第3のグラフと呼ばれます。

これは、関数(またはメソッド)自体がクラス内にカプセル化されていると主張することも簡単です。ここでも、一部の機能は、公開されます(したがって、クラスのインターフェイスの一部である)と、いくつかのプライベート(したがって、クラス内の情報は、非表示)になります。関数やクラスのグラフは、第2のグラフと呼ばれている。

今、私たちは、機能に来ます。機能は、彼ら自身のカプセル化の手段であることがある場合、それらは他の機能にいくつかの情報公開や情報-隠された機能の中にありますいくつかの情報が含まれている必要があります。この情報は何だろうか?

一つの候補がマッケイブによって私たちに与えられています。循環的複雑度に彼の画期的な論文では、トーマス・マッケイブは、「グラフの各ノードは、プログラム内のコードのブロックに対応するソースコードを記述しここで、流れが連続的であるとアークがプログラムに取り込ま分岐に対応している。 '

私たちは、関数内にカプセル化することができる情報の単位として、順次実行のMcCabianブロックを見てみましょう。関数内の最初のブロックが実行される最初で唯一の保証ブロックが常にあるように、我々は、それが他の関数によって呼び出され得ることで最初のブロックは、公共であると考えることができます。関数内の他のすべてのブロックは、しかし、(半ば流れ関数にジャンプできるような言語を除く)他の関数によって呼び出すことはできませんので、これらのブロックは情報-隠された機能の中に考慮することができる。

これらの(おそらくやや希薄な)定義を取って、それから私達はイエスと言うことがあります。関数内での機能を置くことは、カプセル化を構成するものでもありません。関数内のブロックのカプセル化は、最初のグラフである。

しかし、caveateがあります。あなたは、そのすべてのクラスにカプセル化するために、公開されたパッケージを検討しますか?上記の定義によると、それはあなたがパッケージ(すなわち、すべてのpublicクラス)へのインタフェースが実際に他のパッケージにパッケージの行動のサブセットを提供していますかと言うことができるよう、試験に合格しません。何のクラスは情報-隠されていないとしてではなく、この場合のサブセットは、パッケージ全体の動作です。だから、regorously上記の定義を満たすにもかかわらず、我々は確かに何かが主張する真のカプセル化のための情報、隠さなければなりませんよう、それは、定義の精神を満たしていないと感じています。

同じことはあなたが与えるexampeについても同様です。我々は確かにそれ(とreturn文)が実行のシングル、一連の流れあるとして、単一McCabianブロックであることをN = N + 1を検討することができます。しかし、あなたはこれを入れてその中に機能は、このように一つのブロックのみが含まれ、そのブロックは、関数の唯一の公共ブロックであるので、あなたの提案機能内には情報-隠されたブロックが存在しません。だから、カプセル化の定義を満たすかもしれないが、私はそれが精神を満たしていないと言うでしょう。

あなたが利益なカプセル化を証明できない限り、すべてのこれは、もちろん、学術的です。

のカプセル化をやる気二つの力があります。セマンティックと論理的には、

セマンティックカプセル化は、単にカプセル化されたノード(一般的な用語を使用する)の意味に基づいてカプセル化を意味します。私は「ミネラル」は、2つのパッケージと呼ばれる1、「動物、」と呼ばれるものを持っているし、その後、次の3つのクラス犬、猫とヤギを与え、これらのクラスをパッケージそこに頼むことを教えてくれあれば与えられ、その後、カプセル化されなければなりません他の情報は、あなたがシステムのセマンティクスは三つのクラスが、ではなく、「動物、」パッケージ内に封入されていることを示唆していると主張することは完全に権利ないだろう「ミネラルを。」

カプセル化のための他の動機は、しかし、ロジックである。

システムの構成は、システムとそれが存在するカプセル化された領域の各ノードの正確かつ網羅的同定です。 Javaシステムの特定の構成は、 - 第三のグラフに - システムのすべてのクラスを識別し、各クラスが存在するパッケージを指定する

論理的にシステムをカプセル化するには、プロパティが数学的に最小になるように、そのシステムを構成するために、その構成に依存し、システムのいくつかの数学的な性質を特定することを意味します。

カプセル化理論は、すべてのカプセル化されたグラフは、エッジの最大潜在的な数(MPE)を発現することを提案しています。クラスおよびパッケージのJavaシステムでは、例えば、MPEは、そのシステムのすべてのクラスとの間に存在することができるソースコードの依存関係の最大潜在的な数です。同じパッケージ内の2つのクラスが互いに情報隠さことができないので、両方が、潜在的に互いにdepdenciesを形成してもよいです。別々のパッケージで二つのパッケージ-privateクラス、しかし、お互いに依存関係を形成しない場合があります。

カプセル化理論は、MPEが最小になるように私たちは、クラスの与えられた数のために持っている必要がありますどのように多くのパッケージを教えてくれる。言い換えれば、あなたが間に持っているより多くの潜在的なソースコードの依存関係 - 負担の原則の弱いフォームはエンティティのコレクションを変換する最大の潜在的な負担が変換エンティティの最大潜在的な数の関数であると述べているので、これは便利ですあなたのクラス、任意の特定のアップデートを行うための大きな潜在的なコスト。これMPEを最小限に抑えることにより、アップデートの最大の潜在的なコストを最小限に抑えます。

Nクラスとパッケージごとのp publicクラスの要件を考えると、カプセル化理論は、パッケージの数は、R、我々はMPEは、以下の式で与えられる最小化しなければならない必要があることを示しています。R = SQRT(N / P)

これはまた、総数与え、あなたが持つべき機能の数に適用され、nは、お使いのシステムでMcCabianブロックの。関数は、常にあなたのシステムに持っていることのように簡単になり、R、我々は上記のように、ただ一つの公共のブロックを持っており、その多くの機能のための方程式:R = SQRT(N)

カプセル化を実施する場合確かに、いくつかは、彼らのシステム内のブロックの合計数を検討したが、それは容易にクラス/パッケージレベルで行われています。それに、MPEを最小限に抑えることがほぼ完全にentuitiveです:それは公共のクラスの数を最小限に抑え、均一にパッケージ上のクラスを配布する(または少なくとも避けるために試みることによって行うの30クラス、たとえば、とほとんどのパッケージを持っている、と500クラスと1つのモンスター可能パッケージ、その場合、後者の内部MPEが容易他のすべてのMPE)を圧倒することができます。

カプセル化は、このようセマンティックと論理の間のバランスをとることを含む。

すべてのとても楽しいます。

厳格なオブジェクト指向の用語で、1はなし、「単なる」機能をカプセル化と呼ばれるのに十分強力ではないと言うように誘惑されるかもしれない...しかし、<のhref = "http://www.google.com/ ?検索HL = EN&DEFL = EN&Q =定義:カプセル&EI = ioi5Sur_LZSJtgellJ24BA&SA = X&OI = glossary_definition&CT =タイトル」のrel = "nofollowをnoreferrerはい、機能は "いくつかのコードをカプセル化する" 明白な答えの現実世界での>です" <。 / P>

この冒涜で毛OOの純粋主義者のために、状態および単一の方法なしで静的匿名クラスを考えます。 AddOne()関数は、カプセル化されていない場合は、どちらもこのクラスではありません!

とだけ杓子定規であると、カプセル化は抽象化の形ではなく、その逆です。 ; - )

これは、プロパティを参照することなく、カプセル化の話をするために、通常は非常に有意義ではないのではなく、のみの方法 - あなたは確かに、メソッドにアクセス制御を置くことができますが、それはそれは、他のことになるだろうかを確認することは困難ですカプセル化された方法にスコープデータなし無意味より。おそらく、あなたはそれを検証し、いくつかの引数を作ることができ、私はそれは曲がりくねっただろうと思う。

だから、いや、あなたが最も可能性の高いあなたではなく、グローバル関数としてそれを持つよりも、クラスのメソッドを置くという理由だけでカプセル化を使用していない。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top