teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

回答へのお礼を追記した

2016/07/24 06:58

投稿

MasatakaMiyoshi
MasatakaMiyoshi

スコア109

title CHANGED
File without changes
body CHANGED
@@ -76,4 +76,10 @@
76
76
  chef.level += 10
77
77
  chef.cut('meat', 5) # meatを5個に切断しました
78
78
  chef.show_foods() # {'meat': (2.0, 15)}
79
- ```
79
+ ```
80
+
81
+ 皆さん多くの有用な回答をありがとうございました。
82
+ 当初の質問「foodが切るかchefが切るか」について,food派の回答で最も納得のいく理由を説明してくださったLLmanさんをベストアンサーとさせていただきました。
83
+ (全員へ返信する時間がなかったのでLLmanさんへの返信欄に全員宛のお礼を書かせていただきました)
84
+
85
+ 今回知ったことを実際のコーディングにも活かせていければと思っております。

3

具体例の追加

2016/07/24 06:58

投稿

MasatakaMiyoshi
MasatakaMiyoshi

スコア109

title CHANGED
File without changes
body CHANGED
@@ -25,4 +25,55 @@
25
25
  他にも,料理は料理で別クラスにすべきだ,とか,オブジェクト指向が本当に必要なのか,とか,初心者なりに様々な意見が出ました。
26
26
 
27
27
  これらについて,オブジェクト指向に慣れた方の意見を聞きたいです。
28
- よろしくお願いします。
28
+ よろしくお願いします。
29
+
30
+ ---
31
+
32
+ 補足: 僕が想定していた設計例はこんな感じです
33
+
34
+ ```Python
35
+ class Food(object):
36
+ def __init__(self, size, hardness):
37
+ self.size = size
38
+ self.hardness = hardness
39
+
40
+
41
+ class Chef(object):
42
+ def __init__(self, level):
43
+ self.level = level
44
+ self.has_knife = False
45
+ self.foods_ = {}
46
+
47
+ def set_food(self, food, obj, n):
48
+ self.foods_[food] = [obj, n]
49
+ print('%sを手に入れた!' % (food))
50
+
51
+ def show_foods(self):
52
+ foods = self.foods_
53
+ return {i: (foods[i][0].size, foods[i][1]) for i in foods.keys()}
54
+
55
+ def cut(self, food, n):
56
+ if food not in self.foods_.keys():
57
+ print('食材がありません')
58
+ elif not self.has_knife:
59
+ print('ナイフがないと切れません')
60
+ elif self.level < self.foods_[food][0].hardness:
61
+ print('レベルがたりません')
62
+ else:
63
+ self.foods_[food][0].size *= 1 / n
64
+ self.foods_[food][1] *= n
65
+ print('%sを%d個に切断しました' % (food, n))
66
+
67
+ meat = Food(size=10, hardness=3)
68
+ chef = Chef(level=1)
69
+ chef.cut('meat', 5) # 食材がありません
70
+ chef.show_foods() # {}
71
+ chef.set_food('meat', meat, 3) # 'meatを手に入れた!'
72
+ chef.show_foods() # {'meat': (10, 3)}
73
+ chef.cut('meat', 5) # ナイフがないと切れません
74
+ chef.has_knife = True
75
+ chef.cut('meat', 5) # レベルがたりません
76
+ chef.level += 10
77
+ chef.cut('meat', 5) # meatを5個に切断しました
78
+ chef.show_foods() # {'meat': (2.0, 15)}
79
+ ```

2

誤字の修正のみ

2016/07/22 00:19

投稿

MasatakaMiyoshi
MasatakaMiyoshi

スコア109

title CHANGED
File without changes
body CHANGED
@@ -4,18 +4,18 @@
4
4
  先ほど友人と,「鶏肉を5つに切る」にはどうすれば良いかという例えばなしをしていました。
5
5
  これを実装する場合,
6
6
 
7
- * chicken.cut(5) # chickenは (Foodクラスを継承した) Meetクラスのインスタンス
7
+ * chicken.cut(5) # chickenは (Foodクラスを継承した) Meatクラスのインスタンス
8
8
  * chef.cut("chicken", 5) # chefはChefクラスのインスタンス。あらかじめset_foodなどで{"chicken": chicken}を内部に保持した状態にしておく
9
9
 
10
10
  の2通りが考えられるのではないかと思います。
11
11
 
12
- 鶏肉の状態が変化するという意味では,「chickenが5つに分割された状態になる」前者の方が自然であるように思えます。それに説明が短いです。おまけに「オブジェクト指向 料理」で検索するとこっちの例え話しか出てきません。議論のきっかけになった第三者の意見も,「鶏肉.cut(5)できたらいいのに」というものでした。
12
+ 鶏肉の状態が変化するという意味では,「chickenが5つに分割された状態になる」前者の方が自然であるように思えます。それに説明が短くて済みます。おまけに「オブジェクト指向 料理」で検索するとこっちの例え話しか出てきません。議論のきっかけになった第三者の意見も,「鶏肉.cut(5)できたらいいのに」というものでした。
13
13
 
14
14
  しかし一方,cutするのは料理人であることを踏まえると,「chefがchickenを5つにcutする」方が自然です。しかも,
15
15
 
16
16
  * 食材chickenとeggを混ぜる → chef.mix("chicken", "egg")
17
17
  * 手持ちの食材を見せる → chef.show_foods()
18
- * 親子丼のレシピを覚える → chef.set_menu("oyakodon", [needed_foods])
18
+ * 親子丼のレシピを覚える → chef.learn_menu("oyakodon", [needed_foods])
19
19
  * 食材chickenとeggを消費して料理oyakodonを完成させる → chef.cook("oyakodon")
20
20
  * 熟練度システムを加える → 「if self.level >= 10」などを加える
21
21
  * 「knife」が無いとcutできないことにする → 「if self.has_knife」などを加える

1

書式の改善

2016/07/22 00:06

投稿

MasatakaMiyoshi
MasatakaMiyoshi

スコア109

title CHANGED
@@ -1,1 +1,1 @@
1
- オブジェクト指向で料理を例える場合
1
+ オブジェクト指向で料理を例える場合,chicken.cut()かchef.cut()か
body CHANGED
@@ -15,8 +15,8 @@
15
15
 
16
16
  * 食材chickenとeggを混ぜる → chef.mix("chicken", "egg")
17
17
  * 手持ちの食材を見せる → chef.show_foods()
18
- * レシピを覚える → chef.set_menu("oyakodon", [needed_foods])
18
+ * 親子丼のレシピを覚える → chef.set_menu("oyakodon", [needed_foods])
19
- * 食材chickenとeggを消費して料理Cを完成させる → chef.cook("oyakodon")
19
+ * 食材chickenとeggを消費して料理oyakodonを完成させる → chef.cook("oyakodon")
20
20
  * 熟練度システムを加える → 「if self.level >= 10」などを加える
21
21
  * 「knife」が無いとcutできないことにする → 「if self.has_knife」などを加える
22
22