fork download
  1. Hamburger.SIZE_SMALL = "small";
  2. Hamburger.SIZE_BIG = "big";
  3. Hamburger.STUFFING_CHEESE = "cheese";
  4. Hamburger.STUFFING_SALAD = "salad";
  5. Hamburger.STUFFING_POTATO = "potato";
  6. Hamburger.TOPPING_SAUCE = "sauce";
  7. Hamburger.TOPPING_MAYO = "mayo";
  8.  
  9. function Hamburger(size, stuffing) {
  10. this._setSize(size);
  11. this._setStuffing(stuffing);
  12. this._toppings = {};
  13. }
  14. Hamburger.sizeList = {
  15. "small": {money: 50, calories: 20},
  16. "big": {money: 100, calories: 40}
  17. };
  18. Hamburger.stuffingList = {
  19. "cheese": {money: 10, calories: 20},
  20. "salad": {money: 20, calories: 5},
  21. "potato": {money: 15, calories: 10}
  22. };
  23. Hamburger.toppingList = {
  24. "sauce": {money: 15, calories: 0},
  25. "mayo": {money: 20, calories: 5}
  26. };
  27. Hamburger.prototype._setSize = function(size) {
  28. if (size === undefined) {
  29. throw new HamburgerException("Не задан размер.");
  30. } else if (!(size in Hamburger.sizeList)) {
  31. throw new HamburgerException("Неправильный размер " + size + "." +
  32. " Разрешены размеры: " + Object.keys(Hamburger.sizeList) + ".");
  33. }
  34. this._size = Hamburger.sizeList[size];
  35. };
  36. Hamburger.prototype._setStuffing = function(stuffing) {
  37. if (stuffing === undefined) {
  38. throw new HamburgerException("Не задана начинка.");
  39. } else if (!(stuffing in Hamburger.stuffingList)) {
  40. throw new HamburgerException("Неправильная начинка " + stuffing + "." +
  41. " Разрешены начинки: " + Object.keys(Hamburger.stuffingList) + ".");
  42. }
  43. this._stuffing = Hamburger.stuffingList[stuffing];
  44. };
  45. Hamburger.prototype._setTopping = function(topping) {
  46. if (!(topping in Hamburger.toppingList)) {
  47. throw new HamburgerException("Неправильная добавка " + topping + "." +
  48. " Разрешены добавки: " + Object.keys(Hamburger.toppingList) + ".");
  49. } else if (topping in this._toppings) {
  50. throw new HamburgerException("Нельзя два раза добавить добавку " + topping + ".");
  51. }
  52. this._toppings[topping] = Hamburger.toppingList[topping];
  53. };
  54. Hamburger.prototype.addTopping = function(topping) {
  55. this._setTopping(topping);
  56. };
  57. Hamburger.prototype.calculateCalories = function() {
  58. var calories = this._size.calories + this._stuffing.calories;
  59. if (this._toppings.length != 0) {
  60. for (var topping in this._toppings) {
  61. calories += this._toppings[topping].calories;
  62. }
  63. }
  64. return calories;
  65. };
  66. Hamburger.prototype.calculatePrice = function() {
  67. var money = this._size.money + this._stuffing.money;
  68. if (this._toppings.length != 0) {
  69. for (var topping in this._toppings) {
  70. money += this._toppings[topping].money;
  71. }
  72. }
  73. return money;
  74. };
  75.  
  76. function HamburgerException(errorMessage) {
  77. this.name = "HamburgerException";
  78. this.message = errorMessage;
  79. }
  80.  
  81. // маленький гамбургер с начинкой из сыра
  82. var hamburger = new Hamburger(Hamburger.SIZE_SMALL, Hamburger.STUFFING_CHEESE);
  83. // добавка из майонеза
  84. hamburger.addTopping(Hamburger.TOPPING_MAYO);
  85. // спросим сколько там калорий
  86. console.log("Calories: %f", hamburger.calculateCalories());
  87. // сколько стоит
  88. console.log("Price: %f", hamburger.calculatePrice());
  89. // я тут передумал и решил добавить еще приправу
  90. hamburger.addTopping(Hamburger.TOPPING_SAUCE);
  91. // А сколько теперь стоит?
  92. console.log("Price with sauce: %f", hamburger.calculatePrice());
  93.  
  94. var errorSituations = [
  95. function() {new Hamburger(Hamburger.SIZE_BIG); },
  96. function() {new Hamburger(); },
  97. function() {new Hamburger(Hamburger.TOPPING_MAYO, Hamburger.TOPPING_SAUCE); },
  98. function() { hamburger.addTopping(Hamburger.TOPPING_MAYO); },
  99. function() { hamburger.addTopping(Hamburger.TOPPING_CONDIMENT); },
  100. function() { hamburger.addTopping(Hamburger.TOPPING_INVALID); },
  101. function() { new Hamburger({}); },
  102. function() { new Hamburger({price: 100}); },
  103. function() { new Hamburger(Hamburger.SIZE_VERY_SMALL); }
  104. ];
  105.  
  106. for (var i = 0; i < errorSituations.length; i++) {
  107. try {
  108. errorSituations[i]();
  109. } catch(e) {
  110. console.log(e.name + ": " + e.message);
  111. }
  112. }
Success #stdin #stdout 0.05s 21168KB
stdin
Standard input is empty
stdout
Calories: %f 45
Price: %f 80
Price with sauce: %f 95
HamburgerException: Не задана начинка.
HamburgerException: Не задан размер.
HamburgerException: Неправильный размер mayo. Разрешены размеры: small,big.
HamburgerException: Нельзя два раза добавить добавку mayo.
HamburgerException: Неправильная добавка undefined. Разрешены добавки: sauce,mayo.
HamburgerException: Неправильная добавка undefined. Разрешены добавки: sauce,mayo.
HamburgerException: Неправильный размер [object Object]. Разрешены размеры: small,big.
HamburgerException: Неправильный размер [object Object]. Разрешены размеры: small,big.
HamburgerException: Не задан размер.