Как вы помните, Кеша еще проходит стажировку. На стажировке, как известно, много денег не заработаешь, а Иннокентию надо вкладываться в рекламу своего сайта. Чтобы немного подзаработать, Кеша решил начать торговать на фондовой бирже.
Наш товарищ не сильно разбирается в торговле акциями, знает только то, что ценные бумаги надо покупать подешевле, а продавать подороже.
Помогите Кеше написать программу, которая будет наблюдать за ростом и падением цен на акции компаний и скупать ценные бумаги по выгодному курсу.
Выгодной ценой мы будем считать первую повышенную после падения. Под падением понимаем хотя бы одну итерацию, в которой цена ниже предыдущей. Все расчеты производим в условных единицах без привязки к валютам и курсам.
Допустим, есть компания "Рога и копыта" Цены на акции этой компании начинаются со 100. На первой итерации торгов акции упали в цене до 80, затем до 50, а потом поднялись до 55.
На 3
итерации торгов мы понимаем, что цена на акции выросла, а до этого 2 итерации падала. Эту цену мы считаем за выгодную цену.
100 -> 80 -> 50 -> 55
0 1 2 3
Сперва нужно реализовать класс самой биржи – ExchangeObserver
. Биржа должна иметь 1 поле и 3 метода:
-
listeners
– массив объектов, где ключи – названия компаний, а значения – массивы функций обратного вызова, которые должны принимать объект классаCompany
. Эти функции будут вызываться, когда происходит изменение цены акции компании. -
sellShares
– метод, который требуется вызывать, когда участники биржи хотят купить акции какой-нибудь компании. Метод должен принимать 2 параметра:-
Объект класса
Company
; -
Объект класса
Member
.
Метод должен снять с участника средства, которые потребуются для покупки акций в кол-ве, указанном в поле
purchasedSharesNumber
переданного объекта классаMember
и вычесть это кол-во из общего кол-ва акций компании.❗Обратите внимание:
sellShares
должен породить ошибку, если пользователь хочет купить кол-во акций превышающее кол-во акций компании на рынке, либо у участника рынка недостаточно средств для их покупки. -
-
updateCompany
– метод, который принимает объект класса Company и вызывает все функции, которые находятся в поле listeners с ключом равным названию переданной компании. -
onUpdateCompany
– метод, принимающий название компании и функцию обратного вызова. Метод должен добавить в массив с ключом равным названию компании новую функцию обратного вызова.
После этого вам предстоит создать класс Company
. У Company
должны быть 4 поля и 1 метод:
-
exchangeObserver
– объект биржи, на которой торгует компания; -
name
– название компании; -
shareCount
– количество акций компании, выставленных на продажу; -
sharePrice
– цена акции за штуку; -
updatePrice
– метод, который принимает параметр с новой ценой акции и устанавливает его вsharePrice
. В случае, если у компании есть акции на продажу, то оповещает об изменении цены биржу из поляexchangeObserver
.
❗Обратите внимание:
exchangeObserver
,name
,shareCount
иsharePrice
должны инициализироваться в конструкторе;sharePrice
иshareCount
должны иметь значения по умолчанию0
.
Прежде чем начать работу с биржей нам потребуется её участники. За создание объектов участников отвечает класс Member
. У Member
должны быть 4 поля :
-
exchangeObserver
– объект биржи, на которой торгует участник; -
balance
– баланс участника рынка; -
interestingCompanies
– массив объектов класса Company, содержит компании, за акциями которых участнику было бы интересно следить; -
purchasedSharesNumber
– количество приобретаемых за раз акций;
❗Обратите внимание:
-
exchangeObserver
,balance
,interestingCompanies
иpurchasedSharesNumber
должны инициализироваться в конструкторе; -
purchasedSharesNumber
иinterestingCompanies
должны иметь значения по умолчанию0
и[]
, соответственно;
В логике работы класса Member
основный задачей является реализация:
-
Подписки на изменения цен акций компаний из поля
interestingCompanies
(с помощью методаonUpdateCompany
изexchangeObserver
); -
Поиска выгодной цены акций;
-
Скупки акций после нахождения выгодной цены (с помощью метода
sellShares
изexchangeObserver
).
const exchange = new ExchangeObserver();
const greenBank = new Company(exchange, 'Green Bank', 100, 100);
const kesha = new Member(exchange, 10000, [greenBank], 10);
greenBank.updatePrice(70);
greenBank.updatePrice(73);
// Тут происходит покупка 10 акций по цене 73
console.log(greenBank.shareCount); // 90
kesha.purchasedSharesNumber = 100; // Меняем кол-во приобретаемых акций с 10 до 100
greenBank.updatePrice(40);
greenBank.updatePrice(45);
// Тут происходит попытка скупить 100 акций у компании greenBank
// Error('У компании недостаточно акций для продажи')
Если вы дочитали до конца и сумели выполнить эту задачу, то можете себя поздравить!
Вы стали на шаг ближе к совершенству 😏, а еще вы реализовали паттерн проектирования “Наблюдатель” или Observer. Почитать про него подробнее вы можете в ресурсе, закрепленном в разделе с полезными ссылками.