騒音のない世界 BLOG

コンピュータの話と、音楽の話

Onion Architecture と Clean Architecture

以前にiOSにおける Clean Architecture 構成について、いくつか記事を書きました。Clean Architectureって何?という方はまずそちらの記事をご覧ください。

引き続き色々と調べておりまして、Clean Architectureの元になったアーキテクチャの1つであるOnion Architectureについて記事を読んでいて少し発見があったので書きます。

The Onion Architecture

背景

記事を書いてるのはJeffrey Palermoという方だそうです。Clear Measureというソフトウェア開発会社のCEOの方みたいですね。すごい経歴。。

記事は2008年ですが、その時点で何度か対外的に発表されているようなので大体10年前ぐらいのアイディアってことでしょうか。iPhoneの初出が2007年なので、スマホが現れ始めた頃ですね。

4つのルール

f:id:a_beco:20161231220524p:plain

  • アプリケーションは独立したオブジェクトモデルを中心にして構築される
  • 内側のレイヤがインタフェースを定義し、外側のレイヤが実装する
  • 依存の方向は内側に向かう
  • アプリケーションの核となるコードはインフラ(DBなど)とは分離してコンパイル&実行できる

どういうものに向いているか

  • 小さなウェブサイトには向いていない
  • 長く運用するアプリに向いている

どういうものなのか

  • 依存ルールがインタフェースの使用を強制し、疎結合化する
    • テスタブルにする
  • インフラを円の外部に起き、アプリケーションコードから依存しないようにする
    • インフラを置換しやすくする

伝統的なLayered Architectureの欠点

  • UI -> Business Logic -> Data という依存性
    • 各層が下層に依存し、各層が様々なインフラに依存する
  • 依存自体は必要なものだが、不要な依存を産んでいるのが問題
  • Business LogicがなければUIは機能せず、DataがなければBusiness Logicは機能しない
  • 特にデータアクセス技術は頻繁に変更される
    • 歴史的には3年ごとにデータアクセスのテクニックは変更される
    • 3年おきに入れ替える必要が出てくる
    • 密に結合していると、現実的に入れ替えが不可能になる危険がある

Clean Architectureとの関係性

そもそもClean ArchitectureはOnion Architectureを含むいくつかのアーキテクチャを自然な形で1つに統合するもの、という風に書かれています。なのでコアなコンセプトとしてはかなり似ています。目立って違うなあと感じたのは、

  • Onion Architectureは、依存が内側に向かっていれば層を飛び越えても良い
  • Onion Architectureには明示的なアダプタ層(Interface Adapter)が無い

といった点でしょうか。

依存を内側に向ける意味

前回、「依存を内側に向けることの意味がわからん」という話を書いたんですが、「インフラ技術は3年程度で新しくなる」という具体的な話があり、イメージが湧きました。3年以上運用することが明らかな場合、絶対に訪れるリスクとして備えておく意味があるなあと。Clear Measureでも古い技術のアップグレードとかやってるみたいなので、様々な現場のつらみから必要に迫られて生まれたアーキテクチャなのかなあと。そういう意味でも、やっぱりどちらかというと業務ソフトウェアを前提にしてるのかなあという印象が強まりました。

おわりに

アーキテクチャの話ってマクロで抽象的なのでコアなコンセプトとその意義を理解するのに時間がかかりますね。。引き続きアンテナ張っていきたいです。また何かあれば書きます。