Software Design 202403
DDD
DDD の概要
DDD の特徴は、複雑な業務ロジックに焦点を合わせること、モデルに基づいて設計すること、リファクタリングを頻繁に行うことの 3 つ。
業務ルールとは、売り上げ最大化とコスト最小化のために、適 切な行動を刺激し、不適切な行動を制限する様々なルールのこと。「事業目標を達成するための行動を統制する決めごと」といえる。一方、業務ロジックは、ソフトウェアそのものや、ソフトウェアとして表現された業務ルールといえる。業務ロジックには単純なものもあるが、DDD では複雑なものに注目する。金を生むのはそちらだし、どんどん複雑になっていくものだから。
業務内容や要求を理解するためのモデルを分析モデル、ソフトウェアを実際に作るためのモデルを設計モデルとよぶ。DDD ではこの 2 つを一致させることに価値を置いている。
戦略的設計は、視野を広げてモデルを作るための設計手法。ユビキタス言語、境界づけられたコンテキスト、コンテキストマップ、コアドメインなど。戦術的設計は、複雑な業務ロジックをソフトウェアで表現するための設計手法。エンティティ、値オブジェクト、集約、モジュール、リポジトリなど。
軽量 DDD とは、いいとこ取りをした DDD を指すのではなく、「複雑な業務ロジックに焦点を当てる」ことを放棄して、小手先の戦術(リポジトリがどうとか)だけを猿まねしたようなものを指す。
(あとはちょっと何言ってるかよく分からん)
ユビキタス言語
ユビキタス言語を決めるときの Tips
- 口ずさんでみて違和感がないか
- あとか ら重複する可能性のない言葉か
- あとで変えられるので悩みすぎない
- どんどん使用を促していく
- 日本語と英語を両方決める
- 言葉として綺麗かどうかよりも、チーム内で誤解が生じないかを重視する
- 頻繁に会話に出てくる言葉のみ定義する(全部やると大変)
- 視覚的に分かりやすく管理する(ドメインモデル図?)
ドメイン
リソースレコードとは、DNS において、ドメイン名に関連付けられた情報(レコード)のこと。
- A レコード
- IPv4 アドレス
- AAAA レコード
- IPv6 アドレス
- クアッド A レコードと呼ばれる
- HTTPS レコード
- A レコードの情報に加えて、使用できる HTTP のプロトコルを返す
- 2020 年に定義された
- MX レコード
- メールサーバを返す
- 優先順位を設定できる
- TXT レコード
- ドメインの所有を証明する際などに使われる
- CNAME レコード
- アクセスしているドメインはそのままで、実際の通信先を別のサーバにしたいときに使う
- CDN や WAF で使う
- ゾーンアペックスには使えない。もし使いたければ ALIAS レコードが設定できるネームサーバ(Route53 ほか)を使う必要がある。
- NS レコード
- サブドメインの権威サーバを別のサーバへ委譲するときに使う
- 大きな組織でサブドメイ ンごとに業務を分けたいときなどに便利
DNS には権威サーバとキャッシュサーバの 2 種類がある。権威サーバはドメイン所有者が登録したゾーン情報を格納する。キャッシュサーバはその情報をキャッシュするだけである。もしキャッシュサーバにキャッシュがなかった場合の通信の流れは以下のようになる。
- キャッシュサーバが DNS ルートサーバ(世界に 13 台)へリクエストし、
.jp
の権威サーバを得る - キャッシュサーバから
.jp
の権威サーバにリクエストし、example.jp
の権威サーバを得る - キャッシュサーバから
example.jp
の権威サーバにリクエストし、目的のリソースレコードを得る
データベースリファクタリング / OR と部分一致
機能追加に伴い検索フォームはどんどん混沌としていくもの。
SQL で OR 句や部分一致検索(前方一致や後方一致は OK)を使うとインデックスが効かなくなるので、検索など恒常的に使われるようなクエリでは要注意。
OR 句については、クエリを分割して実行した上で UNION 句を使って結合することで、パフォーマンスが改善できる場合がある。メリットはアプリケーションを改修する必要がない点。デメリットはクエリが複雑になる点。
部分一致検索については、全文検索のためのインデックスを作成し、適切なクエリを発行することで解消できる場合がある。手軽に利用できる反面、インデックス作成のコストが大きかったり、複雑な要件には対応できない場合もある。
NoSQL を組み合わせる手もある。複雑な検索が必要な場合は Elasticseatch を、高速なレスポンスが必要な場合は Redis を使う場合が多い。メリットは、アーキテクチャがシンプルになること。デメリットは運用・学習コストの増大、整合性の担保に工夫が必要になる、といった点が挙げられる。
AWS IAM Identity Center (ex. AWS SSO)
シングルサインオンの機能を提供する。一度の認証(e.g. Google Workspace での認証)により、複数の複数の AWS アカウントを簡単に切り替えて使えるようになる。このサービスを使うと、IAM ユーザーは基本的に不要になる。