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

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




前橋です。

井浪さん:
>「引数を渡すから」オブジェクトと結びつかない、と言う反対の見
>方もあるわけで。
>
>class 社員CLASS {
>  private int 入社年;
>  private int 役職;
>    :
>  public static int 給与計算(int 勤続年数, int 役職コード ...)
>  {...};
>    :
>}
>な関数が有ったとして、結局「勤続年数」「役職コード」は何から
>取得するか考えると、社員の情報から取得して渡す、ってことに
>なるんだと思います。

...と、こういうことを書いていたわけではないのでして、

私:
>この場合、たとえば、publicにするのは最終的な給料を返すメソッ
>ドだけで良いとして、4のメソッドを実現するときに、privateな
>2, 3のメソッドを呼ぶわけですが、そいつらの作り方として 2案あ
>りまして、

というわけで、私が想定していた例では、最終的な給料を返すメソッ
ドだけがpublicで、残りはprivateのつもりだったのですが。

publicなメソッドは、確かに引数なし(かつ、インスタンスメソッ
ド)でいいと思います。
# というか、こいつに引数を付けるようでは、「社員」のメンバに
# している意味なしでしょう。

でも、そのメソッドの内部は、擬似コードで書いても、日本語で考
えても、

・勤続年数と等級から、基本給を出してぇー、
・管理職でなかったら、
  - 残業時間から残業手当を算出してぇー、
  - それを基本給に足してぇー、

となりますよね。

これを1行1メソッドに分割すると、「関数」という解釈が一番自然
なのではないかと。

  「××と××から、××を出してぇー」

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

さすがにこれやってたらマヌケですね。

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

前述のように、私の例では、これは、社員のクラスの中の、
calcSalaryメソッド内部の変更だけで済みます。

もっとも、先の例で言えば、

・勤続年数と等級から、基本給を出してぇー、

この「基本給」を定義するものが、勤続年数と等級だけではなくな
る日が、いつか来るかも知れませんが、そういう場合、
calcBaseSalary()の引数がひとつ増えた方が、むしろ安全ではない
でしょうか(どうせここだけの修正で済むのですし)。

給料の計算方法はどうなってんのかな、と確認に来る人は、当然まっ
さきにcalcSalary()のコードを読むわけで、その時、

・「基本給」の定義があいまいだ、なんてことは、このレベルのロー
  カル変数なら、ありがちなことです。
  # ここでは、たまたま「基本給」という、ちゃんと定義されてそ
  # うな値なんですけれども、プログラムを書く上で、一時的に算
  # 出される値だと、仕様書とかにいちいち定義しないものも多い
  # 筈です。
  ## だいたいドキュメントなんて、ないか、探し出せないか、探
  ## し出せても間違ってるか(;_;)
・で、それを計算しているcalcBaseSalary()に引数が付いていれば、
  ここで算出されているのが何なのか、ということが、一目でわか
  ります。

>この点から考えれば、(個人的には)
>> (1)引数なしのメソッドにする。プライベートメンバの勤続年数・等
>>   級などを参照する。
>の方が、作る時も、メンテナンス時も非常に楽です。

クラスの外から見れば、その通りです。

>------------------------------
>あとは好みの問題かもしれませんが、
>
>class 経理部 {
>  public static int 給与計算 (社員CLASS 社員) {
>     return 給与計算( 社員.get勤続年数(),
>                      社員.get役職(),
>                      社員.get資格(), ....
>  }
>
>  private stataic int 給与計算(int 勤続年数....) {
>    :
>  }
>}
>
>のような、社員とは関係無い classに給与計算のprivateな「関数」
>を用意しておいて、publicな方で「社員」を受け取りその社員情報
>で関数呼出し〜、みたいな方が好みです。
># 一目で理解できるかどうかは別の話 :-)

確かに、staticメソッドにするなら、別のクラスに括り出しても良
いような気はするんですが、でも、呼ぶ奴が「社員」だけなら...

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