Menu
Coddy logo textTech

オープン・クローズド

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 の抽象基底クラスをサポートしています。詳しくはこちらをご覧ください。

challenge icon

チャレンジ

中級

与えられた例を変更して、オープン・クローズド原則を適用し、txt から html への変換をサポートする convertor を追加してください。

  1. 抽象クラス TxtConvertor を作成する
  2. TxtConvertorToJsonTxtConvertorToXMLTxtConvertorToHTML クラスを作成し、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オンラインコンパイラ