QUIZ 15分

クイズの説明

Step 1で学んだ内容の理解度をチェックします。

  • 全8問
  • 合格ライン: 80%(7問正解)
  • 不合格の場合は復習してから再挑戦してください

問題

Q1. ソフトウェアアーキテクチャが解決する問題として最も適切なものはどれですか?

  • A) 個々の関数のパフォーマンスを最適化する
  • B) システム全体の構造を定義し、変更の影響範囲を限定する
  • C) UIのデザインを美しくする
  • D) データベースのクエリを高速化する
答えを見る

正解: B

アーキテクチャはシステム全体の構造と境界のルールを定めるものです。個々の関数やクエリの最適化はコードレベルの問題であり、アーキテクチャの主な関心事ではありません。アーキテクチャによって変更の影響範囲が限定され、テスト容易性やチーム分担が改善されます。


Q2. レイヤードアーキテクチャの「貧血ドメインモデル」とはどのような状態ですか?

  • A) エンティティにビジネスロジックが集中しすぎている状態
  • B) エンティティがデータの入れ物になり、ビジネスロジックがService層に分散する状態
  • C) データベースのテーブル数が少なすぎる状態
  • D) ドメインモデルのクラス数が多すぎる状態
答えを見る

正解: B

貧血ドメインモデル(Anemic Domain Model)とは、エンティティがプロパティ(データ)のみを持ち、メソッド(振る舞い)を持たない状態です。本来エンティティが持つべきビジネスロジックがService層に書かれてしまい、エンティティはただのデータ転送オブジェクトと化してしまいます。


Q3. 関心の分離における3つの関心領域のうち、最も変更頻度が低いのはどれですか?

  • A) プレゼンテーション
  • B) アプリケーション
  • C) ドメイン
  • D) インフラストラクチャ
答えを見る

正解: C

ドメイン層はビジネスルールを表現するため、ビジネス自体が変わらない限り安定しています。「注文はキャンセルできる」「在庫がないと出荷できない」などのルールは、使用するデータベースやフレームワークが変わっても変わりません。一方、インフラストラクチャ層は技術の入れ替えや外部サービスの変更で頻繁に変わります。


Q4. 依存性逆転の原則をアーキテクチャレベルで適用する方法として正しいのはどれですか?

  • A) Service層からRepository層を直接呼び出す
  • B) ドメイン層にインターフェースを定義し、インフラ層がそれを実装する
  • C) インフラ層にインターフェースを定義し、ドメイン層がそれを実装する
  • D) Controller層がデータベースに直接アクセスする
答えを見る

正解: B

依存性逆転の原則をアーキテクチャに適用するには、安定した内側の層(ドメイン)にインターフェース(Port)を定義し、不安定な外側の層(インフラ)がそのインターフェースを実装(Adapter)します。これにより、ドメインはインフラの詳細を知らずに済み、依存の方向が外側から内側に向かいます。


Q5. ヘキサゴナルアーキテクチャ、オニオンアーキテクチャ、クリーンアーキテクチャに共通する原則として誤っているものはどれですか?

  • A) ドメインが最も内側に位置する
  • B) 依存は外側から内側に向かう
  • C) レイヤー間は必ず具象クラスで接続する
  • D) インフラストラクチャの差し替えが容易
答えを見る

正解: C

3つのパターンに共通する原則は「ドメイン中心」「依存は内向き」「インターフェースによる分離」「技術の交換可能性」です。レイヤー間はインターフェース(Port)で接続するのが原則であり、具象クラスで直接接続するとレイヤー間の結合度が高くなってしまいます。


Q6. 以下のディレクトリ構造で、依存の方向として正しいのはどれですか?

src/
├── domain/
│   └── ports/out/OrderRepository.ts  (interface)
├── application/
│   └── CreateOrderUseCase.ts
└── adapters/
    └── out/PrismaOrderRepository.ts  (implements OrderRepository)
  • A) domain → adapters
  • B) adapters → domain
  • C) application → adapters
  • D) domain → application
答えを見る

正解: B

PrismaOrderRepository(adapters層)はOrderRepositoryインターフェース(domain層)を実装しています。つまり、adapters層がdomain層に依存しています。これが依存性逆転の原則の実践です。applicationのCreateOrderUseCaseもdomain層のインターフェースに依存するため、依存は常に内側(domain)に向かっています。


Q7. ADR(Architecture Decision Record)に含めるべき要素として最も重要でないものはどれですか?

  • A) 決定の理由とコンテキスト
  • B) 却下した選択肢とその理由
  • C) 実装に使用するコードの全行
  • D) 決定のステータス
答えを見る

正解: C

ADRは設計判断とその理由を記録する軽量なドキュメントです。コンテキスト、決定内容、理由、却下した選択肢、ステータスが主な構成要素です。実装コードの全行を含める必要はなく、それはソースコード自体が担う役割です。ADRの目的は「なぜそう決めたのか」を記録することです。


Q8. レイヤードアーキテクチャの限界として挙げられる「ショートカット」問題とは何ですか?

  • A) コードが短すぎて読みにくくなる問題
  • B) コントローラーがサービス層を飛ばしてリポジトリ層に直接アクセスしてしまう問題
  • C) テストコードを省略してしまう問題
  • D) ドキュメントを書かない問題
答えを見る

正解: B

レイヤードアーキテクチャでは、「単純な処理だからServiceを経由しなくていい」という理由で、上位層が下位層を飛ばしてアクセスするショートカットが生まれがちです。これにより層の境界が崩壊し、依存関係が複雑化します。結果として、変更の影響範囲が予測できなくなり、スパゲッティコード化します。


結果

7問以上正解の場合

合格です。おめでとうございます。

Step 1「アーキテクチャ思考の目覚め」を完了しました。 次は Step 2「ヘキサゴナルアーキテクチャ」に進みましょう。

6問以下の場合

もう少し復習しましょう。

間違えた問題の内容を、該当するセクションで復習してください:

問題復習セクション
Q1step1_1 なぜアーキテクチャが必要なのか
Q2step1_2 レイヤードアーキテクチャの限界
Q3step1_3 関心の分離と依存性の方向
Q4step1_3 関心の分離と依存性の方向
Q5step1_4 アーキテクチャパターンの全体像
Q6step1_3 / step1_4 依存性の方向
Q7step1_5 ADR
Q8step1_2 レイヤードアーキテクチャの限界

Step 1 完了

お疲れさまでした。

学んだこと

  • アーキテクチャが解決する問題(影響範囲、テスト、分担、技術交換)
  • レイヤードアーキテクチャの4つの限界
  • 関心の分離と依存性の方向
  • 3つのアーキテクチャパターンの共通点と違い
  • ADRによる設計判断の記録

次のステップ

Step 2: ヘキサゴナルアーキテクチャ(4時間)

いよいよ具体的なアーキテクチャパターンの学習に入ります。Ports & Adaptersの概念を深く理解し、実際にコードを書いて身につけましょう。


推定所要時間: 15分