「現場で役立つシステム設計の原則」の「1行につきドットは1つまで」の説明について

ThoughtWorks アンソロジー』という参考書の第5章で、「オブジェクト指向エクササイズ」として紹介されている次の9つのルールです。

(『現場で役立つシステム設計の原則』 p301)


● 1行につきドットは1つまで

 「else 句を使わない」と同じく、複文構造を単文に分解することを狙っ たルールです。

 ドットを使って複数のメソッドを連ねた文は、意図がわかりにくくなり ます。また、同じ処理があちこちに重複して書かれる原因になりがちです。

 ドットで連結した長く続いた式の、一部だけをほかの場所で再利用できな いからです。

 このルールを実践する方法は、ドットの 1 つごとに説明用の変数に代 入して、別の文に分けることです。説明用の変数名で意図を明確にします。

 一つひとつの処理が独立すれば、メソッドの抽出やクラスの抽出によっ て、コードの再利用の機会も増えます。

(同 p303)


上記を最初に読んだときに思ったのは「あれ? オブジェクト指向エクササイズで書かれてたのってデメテルの法則の話じゃなかったっけ?」でした。

誰か指摘してないかなと思ってググッてみましたが見つけられず、自分の記憶が間違っていたのかと不安になったため、ThoughtWorksアンソロジーを引っ張りだしてきて確認しました。


5.2.5 ルール4: 1行につきドットは1つまでにすること

 あるアクティビティに対する責務をどのオブジェクトが持つべきなのか、判断が難しいことがあります。 複数のドットを使っているコードが何行かあれば、責務の配置を間違っている箇所がたくさん見つかるでしょう。 1行の中に複数のドットがある場合、そのアクティビティは間違った場所で実行されようとしています。 おそらく、そのオブジェクトは同時に2つの異なるオブジェクトを扱おうとしているのでしょう。 この場合、そのオブジェクトは仲介役で、多くのオブジェクトを知りすぎています。 そのアクティビティを他のオブジェクトに移すことを検討してください。

 ドットがつながっているということは、オブジェクトが他のオブジェクトの中を深く掘り進んでいるということです。 つまり複数のドットは、カプセル化に違反していることを示しています。 自らオブジェクトの中をいじり回るのではなく、 そのオブジェクトにしかるべき仕事をさせるようにしましょう。 カプセル化の主な役割は、クラスの境界を超えて知るべきではない型にたどり着かないようにすることです。

 デメテルの法則(「直接の友人にだけ話しかけよ」)に従うことから始めるとよいでしょう。

(『ThoughtWorksアンソロジー』 p73)


責務の配置とカプセル化について書かれていて、デメテルの法則への言及もあり、概ね記憶の通りでした。