📚

【備忘録】『改めて整理するアプリケーション設計の基本』に参加したよ

2022/10/22に公開

先日、参加したStudyCoさん主催の勉強会の内容を要約したものを備忘録がてらに✍️

勉強会の概要

  • 3層アーキテクチャやMVCなどの基礎的なアプリケーション設計について学習

対象者

以下、勉強会のサイトから引用🙇

  • 実務で「ビジネスロジック」や「サービスクラス」といった単語に遭遇し、何を指しているのか分からず困っている方
  • アプリケーションのどこにどんなコードを書くのか、例を学びたい方
  • 1 ファイルに大量のコードが書かれているのを見て、そのようなコードを改善する方針を学びたいと感じている方
  • 「ドメイン駆動設計」や「クリーンアーキテクチャ」を学ぼうとしたが、なかなか理解が進まず困っている方

とりあえず、エンジニアなりたてで、「うわ。ワイのコード、汚すぎやろ。。。」みたいな経験を、絶賛体験中の方々は対象だと思ってる。

3層アーキテクチャって??

アプリケーションの基本的な構造。プレゼンテーション層 , ビジネスロジック層 , データアクセス層 に分かれる。
下で詳しく説明するが、ざっくり、以下のイメージ
プレゼンテーション層 : アプリの利用者とやり取り
ビジネスロジック層 : アプリでやりたい処理 ⇦今回はここがメイン
データアクセス層 : DBやファイルなどのデータ保存先とやり取りする

プレゼンテーション層

MVCでいうと、VC(View + Controller)がプレゼンテーションにあたる
ex)
Webアプリ → リクエストの受け取り(Controller)やUI(View)
WebAPI → APIの入口(Controller)やリクエスト,レスポンスの型

データアクセス層

DBからデータにアクセスする箇所
ちょーーーーーーーーーーーーーざっくりだが、ほぼORマッパーと同じ思ってる

ビジネスロジック層

今回は、このビジネスロジック層が肝。

ビジネスロジック.....??
よく分からんけど、なんかカッコいい単語だなくらいの感じですよね、わかります。
ざっくりいうと、「そのシステムでやりたかったこと」
さらにザックリいうと、『プレゼンテーション層でもデータアクセス層でもないこと』
余事象ってヤツですね👍

具体例(地図アプリでルートを検索する時)

ざっくりした流れ

  1. 行き先を検索
  2. スタート地点の緯度軽度を取得
  3. ゴール地点の緯度軽度を取得
  4. ルートを検索
  5. ルートを表示
    これの2~4がアプリでしたい事だし、プレゼンテーション層でもデータアクセス層でもないところ(ビジネスロジック層)

このビジネスロジックを、さらに ユースケースドメインロジック の2つに分けることができる

ドメインロジック

  • システム都合でない、コアなルールのこと
  • ざっくりいうと、システム以外でも発生する処理
    ex) ホテルの予約システムでいうと、予約内容に合致する空き部屋のチェックは、システムがなくても(電話予約の場合など)発生する処理

ユースケース

  • 処理の流れを実現すること
  • ざっくり、ドメインロジック以外のこと

ビジネスロジックの実装方法

トランザクションスクリプト パターンとドメインモデル パターン

パターン トランザクションスクリプト ドメインモデル
概要 ドメインロジックとユースケースをまとめる(Serviceクラスなど) ドメインロジックはModelに、ユースケースはServiceに分ける
学習コスト 低い 高い
メリット 直感的に書ける コードが肥大化しにくい、変更に強い
デメリット ビジネスロジックが集積して、変更しにくい 学習コスト高い

要約『ビジネスロジックとユースケースを分けて、見やすいコードにしようぜ!!!!』

Controllerに全部書くからのステップアップ(Rails)

Railsのような、MVC + ActiveRecord系はドメインロジックとデータアクセス層がくっつきやすい
本来、アクティブレコードのモデルの役割は以下。

  1. データベースのレコードと 対応するデータをもつ
  2. データのアクセスメソッドを持つ
  3. ドメインロジックをもつ (←これ忘れがち)

なので、Railsの場合は、ユースケースをControllerに、ドメインロジックをModelに書いた方がRailsの良さも出て良い(詳しくは、コチラの図を参照)

PS. ↑他のアーキテクチャもありますが、難しかったので、私くらいのレベル感の人は、まずはこのくらいからが良いかなと...

資料

改めて整理するアプリケーション設計の基本
「ビジネスロジック」とは何か、どう実装するのか
MVC、3 層アーキテクチャから設計を学び始めるための基礎知識
スライド(speakerdeck)

Discussion