@nqounetです。
前回の振り返り
前回は、create_reportの戻り値を検証する仕組みを追加しました。
create_validated_reportメソッドで型チェックを行うdoesを使ってReportRoleを持つことを確認する- 型エラーが発生した場合は例外をスローする
今回の目標
今回は、四半期レポートを追加して、この設計の拡張性を確認します。
具体的には、以下のことを行います。
QuarterlyReportクラスを新規作成するQuarterlyReportGeneratorクラスを新規作成する- 既存のコードを一切修正せずに機能を追加する
ストーリー設定
経営陣から「四半期ごとの業績レポートも欲しい」と依頼されました。
これまで作ってきたレポートジェネレーターに、四半期レポートを追加します。
既存の月次・週次・日次レポートに影響を与えずに、新しい機能を追加できるでしょうか?
実装
コード例1: QuarterlyReportクラスの追加
まず、四半期レポートのクラスを新しく作成します。
| |
コード例2: 実行結果の確認
実行結果は以下のようになります。
| |
四半期レポートが追加されました!
開放閉鎖原則(OCP)の実証
classDiagram
class ReportRole {
<<Role>>
+generate()*
+get_period()*
}
class ReportGenerator {
+create_report(title)*
+create_validated_report(title)
+generate_and_print(title)
+generate_and_save(title, filename)
}
class MonthlyReport {
+title
+generate()
+get_period()
}
class WeeklyReport {
+title
+generate()
+get_period()
}
class DailyReport {
+title
+generate()
+get_period()
}
class QuarterlyReport {
+title
+quarter
+generate()
+get_period()
}
class MonthlyReportGenerator {
+create_report(title)
}
class WeeklyReportGenerator {
+create_report(title)
}
class DailyReportGenerator {
+create_report(title)
}
class QuarterlyReportGenerator {
+quarter
+create_report(title)
}
ReportRole <|.. MonthlyReport
ReportRole <|.. WeeklyReport
ReportRole <|.. DailyReport
ReportRole <|.. QuarterlyReport
ReportGenerator <|-- MonthlyReportGenerator
ReportGenerator <|-- WeeklyReportGenerator
ReportGenerator <|-- DailyReportGenerator
ReportGenerator <|-- QuarterlyReportGenerator
MonthlyReportGenerator ..> MonthlyReport : creates
WeeklyReportGenerator ..> WeeklyReport : creates
DailyReportGenerator ..> DailyReport : creates
QuarterlyReportGenerator ..> QuarterlyReport : creates
今回、四半期レポートを追加しましたが、既存のコードは一切修正していません。
修正していないクラス/コード:
ReportRole(ロール)MonthlyReport,WeeklyReport,DailyReport(既存のレポートクラス)ReportGenerator(基底クラス)MonthlyReportGenerator,WeeklyReportGenerator,DailyReportGenerator(既存のジェネレーター)
追加しただけのクラス/コード:
QuarterlyReport(新しいレポートクラス)QuarterlyReportGenerator(新しいジェネレーター)
これが開放閉鎖原則(Open-Closed Principle)です。
開放閉鎖原則: ソフトウェアの構成要素は「拡張に対しては開いていて、修正に対しては閉じている」べき
- 拡張に対して開いている: 新しいレポート種別を追加できる
- 修正に対して閉じている: 既存のコードを修正する必要がない
第2回との比較
第2回では、if/elseで種別を切り替えていました。
| |
この方式だと、新しい種別を追加するたびにReportGeneratorを修正する必要がありました。
今回の方式では、新しいクラスを追加するだけで済みます。
今回のまとめ
今回は、四半期レポートを追加して、開放閉鎖原則を実証しました。
QuarterlyReportクラスを新規作成したQuarterlyReportGeneratorクラスを新規作成した- 既存のコードを一切修正せずに機能を追加できた
この設計により、将来「年次レポート」「半期レポート」などが必要になっても、同じ方法で拡張できます。
次回予告
次回は「完成!レポートジェネレーター」として、全機能を統合してレポートジェネレーターを完成させます。
月次・週次・日次・四半期レポートを生成できる、拡張性の高いシステムの全体像をお見せします。
