AS3の暗黙的vs明示的なゲッター/セッター、どちらを使用するか、なぜですか?
-
04-10-2019 - |
質問
AS3の出現以来、私はこのように働いてきました:
private var loggy:String;
public function getLoggy ():String
{
return loggy;
}
public function setLoggy ( loggy:String ):void
{
// checking to make sure loggy's new value is kosher etc...
this.loggy = loggy;
}
そして、このように働くことを避けました:
private var _loggy:String;
public function get loggy ():String
{
return _loggy;
}
public function set loggy ( loggy:String ):void
{
// checking to make sure loggy's new value is kosher etc...
_loggy = loggy;
}
AS3の暗黙のゲッター/セッターを部分的に使用して避けました。これにより、「Get ..」と入力するだけで、コンテンツアシストがすべてのゲッターのリストを提供し、同様にセッターのリストを提供します。また、コードのアンダースコアが嫌いで、暗黙のルートをオフにしました。
もう1つの理由は、私がこれの感触を好むということです:
whateverObject.setLoggy( "loggy's awesome new value!" );
これに:
whateverObject.loggy = "loggy's awesome new value!";
前者は、コードで実際に起こっていることをよりよく反映していると感じています。値を直接設定するのではなく、関数を呼び出しています。
フラッシュビルダーと素晴らしい新しいプラグインをインストールした後 Sourcemate (FDTがFBで有名な有用な機能のいくつかを取得するのに役立ちます)SourceMateの「Generate Getters and Setters」を使用すると、暗黙的なルートを使用してコードを自動的に設定することがわかりました。
private var _loggy:String;
public function get loggy ():String
{
return _loggy;
}
public function set loggy ( loggy:String ):void
{
// do whatever is needed to check to make sure loggy is an acceptable value
_loggy = loggy;
}
これらのソースメイトの人々は、自分が何をしているのかを知っている必要があるか、AS3でコーディングするためのワークフローエンハンスメントプラグインを書いていないので、今は自分のやり方に疑問を呈していると思います。
だからあなたへの私の質問は、誰でも私に明示的なG/sの方法をあきらめ、暗黙のテクニックの使用を開始し、私のプライベートVARのためにそれらの臭い小さな_underscoresを受け入れるべき理由を私に与えることができますか?それとも、私がやるように物事をする理由で私をバックアップしますか?
解決
正直に言うと、これはインデントやブレーススタイルによく似ていると思います - あなたのスタイルをどんなコードベースにも一致させることの重要性/有用性は、どちらのアプローチにも「固有の」利点を除いています。とはいえ、これらのどれが物理エンジンで維持したいですか?
// with getters
body.position.y += body.velocity.y * dt;
// without
body.getPosition().setY( body.getPosition().getY() + body.getVelocity.getY() * dt );
ゲッター/セッターのもう1つの利点は、最初にプロパティを簡単なパブリック変数にすることができ、外部コードを変更せずに必要に応じて後でゲッター/セッターにリファクトすることができることです。すべての変数のアクセサを先制的に構築する必要はありません。あなたはそれらが必要だと決めるまで待つことができます。
他のヒント
頭の上からいくつかの理由を考えることができます。
- 暗黙的なGET/セットは、より良い/簡単なデータバインディング機能を提供します。 「フレックスモデル」にイベントを配線してフィットする方が簡単です。
- 生成されたASDOCがより簡潔になります。
- デザインビューで作業しているときに、カスタムコンポーネントのプロパティインスペクターにプロパティを取得する唯一の方法だと思います。
あなたがしていることがまっすぐにget/setである場合、公共のvarを公開し、保持var(_variable)でゲッター/セッターをバイパスするだけで、それほど失われていないことに留意してください。クラスを外部インターフェイスを変更せずに、後で暗黙のGet/Setにいつでも変更できます。
リファクタリングとコードの読みやすさを強化すると、暗黙のゲッターは使用しません。通常、割り当てがパブリックフィールドにある場合、またはアクセサの方法である場合、見つけるのはそれほど簡単ではありません。したがって、バグを追跡したい場合は、厄介な狩猟に陥る可能性があります。