オープン・クローズド
Coddyの「Clean Code - Pythonでより良いコードを書く」コースのレッスン 23/28。
「ソフトウェアのエンティティは、拡張に対して開かれているべきだが、変更に対しては閉じられているべきである。」
この原則は、あらゆる関数、モジュール、または class が、コード自体を変更せずにその振る舞いを拡張できるようにすべきだというものです。
TxtConvertor という class があり、txt file を json または xml に変換するとします。
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")この構造は Open-Closed 原則に違反しています。
なぜでしょうか?
たとえば、txt file から html への変換をサポートしたい場合、既存の class を変更しなければなりません(クローズドの原則に違反します)。
では、どうすればよいでしょうか?
この例での解決策の 1 つは、主要な関数を保持する抽象 class を作成することです。
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.
abcライブラリは Python の抽象基底クラスをサポートしています。詳しくはこちらをご覧ください。
チャレンジ
中級与えられた例を変更して、オープン・クローズド原則を適用し、txt から html への変換をサポートする convertor を追加してください。
- 抽象クラス
TxtConvertorを作成する TxtConvertorToJson、TxtConvertorToXML、TxtConvertorToHTMLクラスを作成し、TxtConvertorを継承して convertor を実装する(上記の例と同様)
自分で試してみよう
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")Clean Code - Pythonでより良いコードを書くのすべてのレッスン
自分で練習してみよう: Pythonオンラインコンパイラ