設計の原則の紹介とくらしのマーケットのシステム2018-12-21設計の原則の紹介とくらしのマーケットのシステム自称webエンジニアの高橋です。ソフトウェアを設計するにあたってよく知られている原則に、SOLID原則というものがあります。Principle)の5つの原則の頭文字を並べたものです。本記事では、くらしのマーケットのプロダクションコードの一部を例/反例として、上の原則の紹介をしてみます。以下に紹介するコードは全てTypeScriptです。単一責任の原則はモジュール(クラス)を変更する理由は1つ以上存在してはならないという原則です。以下のようなコードがAngularのコンポーネントとして定義されているとします。}}Angularのコンポーネントはviewに対する最小限のロジックのみを書くべきですが、このクラスではデータ取得処理を長々とコンポーネントに記述してしまっています。viewには直接関係ない理由でこのコンポーネントを修正する必要が出てきます。等の別のモジュールを作成して、処理を委譲してしまうことで解決できそうです。}}これで、viewに関するロジックとデータ取得のロジックが分離されました。オープン・クローズドの原則オープン・クローズドの原則は、モジュール(クラス)は拡張に対して開いていなければならず、修正に対して閉じていなければならないという原則です。}}例えば上のコンポーネントでは、initChildComponent関数の中で子コンポーネントをswitch文で動的に設定しています。ここで、子コンポーネントをさらに追加したい場合は、case文を新たに追加して修正する必要があります。このままでもストラテジーパターン的な実装ではありますが、さらに責務を分離するなら、以下のような関数を定義すると良いでしょう。修正)が必要なくなったことがわかります。initChildComponentレベルで、拡張に対して開いているということになります。クラスレベルでオープン・クローズドの原則を担保する場合は、dispatch関数を別クラスに定義することで、さらに責務を分離できるでしょう。getComponentsメソッドを動的にあるディレクトリ配下のcomponentを取得するような処理にするようにすれば、ファイルを追加するだけで上記のコードをオープン・クローズドの原則に従った形で拡張することができます(実際はそこまでせずに、getComponentsの関数の中は追記可とする設計でも、ある程度は結合度を下げられるのでそれで十分という場合もあるかと思います)。リスコフの置換原則リスコフの置換原則は、派生型(子クラス)は基本型(親クラス)と置換可能でなければならないという原則です。子クラスで不用意に親クラスのメソッドを上書きしたりすると、子クラスと親クラスが置換不可能になってしまい、クラスのis-A関係が崩れてしまいます。私達のコードではリスコフの置換原則に反したコードは見つかりませんでしたが、今後も注意してコーディングしていきたいです。インターフェース分離の原則インターフェース分離の原則は、クライアントに、クライアントが利用しないメソッドへの依存を強制してはならない。メソッドAとメソッドBがあるインターフェースを利用するクライアントが常にメソッドAしか実行しない場合、メソッドBへの依存は無駄となってしまいます。undefined>;}上記のインターフェースは地理情報の処理メソッドと認証情報の取得メソッドが同居しています。これれらのメソッドを必要としているクライアントも別々のクラスです。undefined>;}このように、ユースケースを考慮して別々のインターフェースとして分離したほうがより良い設計かと思います。上位レベルのモジュールは下位レベルのモジュールに依存すべきではない。両方とも抽象に依存すべきである。くらしのマーケットのNode.jsのコードでは、現在DIの仕組みを取り入れており、上位のモジュールは下位のモジュールのインターフェースに依存するようになっています。ICalendarApiインターフェース経由でしかアクセスできません。この場合、コンストラクタ引数のcalendarApiがどのように具体的に実装されているか、CalendarManagerクラスは知ることはできません。このようにして、上位モジュールと下位モジュールの結合度を下げることができます。まとめ以上、くらしのマーケットのコードを例にして、SOLID原則の紹介をしてみました。これからも設計を意識しながら、保守しやすいコードを目指して開発していきたいです。https://www.minma.jp/までお気軽にご連絡ください。「話だけ聞きたい!」ってことでオフィスに遊びにきていただくことも可能です。読者になる関連記事2020-11-20テストレベルとカバレッジとは!?こんにちは、QAエンジニアのざきです。積極採用中!みんなのマーケットでは、プロダクトをつくる仲間を募集中です。日本全国、また、グローバルでのフルリモート社員や業務委託についても、各職種で募集中です。開発職向けの会社紹介資料も御覧ください。2引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。