[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends] Re: [jfriends] Re: staticの使い方(メソッド)




前橋です。

高橋さん、西沢さん、ご意見ありがとうございます。

高橋さん:
>cが、aとbから導き出される場合、aやbを変更するメソッドの中でcを更新
>すれば、a,b,cの間の制約が表現できます。
<中略>
>   private void retainABC() {
>      c = a + b;
>   }
>}
>こうしておけば、aやbを変更すればcが自動的に更新されるようになります。

西沢さん:
>そんなこともないと思いますよ。
>このcalcC()は c の値を計算するというサービスであると読むと、
>スッキリしてしまいます。
>c を再計算?させるためのメソッドであり、計算方法は calcC()
>だけが知っていれば良いので、使う側は a と b の関係はなんら
>気にしないのです。

この場合、

retainABC()や、calcC()には、引数もなければ戻り値もないので、
「どうやらa, b, cの整合性を維持しているらしい」とか、
「cを計算しているらしい」ということが名前から推測されるだけで、

実は dも参照していたり、a や bを破壊していたり、cに何の影響
も与えていなかったりしていない、ということを、コード上で保証
してくれていない、という心地悪さがあるのです。

うーん、具体的な例がないかな、と考えていたのですが。

たとえば、「社員」オブジェクトの「給料」を再計算するとして、

・「勤続年数」と「等級」から、「基本額」を出して、
・それに、「勤務評価」を掛けて、
・「残業時間」から、「残業手当」を算出して、
・でも、「残業手当」が一定額を超えた場合、上限の値に丸める。

という処理だったりすると、上記の処理それぞれについてメソッド
が必要になりますよね。

そして、それぞれのメソッドの、入力と戻り値ははっきりしていま
す。だから、それを引数と戻り値にする方法が、やりたいことを最
も直接的に表現していると思うのです。

うーん、この場合だと、「給与計算クラス」というstaticメソッド
だけのクラスを作る方が妥当なような気がしますが...

もちょっと、各クラスに特化した、ちょっとした計算を、ひょいっ
とする時に、そのメソッドはどこに置くべきかなあ、という疑問です。

プロシージャでなく、関数なら、副作用はあってはいけないだろう、
と思いますし。

VC++で、似たような状況になったときには、結局ファイルスコープ
のstatic関数を書いてしまいました。

西沢さん:
>どのような制約を持たせたいのかがつかめなかったのですが、
>aとbからcを求めるという汎用的な計算ロジックにしたいので
>あれば、クラスメソッド(staticなメソッド)にしても良いと
>思います。
>
>#この例ではprivateなので汎用性はありませんけど。。。

そうですね。privateでも、クラス内の他の箇所から呼ばれる可能
性はありますが。

西沢さん:
>> それとも、ひとつのクラスの中で、データメンバの参照や破壊に気
>> を使っている時点で、オブジェクトの粒度が大き過ぎるのでしょうか?
>> # ...とは言ってもねえ。
>
>うーん、ちょっと私にはこの意味が理解できませんでした。

クラスが充分に小さければ、インスタンスメンバをあっちこっちで
参照していても、破綻しなくて済むのかな、という意味です。

------------------------------------------------------------
  前橋 和弥                             maebashi@xxxxxxxxxx
  中部ソフトエンジニアリング(株)
    〒450 名古屋市中村区名駅4-10-25(名駅IMAIビル 5F)
    Tel:(052)583-4511(代) 内線 252 Fax:(052)583-4566
------------------------------------------------------------