###前提・実現したいこと
オブジェクト指向のクラス設計で困っています。以下のコードについて説明すると、
Comment1,2,3はそれぞれCommentクラスを継承しており、ラッパークラスです。
ReportクラスはComment1,2,3以外にもDate,Nameというラッパークラスを所持しています。
まず、何故Comment1,2,3と分けているかというと、1,2,3それぞれで異なる処理を行うからです。同じ処理を行うこともあるので継承という形にしています。
※各クラスのメソッドは省略しています。
ここでなのですが、デメテルの法則に従うと、Comment1,2,3共通の処理をラッパーメソッドとしてReportクラスに3回同じものを実装しなくてはなりません。これじゃ継承した意味もなくとてつもなく汚く無駄なコードになってしまいます。ですが、ここでデメテルの法則を無視すると、Reportクラスにプロパティを実装するだけで済みます(例:Report.Comment1.length())
そこでなのですが、一般的にデメテルの法則は必ず守った方が良いものなのでしょうか?
また、このケースにおいて、デメテルの法則を守ってかつコードに無駄がないような実装にするにはどのような解決策があるでしょうか?
元々はcomment1,2,3をCommentという1つのクラスで管理しており、引数に数字を与えることで処理するコメントを選んでいました。しかし、commentによって違った処理をすることがあるので、それぞれ変数をラッピングした方が良いのではないかという考えにいたり、今回のような問題が発生したために質問させていただきました。
###該当のソースコード
python
1class Comment: 2 def __init(self,comment): 3 self._comment = comment 4 5class Comment1(Comment): 6 def __init(self,comment1): 7 super().__initi(comment1) 8 self._comment1 = comment1 9 10class Comment2(Comment): 11 def __init(self,comment2): 12 super().__initi(comment2) 13 self._comment1 = comment2 14 15class Comment3(Comment): 16 def __init(self,comment3): 17 super().__initi(comment3) 18 self._comment1 = comment3 19 20class Report: 21 def __init__(self,comment1,comment2,comment3,date,name) 22 self._comment1 = Comment1(comment1) 23 self._comment2 = Comment2(comment2) 24 self._comment3 = Comment3(comment3) 25 self._name = Name(name) 26 self._date = Date(date) 27
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。