[실습과제] Dessert 클래스 추가하기

 

위 1번의 클래스 다이어그램과 2번의 예시코드를 기반으로 MenuItem에 Dessert 클래스를 추가하고 코드를 완성하시오. 단, 메뉴 관리는 등록/수정/조회 기능을 필수로 구현하고 삭제 기능은 등록/수정/조회 기능이 완성 된 후에 구현하시오. 

 

[제출 1]  메뉴관리 클래스 다이어그램 (Dessert 클래스 추가)

 

[제출 2]  메뉴관리  구현 코드

 

KioskUI, MenuController, MenuRepository, MenuItem, Coffee, Dessert 클래스 포함

class MenuItem:
    def __init__(self, menu_id, menu_type, name, price, description, status):
        self.__menu_id = menu_id
        self.__menu_type = menu_type
        self.__name = name
        self.__price = price
        self.__description = description
        self.__status = status

    @property
    def menu_id(self):
        return self.__menu_id

    @property
    def menu_type(self):
        return self.__menu_type

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        self.__name = value

    @property
    def price(self):
        return self.__price

    @price.setter
    def price(self, value):
        self.__price = int(value)

    @property
    def description(self):
        return self.__description

    @description.setter
    def description(self, value):
        self.__description = value

    @property
    def status(self):
        return self.__status

    @status.setter
    def status(self, value):
        self.__status = value

    def to_dict(self):
        return {
            "menu_id": self.__menu_id,
            "menu_type": self.__menu_type,
            "name": self.__name,
            "price": self.__price,
            "description": self.__description,
            "status": self.__status
        }


class Coffee(MenuItem):
    def __init__(self, menu_id, name, price, description, status, bean_type, temp_type):
        super().__init__(menu_id, "Coffee", name, price, description, status)
        self.__bean_type = bean_type
        self.__temp_type = temp_type

    @property
    def bean_type(self):
        return self.__bean_type

    @bean_type.setter
    def bean_type(self, value):
        self.__bean_type = value

    @property
    def temp_type(self):
        return self.__temp_type

    @temp_type.setter
    def temp_type(self, value):
        self.__temp_type = value

    def to_dict(self):
        menu_data = super().to_dict()
        menu_data["bean_type"] = self.__bean_type
        menu_data["temp_type"] = self.__temp_type
        return menu_data


class Dessert(MenuItem):
    def __init__(self, menu_id, name, price, description, status, allergy, calories):
        super().__init__(menu_id, "Dessert", name, price, description, status)
        self.__allergy = allergy
        self.__calories = calories

    @property
    def allergy(self):
        return self.__allergy

    @allergy.setter
    def allergy(self, value):
        self.__allergy = value

    @property
    def calories(self):
        return self.__calories

    @calories.setter
    def calories(self, value):
        self.__calories = int(value)

    def to_dict(self):
        menu_data = super().to_dict()
        menu_data["allergy"] = self.__allergy
        menu_data["calories"] = self.__calories
        return menu_data


class MenuRepository:
    def __init__(self):
        self.__menu_list = []
        self.__next_menu_id = 1

    def generate_menu_item_id(self):
        menu_id = self.__next_menu_id
        self.__next_menu_id += 1
        return menu_id

    def add_menu_item(self, menu_item):
        self.__menu_list.append(menu_item)

    def find_all(self):
        return self.__menu_list

    def find_by_id(self, menu_id):
        for menu_item in self.__menu_list:
            if menu_item.menu_id == menu_id:
                return menu_item
        return None

    def find_by_type(self, menu_type):
        result = []

        for menu_item in self.__menu_list:
            if menu_item.menu_type == menu_type:
                result.append(menu_item)

        return result


class MenuController:
    def __init__(self):
        self.__menu_repository = MenuRepository()

    def check_mandatory_field(self, name, price, status):
        return all([name, price, status])

    def register_menu_item(self, menu_type, name, price, description, status,
                           bean_type=None, temp_type=None, allergy=None, calories=None):

        menu_id = self.__menu_repository.generate_menu_item_id()

        if menu_type == "Coffee":
            menu_item = Coffee(menu_id, name, int(price), description, status, bean_type, temp_type)

        elif menu_type == "Dessert":
            menu_item = Dessert(menu_id, name, int(price), description, status, allergy, calories)

        else:
            menu_item = MenuItem(menu_id, menu_type, name, int(price), description, status)

        self.__menu_repository.add_menu_item(menu_item)

    def retrieve_menu_list(self):
        menu_items = self.__menu_repository.find_all()
        result = []

        for item in menu_items:
            result.append(item.to_dict())

        return result

    def retrieve_menu_by_id(self, menu_id):
        menu_item = self.__menu_repository.find_by_id(int(menu_id))

        if menu_item is None:
            return None

        return menu_item.to_dict()

    def retrieve_menu_by_type(self, menu_type):
        menu_items = self.__menu_repository.find_by_type(menu_type)
        result = []

        for item in menu_items:
            result.append(item.to_dict())

        return result

    def modify_menu_item(self, menu_id, field, new_value):
        menu_item = self.__menu_repository.find_by_id(int(menu_id))

        if menu_item is None:
            return False

        if field == "1":
            menu_item.name = new_value

        elif field == "2":
            menu_item.price = new_value

        elif field == "3":
            menu_item.description = new_value

        elif field == "4":
            menu_item.status = new_value

        elif field == "5":
            if isinstance(menu_item, Coffee):
                menu_item.bean_type = new_value
            elif isinstance(menu_item, Dessert):
                menu_item.allergy = new_value
            else:
                return False

        elif field == "6":
            if isinstance(menu_item, Coffee):
                menu_item.temp_type = new_value
            elif isinstance(menu_item, Dessert):
                menu_item.calories = new_value
            else:
                return False

        else:
            return False

        return True


class MainUI:
    def __init__(self):
        self.__menu_controller = MenuController()

    def run(self):
        while True:
            self.__print_main_menu()
            selected_menu = input("메뉴를 선택하세요: ")

            if selected_menu == "11":
                self.__select_register_menu()

            elif selected_menu == "12":
                self.__select_modify_menu()

            elif selected_menu == "13":
                self.__select_delete_menu()

            elif selected_menu == "14":
                self.__select_retrieve_menu()

            elif selected_menu == "21":
                self.__select_order()

            elif selected_menu == "0":
                print("프로그램 종료")
                break

            else:
                print("잘못된 입력")

    def __print_main_menu(self):
        print("\n============= 카페 키오스크 =============")
        print("메뉴관리(관리자)       주문관리(고객)")
        print("11. 메뉴 등록          21. 주문[TODO]")
        print("12. 메뉴 수정")
        print("13. 메뉴 삭제[TODO]")
        print("14. 메뉴 조회")
        print("0. 종료")
        print("========================================")

    def __select_register_menu(self):
        print("\n[메뉴 등록]")
        print("1. Coffee")
        print("2. Dessert")

        menu_type_input = input("유형 선택: ")

        if menu_type_input == "1":
            menu_type = "Coffee"

        elif menu_type_input == "2":
            menu_type = "Dessert"

        else:
            print("잘못된 입력")
            return

        name = input("메뉴명: ")
        price = input("가격: ")
        description = input("설명: ")
        status = input("상태(1. 판매중, 2. 품절): ")

        bean_type = None
        temp_type = None
        allergy = None
        calories = None

        if menu_type == "Coffee":
            print("\n원두 종류")
            print("Arabica, Robusta, Ethiopia, Colombia, Kenya AA, Blend")
            bean_type = input("원두 종류 입력: ")

            print("\n온도 선택")
            print("hot, ice")
            temp_type = input("선택: ")

            if temp_type not in ["hot", "ice"]:
                print("잘못된 입력")
                return

        elif menu_type == "Dessert":
            allergy = input("알레르기 정보: ")
            calories = input("칼로리: ")

        if not self.__menu_controller.check_mandatory_field(name, price, status):
            print("누락된 정보를 입력하세요.")
            return

        self.__menu_controller.register_menu_item(
            menu_type, name, price, description, status,
            bean_type, temp_type, allergy, calories
        )

        print("등록 완료")

    def __display_menu_list(self, menu_list):
        print(
            f"{'ID':<5}"
            f"{'Type':<10}"
            f"{'이름':<15}"
            f"{'가격':<10}"
            f"{'상태':<10}"
            f"{'설명':<20}"
            f"{'원두':<15}"
            f"{'온도':<10}"
            f"{'알레르기':<15}"
            f"{'칼로리':<10}"
        )
        print("-" * 130)

        for m in menu_list:
            print(
                f"{m['menu_id']:<5}"
                f"{m['menu_type']:<10}"
                f"{m['name']:<15}"
                f"{m['price']:<10}"
                f"{m['status']:<10}"
                f"{m['description']:<20}"
                f"{m.get('bean_type', ''):<15}"
                f"{m.get('temp_type', ''):<10}"
                f"{m.get('allergy', ''):<15}"
                f"{m.get('calories', ''):<10}"
            )

        print("=" * 130)

    def __select_modify_menu(self):
        print("\n[메뉴 수정]")

        menu_list = self.__menu_controller.retrieve_menu_list()

        if not menu_list:
            print("메뉴 없음")
            return

        self.__display_menu_list(menu_list)

        menu_id = input("수정할 메뉴 ID 입력: ")
        menu_item = self.__menu_controller.retrieve_menu_by_id(menu_id)

        if menu_item is None:
            print("존재하지 않는 ID입니다.")
            return

        print("\n[현재 메뉴 정보]")
        print(f"메뉴명 : {menu_item['name']}")
        print(f"가격   : {menu_item['price']}")
        print(f"설명   : {menu_item['description']}")
        print(f"상태   : {menu_item['status']}")

        print("\n수정 항목")
        print("1. 메뉴명")
        print("2. 가격")
        print("3. 설명")
        print("4. 상태")

        if menu_item["menu_type"] == "Coffee":
            print(f"원두   : {menu_item['bean_type']}")
            print(f"온도   : {menu_item['temp_type']}")
            print("5. 원두")
            print("6. 온도")

        elif menu_item["menu_type"] == "Dessert":
            print(f"알레르기 : {menu_item['allergy']}")
            print(f"칼로리   : {menu_item['calories']}")
            print("5. 알레르기")
            print("6. 칼로리")

        field_no = input("선택: ")
        field_value = input("새로운 값 입력: ")

        result = self.__menu_controller.modify_menu_item(menu_id, field_no, field_value)

        if result:
            print("수정 완료")

        else:
            print("수정 실패")

    def __select_retrieve_menu(self):
        print("\n[메뉴 조회]")
        print("1. 전체 조회")
        print("2. Coffee 조회")
        print("3. Dessert 조회")

        selected_menu = input("선택: ")

        if selected_menu == "1":
            menu_list = self.__menu_controller.retrieve_menu_list()

        elif selected_menu == "2":
            menu_list = self.__menu_controller.retrieve_menu_by_type("Coffee")

        elif selected_menu == "3":
            menu_list = self.__menu_controller.retrieve_menu_by_type("Dessert")

        else:
            print("잘못된 입력")
            return

        if not menu_list:
            print("메뉴 없음")
            return

        self.__display_menu_list(menu_list)

    def __select_delete_menu(self):
        print("[TODO] 메뉴 삭제")

    def __select_order(self):
        print("[TODO] 주문 기능")


if __name__ == "__main__":
    ui = MainUI()
    ui.run()

+ Recent posts