UdemyでPythonを勉強した結果を残すブログ。

40歳でプログラミング始めて転職までいけるのかを実録してみます。

DAY16 OOP(オブジェクト指向プログラミング)を勉強してコーヒーメーカーをアップデートする!

OOPとはObject Oriented Programming の略でオブジェクト指向プログラミングという。

 

今までのようにコーディングしていった場合、実務だとコーディングがどんどん煩雑になっていくので

どこにどのコードを書いたのかわかりにくくなってしまう。

 

今回はクラスを使うことで大枠の要素を定義して、

そこから違うオブジェクトをつくれることでコードを綺麗にして効率化ができる。

 

例えばゲームの世界でも同じエルフでも力が強いエルフだったり魔法が強いエルフだったり元は同じ種族でも能力が違うものがいたりする。

元は同じ種族なのに一人一人最初からコード書いてたら大変だし、

アップデート時にエルフの基礎能力を調整するってなった時に

今までだったらエルフ一人一人書き換えないといけない。

 

それならエルフというクラスを作って、

エルフはまずそこから能力を分けていく方が効率がいい。

というような感じだと思う。

 

種族が違っていても、エルフと人間で同じ魔法が使えるのであれば

魔法もそれぞれクラスとして使えるのかもしれない。

 

 

そんな感じでとりあえず前回のコーヒーメーカーのdefで定義したファンクションを

コーヒーメーカーというクラスの中に収納してコードをアップデートしていくと、こんな感じに書き換えられる。

 

CoffeeMachine.py

class CoffeeMachine:

def insert_money(self):
print("お金を入れてください。")
total = int(input("いくらいれますか? ¥"))
print(f"¥{round(total, 2)} 入りました。")
return total

def make_drink(self, order, resources):
for item in order["ingredients"]:
resources[item] -= order["ingredients"][item]
print(f"…\n\n\n☕️できました。ごゆっくり!\n\n\n")

def check_remains(self, order, resources):
for item in order["ingredients"]:
if resources[item] < order["ingredients"][item]:
print("売り切れです。")
return False
else:
return True

 

名前の書き方は、クラスはCoffeeMachineで単語の最初を大文字にして_ は使わない記述の方がいいとのことなので従っていく。

 


MENU = {
"espresso": {
"ingredients": {
"water": 50,
"coffee": 18,
},
"cost": 300,
},
"latte": {
"ingredients": {
"water": 200,
"milk": 150,
"coffee": 24,
},
"cost": 400,
},
"cappuccino": {
"ingredients": {
"water": 250,
"milk": 100,
"coffee": 24,
},
"cost": 350,
}
}

resources = {
"water": 300,
"milk": 200,
"coffee": 100,
}


from coffee_maker_func import CoffeeMachine

coffee_machine = CoffeeMachine()


def coffee_maker():
profit = 0
can_make = True
while can_make:
order = input("何を飲みますか? espresso:300 / latte:400 / cappuccino:350 : ")
if order == "report":
print(f"water : {resources['water']} ml\nmilk : {resources['milk']}ml\ncoffee : {resources['coffee']}g\n売上:¥{profit}")

elif order == "espresso" or "latte" or "cappuccino":
if coffee_machine.check_remains(MENU[order], resources):
paid_money = coffee_machine.insert_money()
cost = MENU[order]["cost"]
if cost <= paid_money:
coffee_machine.make_drink(MENU[order], resources)
profit += cost
else:
print("お金が足りません。")
coffee_maker()
elif order == "off":
print("電源オフ")
can_make = False


 

前はinsert_money()だけでよかったけどクラスを使うことで
coffee_machine.insert_money()とちょっと文字は増える。

でもこれのおかげでこのメソッドはコーヒーマシーンの定義なんだなとわかるし、

もし違う種類のコーヒーマシーンオブジェクトを作る時も基本機能が同じならばこのクラスは使いまわせる。

 

今はだいぶわかってきているつもりだけど

最初は全然わからなかったしクラスを追加することで

coffee_machine.make_drink(MENU[order], resources)

とかのresourcesみたいに入れる部分が増えることでこんがらがったりするけど

 

やっていくうちになれる。はず。