This is version . It is not the current version, and thus it cannot be edited.
[Back to current version]   [Restore this version]

privateメソッドを作りたくなった時は存在するべきクラスを見逃している#

このページの見出しを見て「えっ?!」と思う人は多いでしょう。でも、私がマネージメントする開発では「privateメソッド禁止」は当たり前なんです。
例を使った下の説明で詳しい内容は理解して欲しいのですが、要点だけを言うと、

「privateメソッドに渡すパラメータをひとかたまり(データ構造)とするクラスを見逃している。」#

ということです。

顧客会社クラスで考えてみる#

商取引を扱うシステムで良く出てくる「顧客会社」クラスを使って考えてみます。
このクラスの中には「担当者姓」と「担当者名」という属性があります。そしてこの二つの値を使ったメソッド「担当者氏名を返す」を考えてみます。姓と名の間にスペースを挟んで返す仕様だとします。コードは次のようになるでしょう。
public String getTantoushaSimei() {
    return this.tantoushaSei + " " + this.tantoushaMei;
}

次に、このクラスが仕様変更となり、「代表者姓」と「代表者名」という属性が追加されたとします。「代表者氏名を返す」というメソッドもこの時必要になったとすると、以下のようなコードを追加することでしょう。
public String getDaihyoushaSimei() {
    return this.daihyoushaSei + " " + this.daihyoushaMei;
}

そして次に、「いずれの氏名を返す時も、姓と名の間のスペースを2つに替えて欲しい。」という要望が挙がったとします。よく見てみると上記二つのメソッドは非常に良く似ています。「スペースを挟んで姓と名を連結する」という仕様だからです。こういう時、privateメソッドを作っておくと変更が一カ所で済んだはずです。次のようなコードです。
private String getSimei(String sei, String mei) {
    return sei + "  " + mei;
}

public String getTantoushaSimei() {
    return getSimei(this.tantoushaSei, this.tantoushaMei);
}

public String getDaihyoushaSimei() {
    return getSimei(this.daihyoushaSei, this.daihyoushaMei);
}
こうしておけば、間に挟むスペースが3つに替わろうが変更箇所は1カ所で済みます。
果たして本当にそうでしょうか? 例えば「仕入れ先」クラスが別にあったとして、その属性にも「担当者姓」「担当者名」があったとしたらどうでしょう? そしてそのクラスにも「担当者氏名を返す」というメソッドが必要で、「姓と名の間にスペースを2つ挟む」という仕様だったら?

ユーティリティクラスを作ってみる#

添付ファイルの追加

ログイン済のユーザのみが添付ファイルをアップロード出来ます。

添付ファイル一覧

Kind Attachment Name Size Version Date Modified Author Change note
png
custocompany1.png 3.3 kB 1 25-6-2011 03:28 ytp
png
custocompany2.png 4.1 kB 1 25-6-2011 03:28 ytp
png
name.png 8.2 kB 4 31-12-2011 21:46 ytp
png
name2.png 8.3 kB 3 31-12-2011 21:43 ytp
png
supplyer.png 3.4 kB 1 25-6-2011 03:28 ytp
« This particular version was published on 19-6-2011 00:02 by ytp.