Skip to content

Instantly share code, notes, and snippets.

@mather mather/
Created Apr 16, 2017

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



  • オブジェクト指向
  • ピザを購入する流れを記述
    • 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):
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.price())
total += product.price()
if self._campaign is not None:
receipt += " {0} {1}円\n".format(,
total +=
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)
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.