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

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





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

#メソッドと変数は目的が違うのでsubjectをちょっと変えました。

皆さんがどう考えて実装しているか気になります。。。

Kazuya Maebashi <maebashi@xxxxxxxxxx> wrote:
at [Fri, 23 Apr 1999 17:08:55 +0900]
> たとえば、aとbからcを算出する関数があったとして、Cで書けば、
(省略)
> この場合、a, b, c 共にHoge自身のデータメンバなので、
> 
>   private void calcC();
> 
> でも書けることになっちゃいます。

そうなりますね。


> でも、Cに慣れた身には、これはとてもとても読みにくいというか、
> 何やってるかわからんというか、まるでグローバル変数渡しばっか
> りやってた(しかできなかった)BASICプログラマの頃に戻ったよう
> だ、と感じてしまうのです。

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

結果、calcC()はカプセル化がされていて、わかりやすいと思います。


> こういうパターンは、a, b, cの関係に制約を付けたい場合など、
> よくあると思うのです。
> 
> こういうとき、calcC()を、以下のようにstaticメソッドにすれば、
> 
>   private static int calcC(int a, int b)
> 
> thisがないのでインスタンスメンバは全部見えないわけで、calcC
> がそういうメンバにアクセスしていないことが保証できて、安心で
> きるように思います。
> 
> でも、こういうstaticの使い方って、少なくとも入門書とかでは、
> あんまり聞かないような気がするのですが...
> 
> こういう使い方は、間違ってるのでしょうか?

どのような制約を持たせたいのかがつかめなかったのですが、
aとbからcを求めるという汎用的な計算ロジックにしたいので
あれば、クラスメソッド(staticなメソッド)にしても良いと
思います。

#この例ではprivateなので汎用性はありませんけど。。。


> こういう使い方が間違っているのなら、上記のようなメソッドは、
> どう書けば良いのでしょうか?

私はクラスメソッドとインスタンスメソッドを切り分ける判断材料の
一つとしては属性にアクセスしない処理かどうか、汎用性の高い処理か
どうかを考えます。
なので、必然的に定型処理の集約に利用する場合が多いです。

#privateなクラスメソッドにする場合はほとんどないです。
#クラス変数の値を生成する場合ぐらいかな。


> それとも、ひとつのクラスの中で、データメンバの参照や破壊に気
> を使っている時点で、オブジェクトの粒度が大き過ぎるのでしょうか?
> # ...とは言ってもねえ。

うーん、ちょっと私にはこの意味が理解できませんでした。


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