プログラミングモード-オブジェクト向け(OOP)


概要
オブジェクト向けプログラミング
オブジェクト向けをサポートする言語の多くはClassという構文を提供しています.
このような強力な構文を継承することで、コードの再利用性、柔軟な設計、拡張性を向上させることができます.
  • すべてのものを対象に分けて考え、これらの対象を利用して相互作用して仕事を完成させる.
  • のプロシージャ向けとは異なり、関数とデータが同時に存在します.
  • オブジェクト内部のデータは公開する必要はありません.
  • # FileReader
    Class FileReader:
        def __init__(self) -> None:
    	self.file_types = ["txt"]
    	self.file_history = []
            
        def read(self, file_path: str) -> str:
        	self._validate(file_path)
        	...
        def _validate(self, file_path: str) -> None:
        	for file_type in self.file_types:
            	if file_path.endwith(file_type):
                        return
            raise ValueError("검증할 수 없는 확장자입니다.")
        
    上記のように、FileReaderという名前のオブジェクトでファイルタイプ、ファイル履歴などのデータを管理したり、読み込み、検証などのロジックを管理したりします.
    関数には小さな責任があるほうがいいです.
    オブジェクト向けのコードでは、複数のオブジェクトから構成されます.(またはクラス)
    各オブジェクト(クラス)には、オブジェクトと関数間の呼び出しからなる役割、責任、機能があります.
    上記のコードを例にとると、FileReaderという名前のオブジェクト(クラス)にはreadとfile typeという独自のデータがあり、read関数はvalidate関数を再呼び出して拡張子を検証します.
    効果
    オブジェクト向けプログラミングは、上述したように、オブジェクトとオブジェクトの間でも関数またはメソッド呼び出しによってコード処理され、コードの柔軟性と拡張性が高い.
    前のコードを次のように拡張できます.
    # FileReader (added csv, xlsx reader)
    Class FileReader(File):
        def read(self, file_path: str) -> str:
        	self._validate(file_path)
            data = self._open_file(file_path)
            return self_.read(data)
        
        @abstractmethod   
        def _read(self, data) -> str:
        	pass
            
        @abstractmethod
        def open_file(file_path: str) -> str:
        	...
            
        def _validate(self, file_path: str) -> None:
        	for file_type in self.file_types:
        	    if file_path.endwith(file_type):
    
    class TxtFileReader(FileReader): #FileReader 클래스 상속.
    	def file_type(self) -> str:
        	return "txt"
        def _read(self, data:str) -> str:
        	...
        def somthingmethod(self, data:str) -> str:
        	return something
    以上のようにFileReaderクラスを継承し,TxtReaderという派生クラスを生成する.これらの派生クラスは、それぞれのロールを変更するように容易に設計することができる.
    例.
    class Main:
        def run(self) -> None:
            processor = Processor(
                file_reader = TxtFileReader(),
                data_parser = DataParser(),
                repository = Repository()
            )
    テキストファイルではなくcsvファイルを読み込む必要がある場合は、
    class Main:
        def run(self) -> None:
            processor = Processor(
                file_reader = CsvFileReader(), # 이 라인만 변경해주면 된다.
                data_parser = DataParser(),
                repository = Repository()
            )
    このようにFileReaderのクラスを継承すると、コードは正常に動作します.
    このようなオブジェクト向けの特性を多形性と呼ぶ.
    メリットとデメリット
    オブジェクト向けのプログラミングはデバッグが困難です.コードを見始めたばかりの人は見えにくく、混同しやすく、入力によって異なるワークフローが生成されます.(もちろん、相対的に)
    しかし、複数の開発者が協力したり、拡張可能なコードを設計したりする必要がある場合は、強力なプログラミング方法になります.