セッターとゲッターを介してプライベートメンバーにアクセスできる場合、プライベートの用途は何ですか?
5 に答える
カプセル化を適用するには、プライベートが必要です。何かの実装をインターフェイスから分離しておくことは、オブジェクト指向プログラミングの基本的なパラダイムの 1 つです。これにより、異なるプログラム部分間の結合が減少し、長期的には保守が容易になります。
次の例を見てください。
class toto {
private String someThing;
public String getSomething();
public void setSomething(String Something);
}
上記のように単に someThing を公開するように変更した場合、コードが少なくなることは確かですが、ある日、その someThing を新しい機能のためにより複雑なオブジェクトに変更する必要があり、古いコードは文字列で問題なく動作する場合は、変更する必要があります。すべての。someThing の内部表現を分離することで、システムをより簡単に進化させることができます
class toto {
private ComplexSomeThing someThing;
public String getSomething(){ someThing.toString();}
public void setSomething(String something){ something = new ComplexSomeThing(something);}
public ComplexSomeThing (getComplexSomething();
public void setComplexSomething(ComplexSomething someThing);
}
カプセル化を良いこと (tm) にする理由は他にもありますが、これは要点を説明する愚かな例にすぎません。
編集現在、保護された対プライベートを使用するか、ゲッターとセッター(Javaのように)ではなく一部の言語(Delphi、C#)でプロパティに似た概念を使用することについて、多少の議論があります。プライベートではなく保護されていると、コードのクライアントによる変更が容易になりますが、システムの内部がより公開されるため、API の使いやすさと保守のしやすさのバランスを取る必要があります。ただし、カプセル化の基本原理はそのままです。どのオプションを選択しても、一貫性があり、同じレベルの抽象化で機能を公開し、これがどのように行われるかについての詳細を隠す必要があります。
私にとっての議論は、プライベートに対するジハードを宣言することではなく、API の一貫性を壊さずに拡張性と柔軟性を提供する方法を見つけることです。
さらに掘り下げたい場合は、プライベートについての興味深い読み物を次に示します。 ただし、プライベートについて意見を述べる前に、カプセル化とポリモーフィズムの概念を実際に習得する必要があることを強調しなければなりません。
ゲッターとセッターはプロキシとして機能できるためです。クラスの実際の内部を非表示にし、外部クラスのみがメソッドを介してデータにアクセスできるようにします。クラスの内部を好きなように扱うことができます。
ゲッター/セッターに名前が付けられgetName()
、プロパティが と呼ばれるname
からといって、常にそのようになるとは限りません。
変数を に変更したい場合はどうでしょうfullName
。パブリック変数に直接アクセスすると、変更によって多くのコードが壊れます。代わりに、どこgetName()
からデータを取得するかを単純に再マップできます。
これの最も良い例の 1 つは、URL の作成と操作を可能にする独自の URL クラスです。スキームを設定したい場合は、 を取得できます$obj->setScheme()
。ただし、URL を変更するたびに手動で文字列を作成しているのか、別のパーツとして保存しているのかはわかりません。これにより、必要に応じてデータを保存できるため、柔軟性が得られます。
さらに、データを保存する前に操作を実行できます。私の URL クラスでは、すべてのスキームとホスト名が小文字であると想定しています。setHost()
保存されたすべての文字列を小文字に変換してから保存することで、これを標準化できます。パブリック変数を使用した場合、データを入れたクライアントがそれを正しく格納していると想定する必要があります。
また、渡される情報を検証して有効なデータであることを確認し、そうでない場合はエラーを発生させることもできます。
すべての変数にゲッターとセッターを入れるよう強制する人は誰もいません。実際、多くの「オブジェクト指向のカプセル化」チュートリアルでは、何らかの理由でこれを常に行っているにもかかわらず、すべての変数にプライベート メンバー + ダミーのゲッターとセッターをやみくもに使用することは無意味です。1 つには、このようなカプセル化は、同時実行性の観点からはカプセル化ではありません。
あなたが本当に理解したいのは、パブリック フィールドだけを使用するのではなく、プライベート バッキング フィールドを持つパブリック プロパティを使用する理由だと思います。このような SO にはいくつかの質問があります。ここに1つあります: