前提
プログラミングの初心者です。
多重のif文があるコードを、オブジェクト指向で書き直すには、
どういった書き方をすれば良いでしょうか?
コード例では3Dと2Dのそれぞれの球形、直方体をオブジェクトとして持ちたいです。
現段階では図形に依存するshape.print_shape()の命令を、オブジェクトが自身の図形を知っているのでポリモーフィズムの実現によってメソッドを切り替えられますが、次元は変数として持っていなければならず、次元を増やしたときにif文の改定が必要になるのでメンテナンス性に欠けます。(特に大量にクラスがあった場合すべてのif文に修正が必要)
->if文を使わずに次元の判断をメンテナンス性を維持した状態で付け加えたいです。
またはオブジェクト指向の考え方そのものや、構造がおかしいのであれば指摘していただきたいです。
実現したいこと
”もし3Dデータであり、球体であるなら~”
”もし2Dデータであり、直方体であるなら~”
をif文を使わずにオブジェクト指向で表現したい。
該当のソースコード
python
1from abc import ABCMeta, abstractmethod 2 3class Shape(metaclass=ABCMeta): # 図形のインターフェイス 4 @abstractmethod 5 def print_shape(self): 6 pass 7 8 def print_dimension(self): 9 pass 10 11 12class Globe(Shape): 13 def __init__(self, dimension): 14 self.dimension = dimension 15 16 def print_shape(self): 17 print('This is a Globe') 18 19 def print_dimension(self): 20 if self.dimension == 3: 21 print('This is a 3D object') 22 elif self.dimension == 2: 23 print('This is a 2D object') 24 25class Cube(Shape): 26 def __init__(self, dimension): 27 self.dimension = dimension 28 29 def print_shape(self): 30 print('This is a Cube') 31 32 def print_dimension(self): 33 if self.dimension == 3: 34 print('This is a 3D object') 35 elif self.dimension == 2: 36 print('This is a 2D object') 37 38 39if __name__ == '__main__': 40 data = Cube(2) 41 data.print_shape() 42 data.print_dimension() 43 44 data = Globe(3) 45 data.print_shape() 46 data.print_dimension() 47 48# これをif文を使わずに同じ結果を得たい
修正コード
回答で提案していただいた、委譲を使って書き直しました。
これが正しい使い方なのか、もっとうまく書く方法があるかなど、ご指摘いただければと思います。
python
1from abc import ABCMeta, abstractmethod 2 3 4class Dimension(metaclass=ABCMeta): # 次元のインターフェイス 5 @abstractmethod 6 def print_dimension(self): 7 pass 8 9class Shape(metaclass=ABCMeta): # 図形のインターフェイス 10 @abstractmethod 11 def print_shape(self): 12 pass 13 @abstractmethod 14 def print_dimension(self): 15 pass 16 17 18class Dimension2D(Dimension): # 2Dの次元 19 def print_dimension(self): 20 print('This is a 2D object') 21 22class Dimension3D(Dimension): # 3Dの次元 23 def print_dimension(self): 24 print('This is a 3D object') 25 26 27 28class Globe(Shape): # 球 29 def __init__(self, dimension): 30 self.dimension = dimension 31 32 def print_shape(self): 33 print('This is a Globe') 34 35 def print_dimension(self): 36 self.dimension.print_dimension() 37 38 39class Cube(Shape): # 立方体 40 def __init__(self, dimension): 41 self.dimension = dimension 42 43 def print_shape(self): 44 print('This is a Cube') 45 46 def print_dimension(self): 47 self.dimension.print_dimension() 48 49 50if __name__ == '__main__': 51 data = Cube(Dimension2D()) 52 data.print_shape() 53 data.print_dimension() 54 55 data = Globe(Dimension3D()) 56 data.print_shape() 57 data.print_dimension()
補足情報(FW/ツールのバージョンなど)
python 3.8.10
IED: Spyder IDE 5.4.0
回答1件
あなたの回答
tips
プレビュー