QUIZ 30分

クイズの説明

Step 2「SOLID原則をマスターしよう」で学んだ内容の理解度を確認します。全8問、80%(7問)以上正解で合格です。


問題

Q1. 単一責任の原則(SRP)における「責任」の最も正確な定義はどれですか?

  • A) クラスが持つメソッドの数
  • B) クラスが変更される理由
  • C) クラスが依存するモジュールの数
  • D) クラスのコード行数
答えを見る

正解: B

SRPにおける「責任」は「変更の理由」と同義です。クラスを変更する理由が複数あるなら、そのクラスは複数の責任を負っていることになります。


Q2. 以下のコードはどのSOLID原則に違反していますか?

class Shape {
  area(): number { return 0; }
}
class Circle extends Shape {
  constructor(private radius: number) { super(); }
  area(): number { return Math.PI * this.radius ** 2; }
}
function printArea(shapes: Shape[]) {
  for (const s of shapes) {
    if (s instanceof Circle) {
      console.log('Circle: ' + s.area());
    } else {
      console.log('Shape: ' + s.area());
    }
  }
}
  • A) SRP
  • B) OCP
  • C) LSP
  • D) DIP
答えを見る

正解: C

instanceof で型チェックをしている点がLSP違反のサインです。基底型 Shape で受け取っているなら、派生型 Circle かどうかを確認せずに同じように扱えるべきです。また、新しいShapeを追加するたびに条件分岐が増えるためOCP違反でもありますが、instanceof チェックはLSP違反の典型的なパターンです。


Q3. オープン・クローズドの原則(OCP)を実現するために最も効果的な方法はどれですか?

  • A) すべてのメソッドを public にする
  • B) グローバル変数で設定を切り替える
  • C) インターフェースとポリモーフィズムを使う
  • D) コメントで拡張ポイントを明記する
答えを見る

正解: C

OCPはインターフェースとポリモーフィズムで実現します。インターフェースが拡張ポイントとなり、新しい実装クラスを追加するだけで既存コードを変更せずに機能を拡張できます。


Q4. リスコフの置換原則(LSP)の契約ルールとして正しいものはどれですか?

  • A) 派生クラスは事前条件を強めてよい
  • B) 派生クラスは事後条件を弱めてよい
  • C) 派生クラスは基底クラスの不変条件を維持しなければならない
  • D) 派生クラスは基底クラスの全メソッドをオーバーライドしなければならない
答えを見る

正解: C

LSPの契約ルールでは、事前条件を強めてはならず、事後条件を弱めてはならず、不変条件を維持しなければなりません。Dは誤りで、必要なメソッドだけオーバーライドすれば十分です。


Q5. ISPの「太ったインターフェース」の問題として最も適切なものはどれですか?

  • A) メソッド名が長すぎる
  • B) 実装クラスが使わないメソッドの実装を強制される
  • C) インターフェースのドキュメントが不足している
  • D) ジェネリクスが使われていない
答えを見る

正解: B

ISPの核心は「クライアントは自分が使わないメソッドに依存させられるべきではない」です。太ったインターフェースは、実装クラスに不要なメソッドの実装(多くの場合、例外をスローするだけの空実装)を強制します。


Q6. 以下のコードに最も関連するSOLID原則はどれですか?

class UserService {
  constructor(private userRepo: UserRepository) {} // インターフェースに依存
}
// ↑ UserRepository はインターフェース
// ↓ 具体実装は外部から注入
const service = new UserService(new PostgresUserRepository());
  • A) SRP
  • B) OCP
  • C) LSP
  • D) DIP
答えを見る

正解: D

DIP(依存性逆転の原則)の典型的な適用例です。UserService(上位モジュール)はインターフェース UserRepository(抽象)に依存し、具体実装 PostgresUserRepository(下位モジュール)はコンストラクタで注入されています。


Q7. SOLID原則を適用するタイミングとして最も適切なのはどれですか?

  • A) プロジェクト開始時にすべてのクラスに適用する
  • B) 変更が予想される箇所や、実際に変更が発生した箇所に適用する
  • C) パフォーマンスに問題が出たときに適用する
  • D) コード行数が1000行を超えたときに適用する
答えを見る

正解: B

SOLID原則は、変更が予想される箇所や実際に変更要求が発生した箇所に適用するのが効果的です。すべてのコードに最初から適用すると過剰設計になります。変化が起きる場所を見極めることが大切です。


Q8. SRPとISPの関係について最も正確な説明はどれですか?

  • A) SRPとISPはまったく無関係の原則である
  • B) SRPはクラスの責任分離、ISPはインターフェースの責任分離で、同じ考え方の異なるレベルへの適用
  • C) ISPを守ればSRPも自動的に守られる
  • D) SRPとISPは相互に矛盾する原則である
答えを見る

正解: B

SRPはクラスが1つの責任(変更理由)だけを持つべきという原則、ISPはインターフェースがクライアントに不要なメソッドを強制しないべきという原則です。どちらも「責任の分離」という同じ考え方を、クラスとインターフェースという異なるレベルに適用したものです。


結果

7問以上正解の場合

合格です。 SOLID原則の5つをしっかり理解しています。次の Step 3 では、GoFデザインパターンを学びます。SOLID原則の知識がパターンの理解を助けてくれるでしょう。

6問以下の場合

もう少し復習しましょう。 Step 2 のレッスンと演習を再度確認してください。特に間違えた問題に対応する原則のレッスンを重点的に読み返しましょう。SOLID原則は今後のすべての学習の基盤です。