オープン・クローズド
Coddyの「Clean Code - Pythonでより良いコードを書く」コースのレッスン 23/28。
「ソフトウェアの構成要素は、拡張に対しては開いていなければならないが、修正に対しては閉じていなければならない。」
この原則は、関数、モジュール、またはクラスは、コード自体を修正することなく、その動作の拡張を可能にすべきであると述べています。
例えば、txtファイルをjsonまたはxmlに変換するTxtConvertorクラスがあるとします。
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 principle)に違反しています。
なぜでしょうか?
例えば、txtファイルからhtmlへの変換のサポートを追加したい場合、既存のクラスを修正する必要があります(「修正に対して閉じている」という原則に違反します)。
では、どうすればよいのでしょうか?
この例では、一つの解決策として、メインの関数を保持する抽象クラスを作成することが挙げられます。
from abc import ABC, abstractmethod
class TxtConvertor(ABC):
@abstractmethod
def convert(self, file):
pass
class TxtConvertorToJson(TxtConvertor):
...
.
.
.
abcライブラリはPythonの抽象基底クラスをサポートしています。詳細はこちらで確認できます。
チャレンジ
中級与えられた例を修正して開放閉鎖の原則(Open-Closed principle)を適用し、txt から html への変換をサポートするコンバーターを追加してください。
- 抽象クラス
TxtConvertorを作成してください。 TxtConvertorを継承し、(上記の例のように)コンバーターを実装するクラスTxtConvertorToJson、TxtConvertorToXML、TxtConvertorToHTMLを作成してください。
自分で試してみよう
class TxtConvertor:
def convert_to_json(self, file):
print("converts file to json")
def convert_to_xml(self, file):
print("converts file to xml")