Skip to content

Instantly share code, notes, and snippets.

@mather mather/README.md
Created Apr 16, 2017

Embed
What would you like to do?
南九州ソフトウェア設計Labo vol.2 ハンズオン課題

南九州ソフトウェア設計ハンズオン

https://sk-design-labo.connpass.com/event/53851/

課題

  • オブジェクト指向
  • ピザを購入する流れを記述
    • 1500円のピザを購入
    • -800円のキャンペーンが適用されたりされなかったり
    • 合計金額と購入者の名前を表示
  • タスクベースで全てを記述するのではなく、オブジェクトベースで定義すべし

やったこと

  • 商品(Product), キャンペーン(Campaign), カート(Cart), 注文(Order) に分解してそれぞれの責務を明確に
  • NoCampaign で NullObject パターンを利用
  • 「出力する」というお題に対して「レシートを表示(show_receipt)」という名前をつけたのでイメージしやすくなった

もっとできたこと

  • 顧客(Customer)クラスを作っていない
  • レシートの出力をOrderに持たせず別クラスにした方がいいかも
class Product:
def __init__(self, name, price):
self._name = name
self._price = price
def price(self):
return self._price
def name(self):
return self._name
class Campaign:
def __init__(self, name, discount):
self._name = name
self._discount = discount
def discount(self):
return self._discount
def name(self):
return self._name
class NoCampaign:
def discount(self):
return 0
def name(self):
return 'キャンペーン適用無し'
class Cart:
def __init__(self):
self._products = []
def products(self):
return self._products
def add(self, product):
self._products.append(product)
class Order:
def __init__(self, customer_name, cart, campaign):
self._customer_name = customer_name
self._products = cart.products()
self._campaign = campaign
def show_receipt(self):
total = 0
receipt = "{0}\n".format(self._customer_name)
for product in self._products:
receipt += " {0} {1}\n".format(product.name(), product.price())
total += product.price()
if self._campaign is not None:
receipt += " {0} {1}\n".format(self._campaign.name(), self._campaign.discount())
total += self._campaign.discount()
receipt += "合計 {0}".format(total)
return receipt
if __name__ == '__main__':
cart = Cart()
cart.add(Product("pizza", 1500))
#campaign = Campaign("ハンズオン割", -800)
campaign = NoCampaign()
order = Order("Customer", cart, campaign)
print(order.show_receipt())
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.