関心の分離について
関心の分離とは
関心(Concerns)とは
関心とは、システムやプログラムが扱うべきタスクや目的・責務・役割などの概念を意味します。
つまり、プログラムで何をしたいのか、プログラムは処理においてどのような責任を担うのかを意味します。
言い換えると、プログラムが「気になっている事柄」やプログラムにとって「興味のある事柄」と捉えることができます。
関心は関心事(かんしんじ)とも呼ばれます。
これは、「横断的な関心事」を扱うパラダイムであるアスペクト指向プログラミングにおける概念と同義となります。
関心の分離(Separation of Concerns)とは
関心の分離とは、プログラムを関心毎に分離された構成要素で構築することです。
簡単にいえば、クラスや関数が一つの関心(目的・責務・役割)に専念している状態を指します。
逆に、複数の関心を一つの処理に混ぜている場合は、分離できていないことを意味します。
「責務の分離」や「SOC」と呼ばれることもあります。
関心が分離されたソースコードとは
関心を分離するメリットとは
関心を分離するメリットは、ソースコードの可読性や保守性が向上し、変更容易性のあるソースコードを作成することです。
関心の分離とは、簡単に言ってしまえば「ソースコードの整理整頓」です。
クラスや関数の名前は、関心(目的・責務・役割)を適切に表すように命名します。
そして、処理に関心事以外の副作用がないように適切に細分化し、各部品の責任を明確化します。
これにより、変更に強く、効率的に処理を行えるソースコードを生み出すことができます。
関心を分離するデメリットとは
処理の関心事を過度に細分化すると、クラス間やモジュール間の依存関係が複雑になり、設計が難しくなります。
よくあるケースとして、細分化しすぎてソースコードの可読性が低下したり、理解が困難となり保守性を低下させることがあります。
関心の分離を適用する際には、システムの規模や構造、チームのスキルなどを考慮し、最適なレベルで関心事を分離することが重要となります。
関心の分離の具体例
プレゼンテーションとドメインの分離(Presentation Domain Separation)
プレゼンテーションとドメインの分離とは、ユーザーインターフェースコードとドメイン層(ビジネスロジック)を分離するという設計原則です。
このような設計は、アプリケーションの振る舞いがドメイン層にあるので再利用性が高まり、UIの修正や変更が容易になります。
また、ドメイン層のロジックはUIと切り離されているため、単体テストが行いやすく、信頼性の高いプログラムを作成できることになります。
この原則を用いた設計モデルとしては、MVC(Model-View-Controller)、MVP(Model-View-Presenter)、MVVM(Model-View-ViewModel)などの「MV系」と呼ばれるアーキテクチャパターンがあります。
レイヤーの分離(レイヤードアーキテクチャ)
レイヤーの分離とは、クライアントサイドとサーバーサイドのように、複数のレイヤーに分割する設計です。
例えば、Webアプリケーションの場合、DBアクセスレイヤ、ビジネスロジックレイヤ、UIレイヤなど、機能や役割ごとにレイヤ分けすることは一般的な設計です。
他にも、デザインとロジックを独立させるために、テンプレート(HTMLなど)と動的なロジック(CGIなど)を分離する手法は長く利用されてきています。
レイヤーの分離のメリットは、コードの再利用性や拡張性が向上することです。
機能ごとにレイヤに分けることで、各レイヤの役割を明確にし、コードを整理できます。