Skip to content

Instantly share code, notes, and snippets.

@mather
Created April 16, 2017 08:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mather/17d19fb98d3a36f15a0dacb6686b2938 to your computer and use it in GitHub Desktop.
Save mather/17d19fb98d3a36f15a0dacb6686b2938 to your computer and use it in GitHub Desktop.
南九州ソフトウェア設計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