[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
------------------------------------------------------------