1

わかりましたので、 OOP 内のアクセス修飾子に関して、なぜプログラマーがそれほどストレスを感じるのかを考えていました。

このコードを例に取りましょう / PHP!

class StackOverflow
{
    private var $web_address;

    public function setWebAddress(){/*...*/}
}

web_address はプライベートであるため、 によって変更することはできませんが$object->web_address = 'w.e.'、変数が変更されるのは、プログラムが変更する場合のみです。$object->web_address = 'w.e.';

アプリケーション内で変数を変更したくない場合は、プログラミングに変数を変更するコードがないようにアプリケーションを作成します。したがって、変数は決して変更されませんか?

だから私の質問は次のとおりです。プライベート/保護/非公開エンティティを使用する際の主なルールと理由は何ですか

4

6 に答える 6

3

(理想的には) クラスには次の 2 つの部分がある必要があるためです。

  1. 他の世界に公開されたインターフェースであり、他の人がどのように対話できるかのマニフェストです。ファイルハンドル クラスでの例: String read(int bytes). もちろん、これは公開する必要があります。クラスの (1 つの) 主な目的は、この機能を提供することです。
  2. インスタンス自体以外の誰も気にする必要がない (気にする必要がある) 内部状態。ファイルハンドル クラスでの例: private String buffer. これは、他の世界から隠すことができ、また隠す必要があります。彼らはそれとは関係がなく、実装の詳細です。

_これは、Python などのアクセス修飾子のない言語でも行われますが、プライバシーを尊重することを強制していないことを除いて (そして、いつでもリフレクションを使用できることを覚えておいてください - カプセル化を 100% 強制することはできません)、プライベート メンバーの前に「これに触れてはいけません。いじる場合は、自己責任で行ってください。」

于 2010-09-14T14:45:13.660 に答える
2

だから私の質問は:プライベート/保護/非パブリックエンティティを使用する際の主なルールと理由は何ですか

Pythonには、アクセス修飾子はありません。

したがって、理由は実際には言語固有です。これを反映するために、質問を少し更新することをお勧めします。

Pythonについてはかなり一般的な質問です。JavaまたはC++(またはその他)のバックグラウンドを持つ多くのプログラマーは、これについて深く考えることを好みます。彼らがPythonを学ぶとき、本当に深い考えはありません。動作原理は

私たちはみんなここで大人です

アクセス修飾子が誰に(正確には)役立つのかは明確ではありません。Lakosの著書、Large-Scale Software Designには、「保護された」という長い議論があります。これは、保護されたセマンティクスによってサブクラスとクライアントインターフェイスが少し曖昧になるためです。

http://www.amazon.com/Large-Scale-Software-Design-John-Lakos/dp/0201633620

于 2010-09-14T14:39:25.757 に答える
2

プロジェクトの開発者はあなただけではない可能性があり、他の開発者は変更すべきではないことを知らない可能性があるためです。または、忘れる可能性などがあります。

これにより、誰かが悪い考えだと言ったことを実行しているときに、簡単に見つけることができます (コンパイラでさえもそれを見つけることができます)。

于 2010-09-14T14:31:25.850 に答える
0

クラスに「何か」があるからといって、それがその何かを公開する必要があるという意味ではありません。クラスはそのコントラクト/インターフェース/あなたがそれを呼びたいものは何でも実装する必要がありますが、そうすることで、外部に知られる必要のない(そしてすべての権利によって知られるべきではない)あらゆる種類の内部メンバー/メソッドを簡単に持つことができますそのクラスの。

もちろん、アプリケーションの残りの部分を記述して、とにかくそれを処理することもできますが、それは実際には優れた設計とは見なされません。

于 2010-09-14T14:39:30.283 に答える
0

アクセス修飾子は、防御的なプログラミング戦略のためのツールです。自分の愚かなエラー (しばらくして何かを忘れた場合、何かを正しく理解できなかった場合、コーヒーを十分に飲んでいない場合) からコードを意識的に保護します。

于 2010-09-14T14:32:36.393 に答える
0

誤って を実行しないようにします$object->web_address = 'w.e.';。現時点では不要に思えるかもしれませんが、

  • web_address2 か月後、プロジェクト内の何かを変更したい (そして、直接変更してはならないという事実をすべて忘れてしまった) または

  • あなたのプロジェクトには何千行ものコードがあり、直接設定することが「許可」されているフィールドと、setter メソッドが必要なフィールドを思い出せません。

于 2010-09-14T14:33:18.637 に答える