設計原則の集合でオブジェクト指向プログラミングとソフトウェア設計において、より柔軟で、メンテナンスしやすく、理解しやすいコードを書くための5つの基本原則です。
以下の原則は複数重なることが多くあります。
一つの原則が守れたとしても他の原則違反を犯すことはありますので注意してください。
単一責任原則 (Single Responsibility Principle, SRP)
この原則は、クラスは1つの責任を持つべきで、それに変更がある場合はその責任にのみ関連する変更であるべきだと主張します。つまり、1つのクラスには1つの役割だけを持たせることで、コードの可読性や再利用性が向上します。
オープン・クローズド原則 (Open/Closed Principle, OCP)
この原則は、ソフトウェアの構成要素(クラス、モジュール、関数など)は、拡張に対して開いていて(新しい機能を追加しやすく)、既存のコードの修正に対して閉じているべきだと主張します。これは、新しい機能を追加する際に既存のコードを変更することなく、拡張できるように設計することを意味します。(※ 既存のコードを変更せずに新しい機能を追加できるようにすること)
リスコフの置換原則 (Liskov Substitution Principle, LSP)
この原則は、派生クラス(サブクラス)は、その基底クラス(スーパークラス)と置換可能であるべきだと主張します。つまり、サブクラスは、スーパークラスの振る舞いを変更せずに、その代わりに使用できるようになるべきです。これにより、コードの再利用性と維持性が向上します。
インターフェース分離原則 (Interface Segregation Principle, ISP)
この原則は、クラスが必要としないインターフェースに依存しないように、インターフェースを小さく、特定の目的に特化させるべきだと主張します。つまり、多くの機能を持つ大きなインターフェースよりも、特定の機能に焦点を当てた小さなインターフェースが望ましいということです。
依存関係逆転の原則 (Dependency Inversion Principle, DIP)
この原則は、高レベルのモジュールは低レベルのモジュールに直接依存すべきではなく、両方のモジュールは抽象に依存すべきだと主張します。また、抽象は詳細に依存すべきではなく、詳細が抽象に依存すべきだとも言われています。これにより、コードの再利用性や疎結合性が向上し、変更やテストが容易になります。
interface Database {
getData(): string[];
}
class MySQLDatabase implements Database {
getData(): string[] {
return ["MySQLデータ1", "MySQLデータ2"];
}
}
class MongoDBDatabase implements Database {
getData(): string[] {
return ["MongoDBデータ1", "MongoDBデータ2"];
}
}
// Databaseインターフェースに依存
class DataProcessor {
constructor(private database: Database) {}
processData(): void {
const data = this.database.getData();
// データの加工や表示などの処理を行う
console.log("Processed data:", data);
}
}
const mySQLDatabase = new MySQLDatabase();
const dataProcessor1 = new DataProcessor(mySQLDatabase);
dataProcessor1.processData(); // 出力: Processed data: [ 'MySQLデータ1', 'MySQLデータ2' ]
const mongoDBDatabase = new MongoDBDatabase();
const dataProcessor2 = new DataProcessor(mongoDBDatabase);
dataProcessor2.processData(); // 出力: Processed data: [ 'MongoDBデータ1', 'MongoDBデータ2' ]
本記事の内容を学習されている方の力になれたらとおもい投稿しました。
記事の内容に間違いがあれば是非ともご指摘いただきたいです。