私は明らかにこれらの概念にまったく慣れていません。プロパティやメソッドへのアクセスを制限する理由がわかりません。意図した結果に従ってコードを書くだけのようです。単純にメソッドを呼び出さないのではなく、なぜプライベート メソッドを作成するのでしょうか。それは反復的なオブジェクトの作成 (私が正しく言っている場合)、複数の開発者の状況 (他の人の作業を台無しにしないでください)、または単に自分の作業を誤って台無しにしないためですか?
8 に答える
最後の2つのポイントは非常に正確です。つまり、複数の開発者が自分のものを台無しにする必要はありません。プロジェクトに十分長く取り組むと、最初に行ったことの多くを忘れていることに気付くでしょう。
何かを非表示にする最も重要な理由の1つは、後で安全に変更できるようにするためです。フィールドが公開されていて、数か月後にフィールドを変更して、フィールドが変更されるたびに何か別のことが発生するようにしたい場合は、問題が発生します。公開されていたため、そのフィールドに直接アクセスした他の場所の数を知る方法や覚える方法はありません。プライベートの場合は、このクラスの外部で触れられていないことが保証されます。パブリックメソッドがラップされている可能性があり、そのメソッドの動作を簡単に変更できます。
一般に、公開するものが多いほど、他のコードとの互換性について心配する必要があります。
クラスの消費者が実装の詳細を気にする必要がないように、プライベート メソッドを作成します。クラスが提供するいくつかの気の利いたものに集中できます。
さらに、パブリック メソッドのすべての可能な使用を検討する義務があります。メソッドを非公開にすることで、クラスがサポートする必要のある機能の数を減らし、それらを変更する自由度を高めます。
クラスがあるとQueue
します。発信者がアイテムをキューに追加するたびに、キューの容量を増やす必要がある場合があります。基になる実装のため、容量の設定は簡単ではないため、別の関数に分割して、関数の読みやすさを向上させますEnqueue
。呼び出し元はキューの容量を気にしない (あなたが処理している) ため、メソッドを非公開にすることができます: 呼び出し元は余分なメソッドに気を取られず、呼び出し元がばかげたことをするのではないかと心配する必要はありません。また、クラスを使用するコードを壊すことなく、いつでも実装を変更できます (クラスで定義された限られたユースケース内で容量を設定している限り)。
それはすべてカプセル化に帰着します。これは、クラスの内部を隠して、それが何をするかだけを気にすることを意味します。クレジット カード処理クラスが必要な場合は、クレジット カードを「どのように」処理するかはあまり気にしません。あなたはただ行きたいだけです:$creditCardProcessor->charge(10.99, $creditCardNumber);
そしてそれがうまくいくことを期待してください。
一部のメソッドを公開し、他のメソッドを非公開または保護することで、コードをどこから安全に呼び出すことができるかを他の人に知らせるための入り口を残します。public メソッドと変数は「インターフェース」と呼ばれます。
どのクラスにも実装があります。これがクラスがその義務を遂行する方法です。スムージー作りのクラスであれば、どのように材料を追加するか、どのような材料を追加するかなどはすべて実装の一部です。外部コードは、実装を認識したり、気にしたりしてはなりません。
クラスの反対側は、そのインターフェースです。インターフェイスは、クラスの開発者が外部コードによって呼び出されることを意図したパブリック メソッドです。これは、任意のパブリック メソッドを呼び出すことができ、適切に機能することを意味します。
カプセル化を使用する理由はいくつかありますが、最も強力な理由の 1 つは次のとおりです。すべてのオブジェクトが保護されていないと、開発者がそのように操作することを意図していなかった値に、知らず知らずのうちにアクセスしたり変更したりしてしまう可能性があります。
データを非表示にすると、プログラムの概念化と実装が容易になります。
それはすべてカプセル化に関するものです。物事を簡単にする優雅な機能を公開しながら、内部の単調な作業を行うメソッドは非公開です。たとえば、4 つの内部関数を使用してシングルトン db オブジェクトを検証し、クエリを安全にするなどの $product->insert() 関数がある場合があります。開発者が配置した他の構造やフローをアップします。
複数の開発者の状況 (他の人の作業を台無しにしないでください)、または自分の作業を誤って台無しにしないようにするためですか?
主にこの2点です。メソッドをパブリックにすると、「これがクラスがそのクライアントによって使用されることになっている方法」であり、プライベートにすると、「これは警告なしに変更される可能性がある実装の詳細であり、どのクライアントが気にする必要がないか」であり、クライアントはそれに従う必要がありますアドバイス。
十分に文書化されたいくつかの public メソッドを持つクラスは、すべてが public であるクラスよりも、それに慣れていない人 (最初の作成者である可能性があり、6 か月ぶりにそれを見た人) にとってはるかに使いやすいです。あなたが気にしないすべての小さな実装の詳細。
コラボレーションが容易になり、クラスのユーザーに頻繁に変更すべきでない部分を伝え、パブリック メソッドのみを使用する場合にオブジェクトが意味のある状態になることを保証できます。
プライベート/パブリック/何でも区別するほど厳密である必要はありません (言語によって強制されることを意味します)。たとえば、Python では、これは命名規則によって実現されます。非公開としてマークされたものをいじってはいけません。
たとえば、-プライベート/保護されたメソッドは、別の(パブリック)メソッドで呼び出されるクラスの一部である可能性があります。その部分がよりパブリックなメソッドで呼び出される場合、それは理にかなっています。それでも、これらのメソッドが他の場所で呼び出されることは望ましくありません。
クラスのプロパティとまったく同じです。はい、すべて公開のクラスを作成できますが、その面白さは何ですか?