社内勉強会で「現場で役立つシステム設計の原則」を読了しました。

こんにちは、M&Aクラウドのかずへいです。今日は弊社の勉強会の取り組みについて紹介ます。

勉強会について

M&Aクラウドでは、現在週に2度勉強会が行われています。水曜日にはフロントエンド勉強会と題して、主にTypeScriptやNuxt.js周りについて勉強していて、金曜日にはアプリケーション設計勉強会と題して、「現場で役立つシステム設計の原則」の輪読を行っていました。

弊社の提供するM&Aマッチングプラットフォーム「M&Aクラウド」はこの本に一部影響を受けて設計されている箇所があるので、メンバー全員に読んでもらっています。

一人で読むだけではなく、開発チームみんなで輪読することによって、「うちのコードのこの部分ってこの考え方で設計されているよね」「いまはこの設計になっているけど、こうしておけばもっと良かったかもしれないね」といった話しで盛り上がり、実際にその場でプログラムを一緒に読んだり書き換えたりということが起きるのでなかなかに有意義です。

本の内容の実践

実際にM&Aクラウドでは以下を実践しています。

  • ファーストクラスコレクション
  • 画面とオブジェクトの設計を連動させる
  • サービスクラスを分ける

ファーストクラスコレクション

ファーストコレクションクラスは配列などのコレクションを独自のクラスとして定義する考え方です。配列をそのまま使ってしまうと、その配列に大してロジックを書くことが出来ません。

同じ配列でもListとListで持つべきロジックは当然違うはずですよね。それをHumanList、ItemListとしてそれぞれクラスを作り、そこにロジックを書いていくという方法です。

qiita.com

このサンプルコードでは\IteratorAggregate, \ArrayAccess, \Countableを実装してクラスが配列として振る舞えるように実装しています。isEmpty()のような関数は配列にはありませんがファーストクラスコレクションにすると自分で足すことが出来ます。

M&AクラウドPHPで書かれていて、PHPにはGenericsが無いのでこういうコードを書くとロジックが重複しやすいという問題もありますが、そこは継承やtraitでうまく避けています。

画面とオブジェクトの設計を連動させる

どこまでがオブジェクトの知識でどこからが画面の知識なのかというのは、設計でよく議論になることかとは思います。M&Aクラウドでは、部分的にはありますが、この資料のような方法でオブジェクトの値を利用して画面が切り替わるように設計しています。

speakerdeck.com

サービスクラスを分ける

M&AクラウドではApplication層に

  • QueryService
  • CommandService
  • ScenarioService

という3つのサービスを作っています。ScenarioServiceクラスは買い手、売り手といったユーザー属性ごとに作られていて、ScenarioServiceがControllerに対してAPIを提供しているような形になっています。ControllerはScenarioServiceしか呼びません。

ユーザー属性ごとにScenarioServiceを作ることにより、Controllerは呼ぶべきScenarioServiceが決まっているので、本来そのユーザーが呼べない関数を呼ぶというようなことが無いのが良い点だと思っています。

まとめ

設計についての本をチーム全員で読むことにより、共通の認識が生まれます。 今の設計も人が考えたものも誰かが考えたものであって、より良い設計があればそれに変えていけるというふうにメンバー各人が理解して、今の設計を神格化しないというのが重要だし、そのためにも共通の認識づくりは大事ですね。 輪読するとたくさんのアイディアが出て良いです。

次の題材

次回からはこちらの本を読み進めていこうと思います。