QUIZ 30分

クイズの説明

Month 1「コードの美学を追求しよう」の全範囲 — コード品質、SOLID原則、GoFデザインパターン、リファクタリング — の理解度を確認する卒業クイズです。全8問、80%(7問)以上正解で合格です。


問題

Q1. 以下のクラスに見られるコードスメルとして最も適切なものはどれですか?

class UserService {
  createUser(name: string, email: string, age: number, address: string,
    phone: string, role: string, department: string, manager: string): User {
    // ...
  }
}
  • A) 長すぎるメソッド
  • B) パラメータが多すぎる(Long Parameter List)とプリミティブ執着
  • C) 重複コード
  • D) 特性の横恋慕
答えを見る

正解: B

8個のパラメータは「パラメータが多すぎる」コードスメルです。また、すべてがプリミティブ型(string, number)で表現されているのは「プリミティブ執着」です。Builder パターンや値オブジェクト(Email, PhoneNumber 等)の導入、またはパラメータオブジェクトの導入で改善できます。


Q2. 次のリファクタリング前後のコードで適用されている技法はどれですか?

// Before
function getShippingCost(type: string): number {
  if (type === 'standard') return 500;
  if (type === 'express') return 1200;
  if (type === 'overnight') return 2500;
  return 0;
}

// After
interface ShippingMethod { getCost(): number; }
class StandardShipping implements ShippingMethod { getCost() { return 500; } }
class ExpressShipping implements ShippingMethod { getCost() { return 1200; } }
class OvernightShipping implements ShippingMethod { getCost() { return 2500; } }
  • A) Extract Method
  • B) Replace Conditional with Polymorphism
  • C) Inline Variable
  • D) Move Method
答えを見る

正解: B

型による条件分岐(if-else の連鎖)を、インターフェースとポリモーフィズムに置き換えています。これは「Replace Conditional with Polymorphism」リファクタリング技法です。新しい配送方法の追加が、既存コードの変更なしに可能になります(OCP)。


Q3. 次のコードが違反しているSOLID原則をすべて選んだ場合、最も正確な組み合わせはどれですか?

class ReportService {
  private db = new MySQLDatabase();

  generateReport(type: string): string {
    if (type === 'sales') {
      const data = this.db.query('SELECT * FROM sales');
      return this.formatSalesReport(data);
    } else if (type === 'inventory') {
      const data = this.db.query('SELECT * FROM inventory');
      return this.formatInventoryReport(data);
    }
    throw new Error('Unknown report type');
  }

  private formatSalesReport(data: any[]): string { return '...'; }
  private formatInventoryReport(data: any[]): string { return '...'; }
}
  • A) SRP のみ
  • B) SRP と OCP
  • C) SRP、OCP、DIP
  • D) OCP と DIP のみ
答えを見る

正解: C

  • SRP違反: データ取得とレポートフォーマットの2つの責任を持っている
  • OCP違反: 新しいレポートタイプを追加するたびに既存メソッドの修正が必要
  • DIP違反: MySQLDatabase という具体クラスに直接依存している(new で直接生成)

Q4. Observer パターンと Strategy パターンを組み合わせて使う場面として最も適切なのはどれですか?

  • A) ユーザーのアクションに応じて通知を送り、通知の送信方法を切り替えたい
  • B) オブジェクトの生成方法を動的に選択したい
  • C) 複雑なオブジェクトを段階的に構築したい
  • D) 互換性のないインターフェースを接続したい
答えを見る

正解: A

Observer パターンで「ユーザーのアクション(イベント)を通知する」仕組みを作り、Strategy パターンで「通知の送信方法(メール、SMS、プッシュ通知)を切り替える」ことができます。イベント駆動 + アルゴリズム切り替えの組み合わせです。


Q5. 以下の説明に最も適合するデザインパターンはどれですか?

「HTTPクライアントに、ログ出力、リトライ、キャッシュの機能を動的に追加したい。機能の組み合わせは利用箇所によって異なる」

  • A) Adapter
  • B) Facade
  • C) Decorator
  • D) Builder
答えを見る

正解: C

Decorator パターンは、同じインターフェースを維持しながら動的に機能を追加できます。ログ出力、リトライ、キャッシュをそれぞれ独立した Decorator として実装し、必要に応じて組み合わせることができます。


Q6. 値オブジェクト(Value Object)を導入すべき状況として最も適切なのはどれですか?

  • A) データベースのIDを管理したいとき
  • B) メールアドレスやお金など、バリデーションルールと振る舞いを持つ概念を表現したいとき
  • C) 複数のサービスを統合したいとき
  • D) 非同期処理を管理したいとき
答えを見る

正解: B

値オブジェクトは、バリデーションルール(メールアドレスの形式、金額の正の値チェック)と関連する振る舞い(ドメインの取得、通貨の加算)を持つ概念を表現するために使います。不変性と自己検証により、不正な値がシステムに入り込むことを防ぎます。


Q7. テスト駆動リファクタリングにおいて、テストが失敗した場合の正しい対応はどれですか?

  • A) テストを修正して通るようにする
  • B) 直前のリファクタリングを取り消し、より小さなステップでやり直す
  • C) テストを削除する
  • D) リファクタリングを中止して元のコードに完全に戻す
答えを見る

正解: B

テストが失敗した場合、振る舞いが変わってしまった可能性があります。直前のリファクタリングを取り消し(git revert や undo)、より小さなステップに分解してやり直します。テストを修正するのは、リファクタリングではなくテスト自体のリファクタリング時だけです。


Q8. 高橋アーキテクトの教えとして、Month 1 全体を通じて最も重要なメッセージはどれですか?

  • A) すべてのコードにデザインパターンを適用すべき
  • B) パフォーマンスが最も重要な品質指標である
  • C) 動くコードを書くことが最終目標である
  • D) 設計原則とパターンは目的ではなく手段であり、保守性の高いコードを書くために使う
答えを見る

正解: D

Month 1 を通じて高橋アーキテクトが繰り返し伝えたのは、「設計原則やパターンは手段であり目的ではない」ということです。コードの保守性、可読性、テスト容易性を高めるために、必要な場面で適切に適用する判断力が重要です。すべてに適用する過剰設計も、まったく適用しない放置も避けるべきです。


結果

7問以上正解の場合

合格です! Month 1「コードの美学を追求しよう」を修了しました。

おめでとうございます。あなたは以下のスキルを身につけました:

  • コード品質を客観的に評価し、改善方針を立てられる
  • SOLID原則を理解し、コードに適用できる
  • GoFデザインパターンの主要パターンを実装できる
  • リファクタリング技法を使って安全にコードを改善できる
  • 設計原則に基づいたコードレビューができる

Month 2 では、さらに高度なアーキテクチャパターンとドメイン駆動設計(DDD)を学びます。L2の旅はまだ続きます。

6問以下の場合

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

Month 1 の各ステップを振り返り、特に以下の点を重点的に復習してください:

  • SOLID原則の5つの原則とその関係性(Step 2)
  • デザインパターンの使い分け(Step 3, 4)
  • リファクタリングの安全な進め方(Step 5)

各ステップのクイズに再挑戦し、すべて合格してから卒業クイズに再挑戦してください。