/**
* Класс, объекты которого описывают параметры гамбургера.
*
* @constructor
* @param size Размер
* @param stuffing Начинка
* @throws {HamburgerException} При неправильном использовании
*/
function Hamburger(size, stuffing) {
this._setSize(size);
this._setStuffing(stuffing);
this._toppings = [];
}
/* Размеры, виды начинок и добавок */
Hamburger.SIZE_SMALL = "small";
Hamburger.SIZE_LARGE = "large";
Hamburger.STUFFING_CHEESE = "cheese";
Hamburger.STUFFING_SALAD = "salad";
Hamburger.STUFFING_POTATO = "potato";
Hamburger.TOPPING_MAYO = "mayo";
Hamburger.TOPPING_SPICE = "spice";
Hamburger.sizeList = {};
Hamburger.sizeList[Hamburger.SIZE_SMALL] = {money: 50, calories: 20};
Hamburger.sizeList[Hamburger.SIZE_LARGE] = {money: 100, calories: 40};
Hamburger.stuffingList = {};
Hamburger.stuffingList[Hamburger.STUFFING_CHEESE] = {money: 10, calories: 20};
Hamburger.stuffingList[Hamburger.STUFFING_SALAD] = {money: 20, calories: 5};
Hamburger.stuffingList[Hamburger.STUFFING_POTATO] = {money: 15, calories: 10};
Hamburger.toppingList = {};
Hamburger.toppingList[Hamburger.TOPPING_MAYO] = {money: 20, calories: 5};
Hamburger.toppingList[Hamburger.TOPPING_SPICE] = {money: 15, calories: 0};
Hamburger.prototype._setSize = function(size) {
if (size === undefined) {
throw new HamburgerException("Do not set the undefined size.");
} else if (!(size in Hamburger.sizeList)) {
throw new HamburgerException("Wrong size: " + size + ". " +
"Allowed sizes: " + Object.keys(Hamburger.sizeList).join(", ") + ".");
}
this._size = size;
};
Hamburger.prototype._setStuffing = function(stuffing) {
if (stuffing === undefined) {
throw new HamburgerException("Do not set the undefined stuffing.");
} else if (!(stuffing in Hamburger.stuffingList)) {
throw new HamburgerException("Wrong stuffing: " + stuffing + ". " +
"Allowed filling: " + Object.keys(Hamburger.stuffingList).join(", ") + ".");
}
this._stuffing = stuffing;
};
/**
* Добавить добавку к гамбургеру. Можно добавить несколько
* добавок, при условии, что они разные.
*
* @param topping Тип добавки
* @throws {HamburgerException} При неправильном использовании
*/
Hamburger.prototype.addTopping = function(topping) {
if (topping === undefined) {
throw new HamburgerException("Do not set the undefined topping.");
} else if (this._toppings.indexOf(topping) > -1) {
throw new HamburgerException("You can not add the topping twice " + topping + ".");
} else if (!(topping in Hamburger.toppingList)) {
throw new HamburgerException("Wrong topping: " + topping + ". " +
"Allowed topping: " + Object.keys(Hamburger.toppingList).join(", ") + ".");
}
this._toppings.push(topping);
};
/**
* Убрать добавку, при условии, что она ранее была
* добавлена.
*
* @param topping Тип добавки
* @throws {HamburgerException} При неправильном использовании
*/
Hamburger.prototype.removeTopping = function(topping) {
var index = this._toppings.indexOf(topping);
if (index == -1) {
throw new HamburgerException(topping + " topping " + "doesn't exist.");
}
this._toppings.splice(index, 1);
};
/**
* Получить список добавок.
*
* @return {Array} Массив добавленных добавок, содержит константы
* Hamburger.TOPPING_*
*/
Hamburger.prototype.getToppings = function() {
return this._toppings;
};
/**
* Узнать размер гамбургера
*/
Hamburger.prototype.getSize = function() {
return this._size;
};
/**
* Узнать начинку гамбургера
*/
Hamburger.prototype.getStuffing = function() {
return this._stuffing;
};
/**
* Узнать цену гамбургера
* @return {Number} Цена в тугриках
*/
Hamburger.prototype.getPrice = function() {
var money = Hamburger.sizeList[this._size].money +
Hamburger.stuffingList[this._stuffing].money;
if (this._toppings.length != 0) {
for (var i = 0; i < this._toppings.length; i++) {
money += Hamburger.toppingList[this._toppings[i]].money;
}
}
return money;
};
/**
* Узнать калорийность
* @return {Number} Калорийность в калориях
*/
Hamburger.prototype.getCalories = function() {
var calories = Hamburger.sizeList[this._size].calories +
Hamburger.stuffingList[this._stuffing].calories;
if (this._toppings.length != 0) {
for (var i = 0; i < this._toppings.length; i++) {
calories += Hamburger.toppingList[this._toppings[i]].calories;
}
}
return calories;
};
/**
* Представляет информацию об ошибке в ходе работы с гамбургером.
* Подробности хранятся в свойстве message.
* @constructor
*/
function HamburgerException (message) {
this.name = "HamburgerException";
this.message = message;
}
// маленький гамбургер с начинкой из сыра
var hamburger = new Hamburger(Hamburger.SIZE_SMALL, Hamburger.STUFFING_CHEESE);
// добавка из майонеза
hamburger.addTopping(Hamburger.TOPPING_MAYO);
// спросим сколько там калорий
console.log("Calories: %f", hamburger.getCalories());
// сколько стоит
console.log("Price: %f", hamburger.getPrice());
// я тут передумал и решил добавить еще приправу
hamburger.addTopping(Hamburger.TOPPING_SPICE);
// А сколько теперь стоит?
console.log("Price with sauce: %f", hamburger.getPrice());
var errorSituations = [
function() { hamburger.addTopping(Hamburger.TOPPING_MAYO); },
function() { hamburger.addTopping(Hamburger.TOPPING_CONDIMENT); },
function() { hamburger.addTopping(Hamburger.TOPPING_INVALID); },
function() { hamburger.removeTopping(Hamburger.SIZE_LARGE)},
function() { new Hamburger(Hamburger.SIZE_LARGE); },
function() { new Hamburger(); },
function() { new Hamburger(Hamburger.TOPPING_MAYO, Hamburger.TOPPING_SPICE); },
function() { new Hamburger({}); },
function() { new Hamburger({price: 100}); },
function() { new Hamburger(Hamburger.SIZE_VERY_SMALL); }
];
for (var i = 0; i < errorSituations.length; i++) {
try {
errorSituations[i]();
} catch(e) {
console.log("Error situation #" + (i + 1));
console.log(e.name + ": " + e.message);
}
}