質問編集履歴
4
回答へのお礼を追記した
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
具体例の追加
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
誤字の修正のみ
title
CHANGED
File without changes
|
body
CHANGED
@@ -4,18 +4,18 @@
|
|
4
4
|
先ほど友人と,「鶏肉を5つに切る」にはどうすれば良いかという例えばなしをしていました。
|
5
5
|
これを実装する場合,
|
6
6
|
|
7
|
-
* chicken.cut(5) # chickenは (Foodクラスを継承した)
|
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つに分割された状態になる」前者の方が自然であるように思えます。それに説明が短
|
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.
|
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
書式の改善
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を消費して料理
|
19
|
+
* 食材chickenとeggを消費して料理oyakodonを完成させる → chef.cook("oyakodon")
|
20
20
|
* 熟練度システムを加える → 「if self.level >= 10」などを加える
|
21
21
|
* 「knife」が無いとcutできないことにする → 「if self.has_knife」などを加える
|
22
22
|
|