At line 10 changed one line |
「担当者姓」と「担当者名」という属性がこのクラスの中にはあります。そしてこの二つの値を使ったメソッド「担当者氏名を返す」を作ってみます。姓と名の間にスペースを挟んで返す仕様だとすると、コードは次のようになるでしょう。 |
「担当者姓」と「担当者名」という属性がこのクラスの中にはあります。そしてこの二つの値を使った「担当者氏名を返す」メソッドを作ってみます。姓と名の間にスペースを挟んで返す仕様だとすると、コードは次のようになるでしょう。 |
At line 29 changed one line |
そして次に、「いずれの氏名を返す時も、姓と名の間のスペースを2つに替えて欲しい。」という要望が挙がったとします。よく見てみると上記二つのメソッドは非常に良く似ています。「スペースを挟んで姓と名を連結する」という仕様だからです。こういう時、privateメソッドを作っておくと変更が一ヶ所で済んだはずです。次のようなコードです。 |
そして次に、「いずれの氏名を返す時も、姓と名の間のスペースを2つに替えて欲しい。」という要望が挙がったとします。よく見てみると上記二つのメソッドは非常に良く似ています。「スペースを挟んで姓と名を連結する」という仕様だからです。こういう時、privateメソッドを作っておくと変更が1ヶ所で済んだはずです。次のようなコードです。 |
At line 45 changed one line |
こうしておけば、間に挟むスペースが3つに替わろうが変更箇所は1カ所で済みます。\\ |
こうしておけば、間に挟むスペースが3つに替わろうが変更箇所は1ヶ所で済みます。\\ |
At line 53 changed one line |
この場合は、属性として「姓」と「名」を持つ「氏名クラス」を作るべきです。 |
この場合は、属性として「姓」と「名」を持つ「氏名クラス」を作るべきです。そしてそのクラスに__委譲__するのです。 |
[{Image src='name.png'}] |
At line 56 changed one line |
この話をした際によくある反論が「パラメータを持たないprivateメソッドだってあるじゃないか!」というものです。\\ |
「privateメソッド禁止」の話をする際によくある反論が、「パラメータを持たないprivateメソッドだってあるじゃないか!」というものです。\\ |
At line 59 changed one line |
なぜならコードが長くなるのは、上記のような小物クラスを見逃しまくっていて、結果的に手続き的な記述になっているからだと断言できます。クラスという単位で本来分割されているべきものが一つになってしまっていれば、その中の記述が長くなってしまうのは当然です。\\ |
なぜならコードが長くなるのは、上記のような小物クラスを見逃しまくっていて、結果的に手続き的な記述になっているからだと断言できます。クラスという単位で本来分かれているべきものが一つになってしまっていれば、その中の記述が長くなってしまうのは当然です。\\ |
At line 115 changed one line |
フィールド(属性)の周りをメソッドが取り巻いている形が見えますが、これは裏返すと、「フィールドを隠蔽するためにメソッドが口を開けている」ということです。つまり公開されないメソッドはこの原則に反するのです。privateによって隠蔽するべきなのはフィールドであってメソッドではないという原則がこの図からも解ります。\\ |
フィールド(属性)の周りをメソッドが取り巻いている形が見えますが、これは裏返すと、「フィールドを隠蔽するためにメソッドが口を開けている」ということです。つまり公開されないメソッドはこの原則に反するのです。__privateによって隠蔽するべきなのはフィールドであってメソッドではない__という原則がこの図からも解ります。\\ |
At line 159 changed one line |
一方で、「氏名クラス」を利用している場合はどうでしょう? |
\\ |
一方で、「氏名クラス」を利用している場合はどうでしょう?\\ |
氏名クラスを利用する場合、そのデータは「姓」と「名」として使うことでしょう。「郵便番号」と「住所」を無理矢理入れようと思えば入れられますが、上記のユーティリティクラスの使われ方ほどの可能性はありません。 なぜならば、ユーティリティクラスの目的は「処理」、つまり「1つめのパラメータと2つめのパラメータを2個のスペースを挟んで連結する」という機能を提供することですが、氏名クラスの目的は__氏名となるデータを保持すること__だからです。誤用の可能性は低いでしょう。\\ |
ひとかたまりとなるデータ構造をクラスに閉じ込め、そのデータに関する処理も併せてその中に閉じ込めてしまうことで修正箇所を最小限にしようというオブジェクト指向の目的がこの例からも解ります。 |
[{Image src='name2.png'}] |