レイヤー化の原則
2005年1月7日
ここ数日、私はジミー・ニルソン氏が主催するノルウェーでのエンタープライズソフトウェアに関するワークショップに参加していました。ワークショップ中、いくつかの設計原則を考案し、投票するセッションがありました。
ルールは次のとおりです。全員が優れたレイヤー化のための原則を提案でき、リストに追加されました。原則に関する議論はほとんど行われず、必要に応じて明確化のみが行われました。人々は気に入った原則でもそうでない原則でも提案できました。ルールは、現場で耳にした原則をキャプチャすることでした。
リストができたら、投票の時間です。全員が10の賛成票と10の反対票を持つドット投票のバリアントを使用しました。
以下に結果を示します。原則の後に賛成/反対の形式で投票数を示します。
- レイヤー間の疎結合、レイヤー内での高凝集。10/0
- 関心の分離。11/0
- レイヤーはコンシューマーに依存すべきではない(レイヤーは誰が上にいるかを知るべきではない)。4/4
- 適応性:変更できること。2/0
- ユーザーインターフェースモジュールにはビジネスロジックを含めるべきではない。10/0
- ビジネスロジックレイヤーにはユーザーインターフェースが含まれておらず、ユーザーインターフェースモジュールを参照しない。8/0
- レイヤー間の循環参照はないこと。8/0
- 少なくとも3つの主要なレイヤータイプがある:プレゼンテーション、ドメイン、およびデータソース。3/9
- ビジネスレイヤーは技術サービスの抽象化のみを使用する。14/0
- レイヤーごとに開発チームを分離する。1/22
- レイヤーは個別にテスト可能であるべきである。12/0
- レイヤーは隣接するレイヤーとのみ対話することを好む。4/4
- レイヤーは、下位レイヤーを上位レイヤーに公開することに慎重であるべきである。1/0
- レイヤーは、下位レイヤーを上位レイヤーから隠すべきである。
- レイヤーは隣接するレイヤーとのみ対話すべきである。2/3
- 下位レベルのレイヤーインターフェースを変更しても、上位レイヤーインターフェースは変更されるべきではない。2/5
- レイヤー境界で分散する。0/18
- レイヤーは、レイヤー間の分散を意味しない論理的なアーティファクトである。11/0
- 下位レイヤーは上位レイヤーに依存すべきではない。6/0
- すべてのレイヤーは秘密を持つべきである。3/2
- レイヤーは内部について控えめであるべきである。8/0
- レイヤーは代替可能であるべきである。2/0
- レイヤーは複数の隣接する上位レイヤーを持つことができる。2/1
- 常にドメインロジックをサービスレイヤーでラップする。4/5
- レイヤー境界で例外を再スローする。0/15
- レイヤーは独立して保守およびバージョン管理されるべきである。2/0
- レイヤーは別々のデプロイメントユニットを持つべきである(例:各レイヤーの別々のjarまたはアセンブリ)。0/7
- レイヤーはインフラストラクチャの側面(例:セキュリティ)を共有してもよい。7/0
- ドメインレイヤーは外部システムと通信すべきではない。サービスレイヤーがそれを行うべきである。2/3
- インバウンド外部インターフェースモジュール(例:Webサービスハンドラー)にはビジネスロジックを含めるべきではない。10/0
明らかに、このリストをあまり深く読み取ることはできません。良いグループの人々でしたが、エンタープライズ開発の専門知識の決定的な情報源ではありませんでした。原則もやや緩く表現されており、演習に1時間以上費やしていたら、整理されていたであろう重複や不正確さがあります。しかし、このリストが少し考えさせ、議論を促す可能性があると思います。
私は、驚いたことがあったかどうかを人々に尋ねました。何人かの人々は、頻繁に耳にしていた(そして嫌いだった)原則が投票で却下されたことに驚きました(レイヤーごとの開発チームの分離とレイヤー境界での例外の再スロー)。同様に、「ビジネスレイヤーは技術サービスの抽象化のみを使用する」ことが、実際にはめったに行われないにもかかわらず、非常に強い支持を得たことに驚きがありました。