Определение нарушений принципов GRASP в представленном коде

Сначала исправьте синтаксис products = []. Основные проблемы — несогласованный total_price, повторное применение скидки и передача изменяемого списка корзины в заказ.

Короткий ответ

Что ответить на собеседовании

Сначала исправьте синтаксис 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 оформления вынесите в отдельный сервис по мере реальной необходимости.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее