Сначала исправьте синтаксис products = []. Основные проблемы — несогласованный total_price, повторное применение скидки и передача изменяемого списка корзины в заказ.
Определение нарушений принципов GRASP в представленном коде
Сначала исправьте синтаксис products = []. Основные проблемы — несогласованный total_price, повторное применение скидки и передача изменяемого списка корзины в заказ.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определите, какие из принципов GRASP нарушаются в следующем фрагменте кода.
class Product:
def __init__(self, name, price):
self.name = name
self.price = price
def calculate_discount(self, discount_percentage):
return self.price * (1 - discount_percentage / 100)
class ShoppingCart:
def __init__(self):
self.products =
self.total_price = 0
def add_product(self, product):
self.products.append(product)
self.total_price += product.price
def remove_product(self, product):
if product in self.products:
self.products.remove(product)
self.total_price -= product.price
def apply_discount(self, discount_percentage):
for product in self.products:
self.total_price -= product.price - product.calculate_discount(discount_percentage)
def checkout(self, customer):
order = Order(customer, self.products)
order.place_order()
class Order:
def __init__(self, customer, products):
self.customer = customer
self.products = products
def place_order(self):
print("Order placed successfully!")
class Customer:
def __init__(self, name, email):
self.name = name
self.email = email
def add_product_to_cart(self, product, shopping_cart):
shopping_cart.add_product(product)
def remove_product_from_cart(self, product, shopping_cart):
shopping_cart.remove_product(product)
def checkout(self, shopping_cart):
shopping_cart.checkout(self)
# Main program
def main():
customer = Customer("John Doe", "john@example.com")
product1 = Product("Phone", 500)
product2 = Product("Laptop", 1000)
shopping_cart = ShoppingCart()
customer.add_product_to_cart(product1, shopping_cart)
customer.add_product_to_cart(product2, shopping_cart)
customer.checkout(shopping_cart)
if __name__ == "__main__":
main()
Ответ
Сначала исправьте синтаксис products = []. Основные проблемы — несогласованный total_price, повторное применение скидки и передача изменяемого списка корзины в заказ.
Нельзя уверенно объявлять нарушенными все GRASP-принципы только по небольшому примеру. Расчёт скидки в Product соответствует Information Expert: объект знает цену. Создание заказа корзиной также может быть оправдано Creator.
Проблемы проявляются в Low Coupling и High Cohesion: корзина одновременно хранит позиции, управляет скидками и запускает оформление. Повторный apply_discount многократно уменьшает сумму, а изменение цены товара делает кешированный итог устаревшим. Заказ получает тот же список, поэтому дальнейшие изменения корзины меняют его содержимое.
Рассчитывайте итог из согласованного состояния, фиксируйте цены и позиции заказа снимком, а orchestration оформления вынесите в отдельный сервис по мере реальной необходимости.