実用的で無い内容なのでここで聞いて良いのか悩みましたが,一応クラスの設計の参考になるだろうと思って質問しました。
自分の普段使いがPythonなので,説明用のコードはPython風ですが,どの言語にも共通する問題だと思います。
先ほど友人と,「鶏肉を5つに切る」にはどうすれば良いかという例えばなしをしていました。
これを実装する場合,
- chicken.cut(5) # chickenは (Foodクラスを継承した) Meatクラスのインスタンス
- chef.cut("chicken", 5) # chefはChefクラスのインスタンス。あらかじめset_foodなどで{"chicken": chicken}を内部に保持した状態にしておく
の2通りが考えられるのではないかと思います。
鶏肉の状態が変化するという意味では,「chickenが5つに分割された状態になる」前者の方が自然であるように思えます。それに説明が短くて済みます。おまけに「オブジェクト指向 料理」で検索するとこっちの例え話しか出てきません。議論のきっかけになった第三者の意見も,「鶏肉.cut(5)できたらいいのに」というものでした。
しかし一方,cutするのは料理人であることを踏まえると,「chefがchickenを5つにcutする」方が自然です。しかも,
- 食材chickenとeggを混ぜる → chef.mix("chicken", "egg")
- 手持ちの食材を見せる → chef.show_foods()
- 親子丼のレシピを覚える → chef.learn_menu("oyakodon", [needed_foods])
- 食材chickenとeggを消費して料理oyakodonを完成させる → chef.cook("oyakodon")
- 熟練度システムを加える → 「if self.level >= 10」などを加える
- 「knife」が無いとcutできないことにする → 「if self.has_knife」などを加える
と,後々の拡張が容易です。なので,僕はこちらの案に一票を入れました (とはいえ,Chefクラスを一体どれほど大規模なクラスにするつもりなのでしょうか?)
他にも,料理は料理で別クラスにすべきだ,とか,オブジェクト指向が本当に必要なのか,とか,初心者なりに様々な意見が出ました。
これらについて,オブジェクト指向に慣れた方の意見を聞きたいです。
よろしくお願いします。
補足: 僕が想定していた設計例はこんな感じです
Python
1class Food(object): 2 def __init__(self, size, hardness): 3 self.size = size 4 self.hardness = hardness 5 6 7class Chef(object): 8 def __init__(self, level): 9 self.level = level 10 self.has_knife = False 11 self.foods_ = {} 12 13 def set_food(self, food, obj, n): 14 self.foods_[food] = [obj, n] 15 print('%sを手に入れた!' % (food)) 16 17 def show_foods(self): 18 foods = self.foods_ 19 return {i: (foods[i][0].size, foods[i][1]) for i in foods.keys()} 20 21 def cut(self, food, n): 22 if food not in self.foods_.keys(): 23 print('食材がありません') 24 elif not self.has_knife: 25 print('ナイフがないと切れません') 26 elif self.level < self.foods_[food][0].hardness: 27 print('レベルがたりません') 28 else: 29 self.foods_[food][0].size *= 1 / n 30 self.foods_[food][1] *= n 31 print('%sを%d個に切断しました' % (food, n)) 32 33meat = Food(size=10, hardness=3) 34chef = Chef(level=1) 35chef.cut('meat', 5) # 食材がありません 36chef.show_foods() # {} 37chef.set_food('meat', meat, 3) # 'meatを手に入れた!' 38chef.show_foods() # {'meat': (10, 3)} 39chef.cut('meat', 5) # ナイフがないと切れません 40chef.has_knife = True 41chef.cut('meat', 5) # レベルがたりません 42chef.level += 10 43chef.cut('meat', 5) # meatを5個に切断しました 44chef.show_foods() # {'meat': (2.0, 15)}
皆さん多くの有用な回答をありがとうございました。
当初の質問「foodが切るかchefが切るか」について,food派の回答で最も納得のいく理由を説明してくださったLLmanさんをベストアンサーとさせていただきました。
(全員へ返信する時間がなかったのでLLmanさんへの返信欄に全員宛のお礼を書かせていただきました)
今回知ったことを実際のコーディングにも活かせていければと思っております。

回答13件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/07/22 12:36