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

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





こんにちは。
西沢@イーサー・プラニックです。

On Mon, 26 Apr 1999 20:33:15 +0900
Kazuya Maebashi <maebashi@xxxxxxxxxx> wrote:
> retainABC()や、calcC()には、引数もなければ戻り値もないので、
> 「どうやらa, b, cの整合性を維持しているらしい」とか、
> 「cを計算しているらしい」ということが名前から推測されるだけで、
> 
> 実は dも参照していたり、a や bを破壊していたり、cに何の影響
> も与えていなかったりしていない、ということを、コード上で保証
> してくれていない、という心地悪さがあるのです。

そのクラスが責任を持つという責任範囲が明確になっていれば、
気にならないと思います。


> うーん、具体的な例がないかな、と考えていたのですが。
> 
> たとえば、「社員」オブジェクトの「給料」を再計算するとして、
> 
> ・「勤続年数」と「等級」から、「基本額」を出して、
> ・それに、「勤務評価」を掛けて、
> ・「残業時間」から、「残業手当」を算出して、
> ・でも、「残業手当」が一定額を超えた場合、上限の値に丸める。
> 
> という処理だったりすると、上記の処理それぞれについてメソッド
> が必要になりますよね。
> 
> そして、それぞれのメソッドの、入力と戻り値ははっきりしていま
> す。だから、それを引数と戻り値にする方法が、やりたいことを最
> も直接的に表現していると思うのです。

算出するロジックから見た関数のイメージですね。


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

確かにそうですね。

もし、この「社員」クラスにサービスとして私があれば良いと思うのは

1.属性のアクセッサメソッド(勤続年数、等級、勤務評価、残業時間)
2.基本給を返すメソッド(算出ロジック)
3.残業手当を返すメソッド(算出ロジック)
4.最終的な給料を返すメソッド(算出ロジック)

といった感じで、1で属性を定義し、2〜3は4が使い、そして
実際は本人の最終的な給料だけ知りたいので4で結果を取り出す。
属性の変更は行わない。
という実装にでもなるのかなぁと思います。

#雰囲気がつたわったか、ちょっと心配(^^;)


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

特化していれば、staticにする必要はないような気がします。
似たクラスの関係なら抽象クラスを作ってそこへ実装すれば良いかと
思います。

#staticなメソッドから呼ばれる場合はstaticじゃないとだめですが。


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

うーん、関数の感覚はJavaではあまり必要ないと私は思いますが
他の皆さんはどうなんでしょう?


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

うー、破綻する場合が想像できませんでした。
属性(インスタンス変数)で破綻するケースってどんな場合があるか
想像力が貧困で浮かびませんでした。
良かったら、もう少し詳しく教えてください。m(_ _)m


----------------------------------------
西沢 篤行 <anishi@xxxxxxxxxx>
株式会社イーサー・プラニック
Tel 03-5822-1330 / Fax 03-5822-1338