黙示的なgetter/setterのメソッド名はどうするか
黙示的なgetter/setterのメソッド名はどのような指定にしたらのだろうと考えてみました。
ActionScript2.0ではJavaと同じようにクラス設計によるコーディングが可能です。クラスには publicとprivateなプロパティとメソッドを設定することが可能です。
次のSampleクラスでは userListというプロパティをprivateに、コンストラクタとmainメソッドをpublicに指定しています。
class Sample{ /* プロパティ */ private var userList:Array; /* コンストラクタ */ public function Sample(){ this.userList = new Array(); } /* メイン処理 */ public function main():Void{ } }
userListのようにprivateに設定しておくと、外部クラス等からuserListを参照/操作することが不可能になります。仮にuserListをpublicに設定したとすると、userListは外部のクラスから操作されているかもしれないことを考慮せねばならず、Sampleクラス内でuserListを操作する処理を安易に付け加えることができなくなります。privateに指定しておけば 他クラスからの操作による影響は考えなくて済むので 安心して操作処理を付け加えることが可能です。
※ActionScript2.0のprivateはJavaのような厳密なprivateではないので、外部からアクセスできる方法は色々あります。が、ここではあえてその外部からアクセスする方法をとらないことを前提にします。
privateで外部からアクセス不能にしたはいいですが、SampleクラスのuserListの内容を参照したい場合がでてきます。そのような場合はgetterメソッドを用意し間接的にuserListのデータを参照できるようにします。
class Sample{ private var userList:Array; public function getUserList():Array{ return this.userList; } } //外部からの使用例 var sample:Sample = new Sample(); trace( sample.getUserList() );
getterのメソッド名には上記のように「get + プロパティ名」という名前をつけます。
また、上記getterを用意する他に Flash特有の黙示的なget/setメソッドを利用することが可能です。
黙示的なget/setメソッド(FumioNonaka.com)
黙示的なgetメソッドを用いると次のようになります。
class Sample{ private var userList:Array; public function get getUserList():Array{ return this.userList; } } //外部からの使用例 var sample:Sample = new Sample(); trace( sample.getUserList );
外部からuserListを参照しようとした場合、getUserListの後に括弧表記は必要なく sampleメソッドのプロパティを直接参照しているように表記できます。また、setterは設定していないのでuserListの参照は可能でも操作することはできません。
がここで、get getUserList() というメソッドの宣言はgetが二度続いてしまっておりメソッド名もやや長いため、使用する際 通常のgetterよりも ほんの少し短い記述で済むという恩恵がほとんど受けられません。「user」といった感じの短いメソッド名にすることもできますが、外部からSampleクラスのuserListを参照しているということを明確化したいために「userList」という名前はどこかに用いたいところです。getterメソッド名をそのまま「userList」としてしまいたいところですが、プロパティとメソッド名が重複してしまっているためその記述はできません。
そこで、getterのメソッド名かプロパティのuserListのどちらかにアンダーバーでもつけようかと考えました。
まず、プロパティにアンダーバーを付けgetterのメソッド名をuserListとした場合、外部からuserListを参照する場合次のようになります。
class Sample{ private var _userList:Array; public function get userList():Array{ return this._userList; } } //外部からの使用例 var sample:Sample = new Sample(); trace( sample.userList );
この場合ですが 外部からSampleクラスのuserListを参照する側から見た時、sample.userListという表記は SampleクラスのpublicなuserListプロパティを参照しているのか それともgetterのuserListを利用しているのか判断がつきません。
次に、getterメソッド名にアンダーバーを付けてみます。
class Sample{ private var userList:Array; public function get _userList():Array{ return this.userList; } } //外部からの使用例 var sample:Sample = new Sample(); trace( sample._userList );
メソッド名にアンダーバーをつけていることにより外部からはgetterを呼び出しているということが明確になります。よって結論は
getterのメソッド名は 「 アンダーバー + プロパティ名 」にする
ということにしました。
※プロパティ名にアンダーバーをつけないことを前提とした時にかぎります。
Javaでは変数名の前にアンダーバーをつける事はないので そのスタイルに習っています。
まあ、素直に黙示的なget/setメソッドを利用せず、通常のgetter/setterを用いればいい話かもしれませんね。