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

[jfriends] 関数と引数とメンテナンス効率、とか




元々の staticがどうたら、と言う話とは関係無いです(^^;

On Wed, 28 Apr 1999 11:51:22 +0900
「[jfriends] Re: [jfriends] Re: staticの使い方(メソッド)」にて
Kazuya Maebashi <maebashi@xxxxxxxxxx> wrote:

> (1)引数なしのメソッドにする。プライベートメンバの勤続年数・等
>   級などを参照する。
> (2)引数として勤続年数・等級などを受け取るようにする。
> 
> (2)の方が、「算出ロジック」という趣旨に合致しているのではな
> いかと。


> 関数といえば、引数を与えて、戻り値を返すモノであり、同じ引数
> を与えれば必ず同じ値を返します(Cの関数はそうではないですが)。
> 関数が状態を持たないものであるなら、それはオブジェクトと結び
> 付いているべきではないだろう、と思うわけです。

「引数を渡すから」オブジェクトと結びつかない、と言う反対の見
方もあるわけで。

class 社員CLASS {
  private int 入社年;
  private int 役職;
    :
  public static int 給与計算(int 勤続年数, int 役職コード ...)
  {...};
    :
}
な関数が有ったとして、結局「勤続年数」「役職コード」は何から
取得するか考えると、社員の情報から取得して渡す、ってことに
なるんだと思います。

擬似コードで書くと、
---
 社員CLASS したっぱー井浪 = new 社員CLASS( ....);
 int salary = 社員CLASS.給与計算( したっぱー井浪.get勤続年数(),
                                  したっぱー井浪.get役職(), ..);
---
こんな感じになるんでしょう。
この、引数に渡すために、社員の情報を1個ずつ取り出すほうが、
面倒と言うか、マヌケ臭い気がします。

さらに
> (2)引数として勤続年数・等級などを受け取るようにする。
な方法は、私の経験でいけば、間違いなくメンテナンス時に破綻し
ます。
「今年から(情報処理等の)有資格者は、資格手当てが出るように
なるぞ」っと言うような、給与体系に変更があった場合、引数に
渡さなければならない情報が増えた結果、あれも直してこれも直
して……あぁあっちでも給与計算の関数を呼んでる〜、と、どこ
でこの関数を呼び出してるか調べまくって、直しまくる、と言う
やや不毛な作業が待ってます。
# 現状の COBOLなんかでは当たり前におこってますが、空しいです。

この点から考えれば、(個人的には)
> (1)引数なしのメソッドにする。プライベートメンバの勤続年数・等
>   級などを参照する。
の方が、作る時も、メンテナンス時も非常に楽です。
# COBOL,Fortran等に比べて、オブジェクト指向のありがたみが
# 最初に理解できた例でした。

------------------------------
あとは好みの問題かもしれませんが、

class 経理部 {
  public static int 給与計算 (社員CLASS 社員) {
     return 給与計算( 社員.get勤続年数(),
                      社員.get役職(),
                      社員.get資格(), ....
  }

  private stataic int 給与計算(int 勤続年数....) {
    :
  }
}

のような、社員とは関係無い classに給与計算のprivateな「関数」
を用意しておいて、publicな方で「社員」を受け取りその社員情報
で関数呼出し〜、みたいな方が好みです。
# 一目で理解できるかどうかは別の話 :-)

---
井浪@xxxxxxxxxx % COBOLer会社な空しい人