At line 28 changed one line |
そして次に、「いずれの氏名を返す時も、姓と名の間のスペースを2つに替えて欲しい。」という要望が挙がったとします。よく見てみると上記二つのメソッドは非常に良く似ています。「スペースを挟んで姓と名を連結する」という仕様だからです。こういう時、privateメソッドを作っておくと変更が一カ所で済んだはずです。次のようなコードです。 |
そして次に、「いずれの氏名を返す時も、姓と名の間のスペースを2つに替えて欲しい。」という要望が挙がったとします。よく見てみると上記二つのメソッドは非常に良く似ています。「スペースを挟んで姓と名を連結する」という仕様だからです。こういう時、privateメソッドを作っておくと変更が一ヶ所で済んだはずです。次のようなコードです。 |
At line 45 changed one line |
が、果たして本当にそうでしょうか? 例えば「仕入れ先」クラスが別にあったとして、その属性にも「担当者姓」「担当者名」があったとしたらどうでしょう? そしてそのクラスにも「担当者氏名を返す」というメソッドが必要で、「姓と名の間にスペースを2つ挟む」という仕様だったら? そのクラスにも同じようなprivateメソッドが必要になってしまい、仕様変更への対応が1カ所というわけにいかなくなってしまいます。\\ |
が、果たして本当にそうでしょうか? |
例えば「仕入れ先」クラスが別にあったとして、その属性にも「担当者姓」「担当者名」があったとしたらどうでしょう? そしてそのクラスにも「担当者氏名を返す」というメソッドが必要で、「姓と名の間にスペースを2つ挟む」という仕様だったら? そのクラスにも同じようなprivateメソッドが必要になってしまい、仕様変更への対応が1ヶ所というわけにいかなくなってしまいます。\\ |
At line 48 added 56 lines |
!!privateメソッドとは何か? |
上記の例で解るように、__some bold text「privateメソッドを作りたくなった時はクラスを見逃している」__のです。\\ |
privateメソッドはクラス内の共通関数に当たるのですが、共通関数を作ろうとすれば、その関数に渡すパラメータもそもそも共通化する必要があります。そのパラメータをひとかたまりとするクラスを作るべきなんです。 |
!!パラメータを持たないprivateメソッドは? |
この話をした際によくある反論が「パラメータを持たないprivateメソッドだってあるじゃないか!」というものです。\\ |
パラメータの無い、つまり「共通関数ですらない」privateメソッドがなぜ必要なのでしょうか?\\ |
彼らの答えは「可読性をあげるため長いコードを分割するんだ。」なのですが、私に言わせると「ちゃんちゃら可笑しいw」です。\\ |
なぜならコードが長くなるのは、上記のような小物クラスを見逃しまくって、結果的に手続き的な記述になっているからだと断言できます。そもそも一連の処理ならばprivateメソッドなどに分割せず、処理の流れの通りに1ヶ所に書いてある方が、他人が見た時の可読性は高いはずです。下の例を比べてみて下さい。 |
%%prettify |
{{{ |
public String getSomething() { |
doSomething1(); |
doSomething2(); |
doSomething3(); |
} |
|
public String getAnotherthing() { |
他の処理が書いてある; |
} |
|
private void doSomething1() { |
何かの処理1-1が書いてある; |
何かの処理1-2が書いてある; |
} |
|
private void doSomething2() { |
何かの処理2-1が書いてある; |
何かの処理2-2が書いてある; |
} |
|
private void doSomething3() { |
何かの処理3-1が書いてある; |
何かの処理3-2が書いてある; |
} |
}}} |
/% |
|
%%prettify |
{{{ |
public String getSomething () { |
何かの処理1-1が書いてある; |
何かの処理1-2が書いてある; |
|
何かの処理2-1が書いてある; |
何かの処理2-2が書いてある; |
|
何かの処理3-1が書いてある; |
何かの処理3-2が書いてある; |
} |
|
public String getAnotherthing() { |
他の処理が書いてある; |
} |
}}} |
/% |
|