Skip to content

Instantly share code, notes, and snippets.

@luxplanjay
Last active July 21, 2018 20:35
Show Gist options
  • Save luxplanjay/8e82ba1053571da6b6681d3554976b78 to your computer and use it in GitHub Desktop.
Save luxplanjay/8e82ba1053571da6b6681d3554976b78 to your computer and use it in GitHub Desktop.
/*
Сеть фастфудов предлагает несколько видов гамбургеров.
Основа (булочка) гамбургера может быть большой или маленькой (обязательно):
- маленькая (+30 денег, +50 калорий)
- большая (+50 денег, +100 калорий)
Гамбургер может быть с одной из нескольких видов начинок (обязательно):
- сыром (+15 денег, +20 калорий)
- салатом (+20 денег, +5 калорий)
- мясом (+35 денег, +15 калорий)
Дополнительно, гамбургер можно:
- посыпать приправой (+10 денег, +0 калорий)
- полить соусом (+15 денег, +5 калорий)
Напишите скрипт, расчитывающий стоимость и калорийность гамбургера. Используте ООП подход,
создайте класс Hamburger, константы, методы для выбора опций и рассчета нужных величин.
Написанный класс должен соответствовать следующему jsDoc описанию. То есть класс должен содержать
указанные методы, которые принимают и возвращают данные указанного типа.
*/
/**
* Класс, объекты которого описывают параметры гамбургера.
*/
class Hamburger {
/**
* @constructor
* @param {String} size - Размер
* @param {String} stuffing - Начинка
*/
constructor(size, stuffing) {
this._size = size;
this._stuffing = stuffing;
this._toppings = [];
}
/**
* Добавить topping к гамбургеру. Можно добавить несколько topping, при условии, что они разные.
* @param {String} topping - Тип добавки
*/
addTopping(topping) {}
/**
* Убрать topping, при условии, что она ранее была добавлена
* @param {String} topping - Тип добавки
*/
removeTopping(topping) {}
/**
* Получить список toppings
* @returns {Array} - Массив добавленных topping, содержит значения констант Hamburger.TOPPING_*
*
* Попробуйте сделать это геттером чтобы можно было обращаться как obj.toppings и нам вернет массив добавок
*/
getToppings() {}
/**
* Узнать размер гамбургера
* @returns {String} - размер гамбургера
*
* Попробуйте сделать это геттером чтобы можно было обращаться как obj.size и нам вернет размер
*/
getSize() {}
/**
* Узнать начинку гамбургера
* @returns {String} - начинка гамбургера
*
* Попробуйте сделать это геттером чтобы можно было обращаться как obj.stuffing и нам вернет начинку
*/
getStuffing() {}
/**
* Узнать цену гамбургера
* @returns {Number} - Цена в деньгах
*
* Попробуйте сделать это геттером чтобы можно было обращаться как obj.price и нам вернет сумму.
*/
calculatePrice() {}
/**
* Узнать калорийность
* @returns {Number} - Калорийность в калориях
*
* Попробуйте сделать это геттером чтобы можно было обращаться как obj.calories и нам вернет сумму.
*/
calculateCalories() {}
}
/*
Размеры, виды добавок и начинок объявите как статические поля класса.
Добавьте отсутсвующие поля по аналогии с примером.
*/
Hamburger.SIZE_SMALL = 'SIZE_SMALL';
Hamburger.SIZE_LARGE = ...
Hamburger.SIZES = {
[Hamburger.SIZE_SMALL]: {
price: 30,
calories: 50,
},
};
Hamburger.STUFFING_CHEESE = 'STUFFING_CHEESE';
Hamburger.STUFFING_SALAD = ...
Hamburger.STUFFING_MEAT = ...
Hamburger.STUFFINGS = {
[Hamburger.STUFFING_CHEESE]: {
price: 15,
calories: 20,
},
};
Hamburger.TOPPING_SPICE = 'TOPPING_SPICE';
Hamburger.TOPPING_SAUCE = ...
Hamburger.TOPPINGS = {
[Hamburger.TOPPING_SPICE]: {
price: 10,
calories: 0,
},
};
/* Вот как может выглядеть использование этого класса */
// Маленький гамбургер с начинкой из сыра
const hamburger = new Hamburger(Hamburger.SIZE_SMALL, Hamburger.STUFFING_CHEESE);
// Добавка из приправы
hamburger.addTopping(Hamburger.TOPPING_SPICE);
// Спросим сколько там калорий
console.log("Calories: ", hamburger.calculateCalories());
// Сколько стоит?
console.log("Price: ", hamburger.calculatePrice());
// Я тут передумал и решил добавить еще соус
hamburger.addTopping(Hamburger.TOPPING_SAUCE);
// А сколько теперь стоит?
console.log("Price with sauce: ", hamburger.calculatePrice());
// Проверить, большой ли гамбургер?
console.log("Is hamburger large: ", hamburger.getSize() === Hamburger.SIZE_LARGE); // -> false
// Убрать добавку
hamburger.removeTopping(Hamburger.TOPPING_SPICE);
// Смотрим сколько добавок
console.log("Hamburger has %d toppings", hamburger.getToppings().length); // 1
/*
🔔 Обратите внимание на такие моменты:
✔️ класс не взаимодействует с внешним миром. Это не его дело, этим занимается
другой код, а класс живет в изоляции от мира
✔️ обязательные параметры (размер и начинка) мы передаем через конструктор,
чтобы нельзя было создать объект, не указав их
✔️ необязательные (добавка) добавляем через методы
✔️ типы начинок обозначены "константами" с понятными именами (на самом деле просто
свойствами, написанным заглавными буквами, которые мы договорились считать "константами")
✔️ объект создается через конструктор - функцию, которая задает начальные значения полей.
✔️ в свойствах объекта гамбургера логично хранить исходные данные (размер, тип начинки),
а не вычисленные из них (цена, число калорий и т.д.). Рассчитывать цену и калории
логично в тот момент, когда это потребуется, а не заранее.
*/
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment