カレンダー

2023/07
      
     

広告

Twitter

記事検索

ランダムボタン

言語化できない理解度

by 唐草 [2023/07/13]



 JavaやC#には、getter / setterと呼ばれるマナーレベルの記述ルールがある。
 値を直接ではなく関数を介して操作しようという考え方だ。一般論だと異抽象度が高くて分かりにくいので、ゲームを例に説明しよう。
 攻撃力を取得するとき力の値を参照するだけでは不十分。力が、状態異常で低下していたり、装備で上がっているかもしれない。それらの影響を力を参照したあとに毎回確認するのは手間。そこで、攻撃力取得関数という処理を書いて、状態異常や装備の影響を計算した値を取得できるようにする。こうすることで様々な影響を考慮せずに値を得られるようになる。これがgetter。
 setterは値の変更に使う。HPを100回復させたら最大HPを超えてしまうかもしれない。その際に最大値を超えないように書き換えるのがsetterの仕事の1つ。
 このような処理以外にも誤った書き換えを防いだりと様々な使い方がある。特に有用なのは他人の書いたプログラムを使うとき。getterがあれば細かいルールを気にせず値を取得できる。またsetterがなければ値の書き換えが禁止されていると分かる。
 ひと手間挟んでもgetter / setterを用意する意義はある。
 ぼくはJavaでgetter / setterを学んだので常に関数として実装する癖がある。だが、getter / setterはあくまでマナーレベル。いろいろな書き方があるし、言語によって仕様が違う。
 ゲーム開発に用いるC#には、言語仕様にgetter / setterが組み込まれている。Javaのように関数化してもいいし、言語仕様を利用して変数のように設定することもできる。
 C#経験の乏しいぼくは、2通りの書き方をどう使い分けるかを判断できない。正直、どっちだっていいじゃんと思ってしまう。だが、実際に書いているとおぼろげながら線引の基準があるのは分かる。
 とは言え、その境がどこにあるのかを言語化できるほどは理解できていない。その混乱具合は、ぼくの書いたコードを見ればよく分かる。