소스 ¶
~cpp #include <iostream> using namespace std; #include <string> //자판기 클래스 class VendingMachine { private: int _money; int _temp_money; int _select_money, _select_drink, _insert_amount; struct drink { char * name; int price, amount; }; drink s_drink[5]; int _max_num; public: VendingMachine(); int showMenu(); void get_money(); void buy(); void takeBack_money(); void insertDrink(); }; int VendingMachine::showMenu() { int choice; cout << "\n자판기 입니다\n"; cout << "1.돈을 넣는디\n"; cout << "2.물건을 산다\n"; cout << "3.돈을 거술러 받는다\n"; cout << "4.음료수를 채운다\n"; cout << "0.종료한다\n"; cout << "메뉴를 선택하세요 : "; cin >> choice; return choice; } //자판기의 메뉴를 초기화한다 VendingMachine::VendingMachine() { _money = _temp_money = 0; _max_num = 5; char * drink_name[] = {"coke", "juice", "tea" , "cofee", "milk"}; int price[] = {400, 600, 500, 450, 350}; for(int i = 0 ; i < _max_num ; i++) { s_drink[i].name = drink_name[i]; s_drink[i].price = price[i]; s_drink[i].amount = 10; } } //손님이 돈을 자판기에 넣는다 void VendingMachine::get_money() { cout << "돈을 넣으세요. 10, 50, 100, 500, 1000만 가능 : "; cin >> _temp_money; if(_temp_money == 10 || _temp_money == 50 || _temp_money == 100 || _temp_money == 500 || _temp_money == 1000) _money = _money + _temp_money; else cout << "10, 50, 100, 500, 1000만 가능합니다. 다시 시작해주세요\n"; cout << _money << "원을 넣었습니다\n"; } //손님이 물건을 산다 void VendingMachine::buy() { cout << "음료수\t\t가격\t수량\n"; cout << "------------------------------------\n"; for(int i = 0 ; i < _max_num ; i++) cout << i + 1 << "." << s_drink[i].name << "\t\t" << s_drink[i].price << "\t" << s_drink[i].amount << "\n"; cout << "\n현재 " << _money << "원이 있어요\n"; cout << "원하는 음료수를 선택하세요 : "; cin >> _select_drink; if((_money - s_drink[_select_drink - 1].price) >= 0 && s_drink[_select_drink - 1].amount >= 1) { s_drink[_select_drink - 1].amount--; _money = _money - s_drink[_select_drink - 1].price; } else cout << "잔액이 부족하거나 수량이 부족해요\n"; cout << _money << "원이 남았어요\n"; } //손님의 거스름돈을 내어준다 void VendingMachine::takeBack_money() { cout << "거스름돈" << _money << "원을 돌려드립니다\n"; _money = 0; } //음료수를 채운다 void VendingMachine::insertDrink() { for(int i = 0 ; i < _max_num ; i++) cout << i + 1 << "." << s_drink[i].name << "\t" << s_drink[i].amount << "\n"; cout << "채우길 원하는 음료수를 선택하세요 : "; cin >> _select_drink; cout << "채우길 원하는 음료수 수량을 입력해주세요 : "; cin >> _insert_amount; s_drink[_select_drink - 1].amount += _insert_amount; cout << "음료수를 채웠습니다\n"; for(i = 0 ; i < _max_num ; i++) cout << i + 1 << "." << s_drink[i].name << "\t" << s_drink[i].amount << "\n"; } int main() { VendingMachine VendingMachine; int choice = VendingMachine.showMenu(); while(choice != 0) { if( choice >= 0 || choice <= 4) { switch(choice) { case 1: VendingMachine.get_money(); break; case 2: VendingMachine.buy(); break; case 3: VendingMachine.takeBack_money(); break; case 4: VendingMachine.insertDrink(); break; case 0: cout << "자판기를 종료합니다!!\n\n"; break; } } else cout << "잘못된 입력입니다. 다시 입력해주세요 : "; choice = VendingMachine.showMenu(); } return 0; }
코드의 경우 가장 간단한 평가 기준으로 두가지를 둔다면,
- 코드를 읽기 편한가. - 외부로 보이는 public 메소드의 이름에 대해 'how' 가 아닌 'what' 이 표현되어야 할겁니다. 클래스는 보통 '이용되어지는 모습' 으로 이용되므로, 어떤 알고리즘을 쓰느냐가 메소드로 표현되는게 아니라 '무엇을 할것인가' 가 표현되어야 겠죠.
- 코드의 중복이 얼마나 적은가 - 코드 중복이 많을 수록, 코드 하나가 잘못되면, 나머지 중복코드들도 다 고쳐줘야 합니다. Copy & Paste 를 하는 것과 함수/메소드로 추출한 것의 차이가 되겠죠.
- 두가지 기준 하에 코드를 수정해보면, 더 좋은 디자인의 코드를 작성할 수 있습니다. --1002
- 제가 대충 고쳐보았습니다 -- 재동