【備忘録】『改めて整理するアプリケーション設計の基本』に参加したよ
先日、参加したStudyCoさん主催の勉強会の内容を要約したものを備忘録がてらに✍️
勉強会の概要
- 3層アーキテクチャやMVCなどの基礎的なアプリケーション設計について学習
対象者
以下、勉強会のサイトから引用🙇
- 実務で「ビジネスロジック」や「サービスクラス」といった単語に遭遇し、何を指しているのか分からず困っている方
- アプリケーションのどこにどんなコードを書くのか、例を学びたい方
- 1 ファイルに大量のコードが書かれているのを見て、そのようなコードを改善する方針を学びたいと感じている方
- 「ドメイン駆動設計」や「クリーンアーキテクチャ」を学ぼうとしたが、なかなか理解が進まず困っている方
とりあえず、エンジニアなりたてで、「うわ。ワイのコード、汚すぎやろ。。。」みたいな経験を、絶賛体験中の方々は対象だと思ってる。
3層アーキテクチャって??
アプリケーションの基本的な構造。プレゼンテーション層
, ビジネスロジック層
, データアクセス層
に分かれる。
下で詳しく説明するが、ざっくり、以下のイメージ
プレゼンテーション層
: アプリの利用者とやり取り
ビジネスロジック層
: アプリでやりたい処理 ⇦今回はここがメイン
データアクセス層
: DBやファイルなどのデータ保存先とやり取りする
プレゼンテーション層
MVCでいうと、VC(View + Controller)がプレゼンテーションにあたる
ex)
Webアプリ → リクエストの受け取り(Controller)やUI(View)
WebAPI → APIの入口(Controller)やリクエスト,レスポンスの型
データアクセス層
DBからデータにアクセスする箇所
ちょーーーーーーーーーーーーーざっくりだが、ほぼORマッパーと同じ思ってる
ビジネスロジック層
今回は、このビジネスロジック層が肝。
ビジネスロジック.....??
よく分からんけど、なんかカッコいい単語だなくらいの感じですよね、わかります。
ざっくりいうと、「そのシステムでやりたかったこと」
さらにザックリいうと、『プレゼンテーション層でもデータアクセス層でもないこと』
余事象ってヤツですね👍
具体例(地図アプリでルートを検索する時)
ざっくりした流れ
- 行き先を検索
- スタート地点の緯度軽度を取得
- ゴール地点の緯度軽度を取得
- ルートを検索
- ルートを表示
これの2~4がアプリでしたい事だし、プレゼンテーション層でもデータアクセス層でもないところ(ビジネスロジック層)
このビジネスロジックを、さらに ユースケース
とドメインロジック
の2つに分けることができる
ドメインロジック
- システム都合でない、コアなルールのこと
- ざっくりいうと、システム以外でも発生する処理
ex) ホテルの予約システムでいうと、予約内容に合致する空き部屋のチェックは、システムがなくても(電話予約の場合など)発生する処理
ユースケース
- 処理の流れを実現すること
- ざっくり、ドメインロジック以外のこと
ビジネスロジックの実装方法
トランザクションスクリプト パターンとドメインモデル パターン
パターン | トランザクションスクリプト | ドメインモデル |
---|---|---|
概要 | ドメインロジックとユースケースをまとめる(Serviceクラスなど) | ドメインロジックはModelに、ユースケースはServiceに分ける |
学習コスト | 低い | 高い |
メリット | 直感的に書ける | コードが肥大化しにくい、変更に強い |
デメリット | ビジネスロジックが集積して、変更しにくい | 学習コスト高い |
要約『ビジネスロジックとユースケースを分けて、見やすいコードにしようぜ!!!!』
Controllerに全部書くからのステップアップ(Rails)
Railsのような、MVC + ActiveRecord系
はドメインロジックとデータアクセス層がくっつきやすい
本来、アクティブレコードのモデルの役割は以下。
- データベースのレコードと 対応するデータをもつ
- データのアクセスメソッドを持つ
- ドメインロジックをもつ (←これ忘れがち)
コチラの図を参照)
なので、Railsの場合は、ユースケースをControllerに、ドメインロジックをModelに書いた方がRailsの良さも出て良い(詳しくは、PS. ↑他のアーキテクチャもありますが、難しかったので、私くらいのレベル感の人は、まずはこのくらいからが良いかなと...
資料
改めて整理するアプリケーション設計の基本
「ビジネスロジック」とは何か、どう実装するのか
MVC、3 層アーキテクチャから設計を学び始めるための基礎知識
スライド(speakerdeck)
Discussion