プログラミングマガジン

プログラミングを中心にIT技術をできるだけわかりやすくまとめます。

  • ホーム
  • DDD
  • 【DDD】フロントエンド に「クリーンアーキテクチャ」を適用した場合、Reduxのデザイン…
 
 
     
  • サーバー言語  
    • Python
    • Ruby
    • PHP
    • SQL
  •  
  • インフラ  
       
    • AWS
    •  
    • 基本
    • Git
  • Web
       
    • Web開発
    • JavaScript
    • Vue.js
    • React
  •  
  • 設計  
       
    • 実装設計
    • DB設計
  • 問い合わせ
  

【DDD】フロントエンド に「クリーンアーキテクチャ」を適用した場合、Reduxのデザインパターン

09.24

  • miyabisan2
  • コメントを書く

この記事は2分で読めます

 

もし適用するならの話になります。(あまり適用されている案件は見たことないですが。)

ビューモデル

エンティティを表示のために変換したものです。SPAの中心にはこれが属します。

ユースケース

ビューモデルをコントロールしながら表示に必要な処理を行います。

インフラ層

フロントエンド では、Reactのコンポーネント(Webブラウザ)や、ローカルストレージなどが該当します。

実装例

  • ページコンポーネントにUseCaseを包含する。
  • DIのためにInversifyJSを利用する。

application

service

APIに連携するための処理などを記述します。

model

アプリケーションで使いやすい形のモデル

domain

Repository

ローカルストレージとかの抽象クラスを定義する。

Entitiy

APIでくるエンティティ

interface

クリーンアーキテクチャの外側とのインターフェースを記述する。

adapters

外側へのキー。(APIのホストや、URL、ローカルストレージのキーなど)

serviceImplements

サービスの実体を定義する。実際に、adapterを使って外側へ通信する。

repositoryImplements

レポジトリの実体を定義する。実際に、adapterを使って外側へ通信する。

Redux側

基本的な考え方

  • 階層が増えると相対パスを使ったimportが辛くなる。
  • ファイルをフラットに置きすぎると管理が辛い。
  • 1ファイルに統合すると保守が辛い。

Redux-way

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
src/
  ├ components/
  |    ├ 機能1.js
  |    └ 機能2.js
  ├ containers/
  |    ├ 機能1.js
  |    └ 機能2.js
  ├ reducers/
  |    ├ 機能1.js
  |    └ 機能2.js
  ├ actions/
  |    ├ 機能1.js
  |    └ 機能2.js
  └ types/
    ├ 機能1.js
     └ 機能2.js

デメリット

  • 非常に普通のディレクトリ構成だが、閲覧性や、関連性が理解しづらい。(過剰な分割、過剰な分散)
  • reducersとaction creators、action typesは密結合になっているのでディレクトリは同じにした方が良い。

Ducksパターン

actionType、action-creator、reducerが散らばらないようにするデザインパターン。

1
2
3
4
5
6
7
8
9
  ├ components/
  |    ├ 機能1.js
  |    └ 機能2.js
├ containers/
  |    ├ 機能1.js
  |    └ 機能2.js
├ modules
 |   ├機能1.ts(この中にactionType、action-creator、reducerをまとめて書く。)
 |   └機能2.ts

ファイル数が減ってスッキリしますが、これだと1ファイルが肥大化しすぎてしまいます。

メリット

1ファイルが少ない小規模アプリならマッチする。

Re-ducks(moduleを再分割)パターン

Ducsパターンを改良してできました。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  ├ components/
  |    ├ 機能1.js
  |    └ 機能2.js
├ containers/
  |    ├ 機能1.js
  |    └ 機能2.js
  |    duck
    |         ├機能1
    ├ index.ts
    ├ types.ts
    ├ actions.ts
    ├ reducers.ts
    ├ operations.ts
    └ selectors.ts 
              ├機能2
    ├ index.ts
    ├ types.ts
    ├ actions.ts
    ├ reducers.ts
    ├ operations.ts
    └ selectors.ts

operations

actions.tsの前に実行したい「何らかの複雑な処理」を書くための場所(外部APIから値を取得するなど、redux-thunkなどのミドルウェアはここで使う。)

このファイルがあるkとおでactions.tsやreducers.tsがシンプルになる。

selectors

stateから必要な値を算出する関数のこと。stateから計算して取得する場合は必ずselecorsを経由して算出する。処理をメモ化したい場合は、reselectなどのライブラリを使ったりします。

Reducerの分割単位

レンダリングツリーごとの分割

画面ごとに分割をすること。

1
2
3
4
reducers
├── newReducer.js
├── editReducer.js
└── showReducer.js

ドメインデータごとの分割

商売、ログインなどの業務ごとに分割すること。

1
2
3
reducers
├── shoppingReducer.js
├── loginReducer.js

AppState

アプリケーション全体のstate(ログイン状態や、ローディング状態など)

UIState

例えば、モーダルを表示するかどうかなどのstateです。

スポンサーリンク
  • 2021 09.24
  • miyabisan2
  • コメントを書く
  • DDD
  • Tweets Twitter
  • このエントリーをはてなブックマークに追加
  • LINEで送る

関連記事

  1. 2021 09.23

    【DDD】「ドメインイベント」について

  2. 2021 09.19

    【DDD】「リポジトリ」について

  3. 2021 09.23

    【DDD】「コンテキストマップ」について

  4. 2021 08.01

    【DDD】三層 + ドメインモデル

  5. 2021 08.21

    【DDD】「ValueObject(バリューオブジェクト)」、作成判断など

  6. 2021 09.19

    【DDD】クラス間の依存度を下げるには?(DI)

  • コメント ( 0 )
  • トラックバック ( 0 )
  1. この記事へのコメントはありません。

  1. この記事へのトラックバックはありません。

返信をキャンセルする。

【DDD】「ドメインイベント」について

【Java】汎用的な例外処理の対応方法、リトライの考え…

RETURN TOP

著者プロフィール

エンジニア歴10年で過去に業務系、Webデザイン、インフラ系なども経験あります。現在はWeb系でフロントエンド開発中心です。

詳細なプロフィールはこちら

スポンサーリンク

カテゴリー

  • Android
  • API
  • AWS
  • C++
  • CSS
  • C言語
  • DDD
  • DevOps
  • Django
  • Docker
  • Git
  • GitLab
  • GraphQL
  • Hasura
  • Java
  • JavaScript
  • Kubernetes
  • Laravel
  • linux
  • MySQL
  • Next.js
  • nginx
  • Node.js
  • NoSQL
  • Nuxt.js
  • Oracle
  • PHP
  • Python
  • React
  • Redux
  • Rspec
  • Ruby
  • Ruby on Rails
  • Sass
  • Spring Framework
  • SQL
  • TypeScript
  • Unity
  • Vue.js
  • WebRTC
  • Webサービス開発
  • Webデザイン
  • Web技術
  • インフラ
  • オブジェクト指向
  • システム開発
  • セキュリティ
  • その他
  • データベース
  • デザインパターン
  • テスト
  • ネットワーク
  • プログラミング全般
  • マイクロサービス
  • マイクロソフト系技術
  • マルチメディア
  • リファクタリング
  • 副業
  • 未分類
  • 業務知識
  • 設計
  • 関数型言語
RETURN TOP

Copyright ©  プログラミングマガジン | プライバシーポリシー