最近、多くのクラスを Python で作成しており、通常は次のようにインスタンス変数にアクセスするだけです。
object.variable_name
しかし、他のモジュールのオブジェクトが、次のような変数にアクセスするためのラッパー メソッドを作成することがよくあります。
object.getVariable()
これらの異なるアプローチの利点/欠点は何ですか? また、一般的に受け入れられているベスト プラクティスはありますか? (例外はありますが)
Python では、属性を取得するためだけにメソッド呼び出しを使用する必要はありません。これを書いた人々はおそらく元 Java プログラマーであり、それは慣用句です。
Python では、属性に直接アクセスすることが適切であると考えられています。属性にアクセスするときにコードを実行する必要があることが判明した場合 (たとえば、属性を動的に計算する場合)、@property
デコレーターを使用する必要があります。
私の控えめな意見では、「ゲッター」(getVariable
フォーム) の主な利点は、署名を変更せずに機能を追加したり、オブジェクトを進化させたりするのがはるかに簡単だということです。
たとえば、オブジェクトが一部の機能の実装から、別のオブジェクトをカプセル化し、プロキシ パターン (構成) を介して同じ機能を提供するように変更されたとします。プロパティにアクセスするためにゲッターを使用している場合、そのプロパティがどこから取得されているかは問題ではなく、コードを使用する「クライアント」には変更が表示されません。
特に自分のコードが他の人によって (たとえばライブラリとして) 再利用されている場合は、ゲッターなどのメソッドを使用します。私のコードが自己完結型の場合、私はあまりうるさくありません。
Java では、これはほぼ必須であり、オブジェクト フィールドに直接アクセスするべきではありません。Python では、そうすることは完全に合法ですが、私が言及したカプセル化の利点を考慮に入れることができます。逆に、直接アクセスはPython では悪い形式とは見なされないことに注意してください。
getVariable() および setVariable() メソッドを作成することをカプセル化と呼びます。このプラクティスには多くの利点があり、オブジェクト指向プログラミングで好まれるスタイルです。
メソッドを介して変数にアクセスすることにより、設定/取得しようとしている値が正しいことを確認することにより、「エラーチェック/処理」の別のレイヤーを追加できます。
setter メソッドは、変数が変更されたことをリスナーに通知するなど、他のタスクにも使用されます。
少なくとも java/c#/c++ などでは。