!!privateメソッドを作りたくなった時は存在するべきクラスを見逃している
このページの見出しを見て「えっ?!」と思う人は多いでしょう。でも、私がマネージメントする開発では「privateメソッド禁止」は当たり前なんです。\\
例を使った下の説明で詳しい内容は理解して欲しいのですが、要点だけを言うと、
!「privateメソッドに渡すパラメータをひとかたまり(データ構造)とするクラスを見逃している。」
ということです。

!!顧客会社クラスで考えてみる
商取引を扱うシステムで良く出てくる「顧客会社」クラスを使って考えてみます。\\
[{Image src='img.jpg'}]
「担当者姓」と「担当者名」という属性がこのクラスの中にはあります。そしてこの二つの値を使ったメソッド「担当者氏名を返す」を考えてみます。姓と名の間にスペースを挟んで返す仕様だとします。コードは次のようになるでしょう。
%%prettify 
{{{
public String getTantoushaFullName() {
    return this.tantoushaSei + " " + this.tantoushaMei;
}
}}}
/%
\\
次に、このクラスが仕様変更となり、「代表者姓」と「代表者名」という属性が追加されたとします。「代表者氏名を返す」というメソッドもこの時必要になったとすると、以下のようなコードを追加することでしょう。
%%prettify 
{{{
public String getDaihyoushaFullName() {
    return this.daihyoushaSei + " " + this.daihyoushaMei;
}
}}}
/%
\\
そして次に、「いずれの氏名を返す時も、姓と名の間のスペースを2つに替えて欲しい。」という要望が挙がったとします。よく見てみると上記二つのメソッドは非常に良く似ています。「スペースを挟んで姓と名を連結する」という仕様だからです。こういう時、privateメソッドを作っておくと変更が一カ所で済んだはずです。次のようなコードです。
%%prettify 
{{{
private String getFullName(String sei, String mei) {
    return sei + "  " + mei;
}

public String getTantoushaFullName() {
    return getFullName(this.tantoushaSei, this.tantoushaMei);
}

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

!!ユーティリティクラスを作ってみる
こういう場合に皆さんが思いつくのはユーティリティクラスと呼ばれる「関数」ではありませんか? 次のようなコードです。
%%prettify 
{{{
public class StringUtility {
    public String getFullName(String sei, String mei) {
        return sei + "  " + mei;
    }
}

public class KokyakuKaisha {
  :
  :
    public String getTantoushaFullName() {
        return StringUtility.getFullName(this.tantoushaSei, this.tantoushaMei);
    }

    public String getDaihyoushaFullName() {
        return StringUtility.getFullName(this.daihyoushaSei, this.daihyoushaMei);
    }
}
}}}
/%
別のページでも書きましたが、このようなユーティリティクラス(インスタンス変数にもクラス変数にもアクセスしないメソッド群)はそもそもオブジェクト指向の原則である「データ構造と関数の一体化」を崩してしまいます。その結果どういう事が起きるかを考えてみます。\\
システムを国際化対応する必要がもしも出てきて、「担当者ミドルネーム」「代表者ミドルネーム」という属性が追加になったとします。この時、「氏名を返すメソッドは全て『姓 ミドルネーム 名』(間のスペースは一つずつ)とする」という要件に替わったとします。\\
この場合の変更箇所はStringUtility.getFullName()メソッドのみではなく、それを呼び出している全メソッドが対象となってしまいます。\\
なぜそうなってしまうかというと、「データ構造と関数が分離されているから」です。オブジェクト指向のメリットは「データ構造と関数の一体化」 によって産まれるのに、それに従っていない造りだからです。\\
!!だからprivateメソッド禁止!
上記のコードがどこで間違ったかというと、privateメソッドを作りたくなった時にクラスを見逃したからです。