Как правильно строить ООП модель на JS?

занимаюсь программированием около полутора лет (php, c++, js), но только недавно стал относиться к вопросу качества кода, переиспользуемости, уменьшению монолитности, модульности строго.
Меня перестало устраивать то, что при небольших изменениях структуры моего проекта, мне приходится реструктурировать кучу других элементов.

С этим, как я понимаю должен справляться ООП.
Хочу изложить свое понимание вопроса, чтобы можно было тыкнуть меня лицом туда, где я не понимаю. (В этом главная цель всего вопроса).
Сколько бы я ни услышал мнений и ни прочитал статей, построил такое мнение:
Неправильное понимание ООП = перенос императивного фп, программирования на классы, т.е. мышление методами и данными.
Правильное понимание ООП = это создание сущностей, закрытых, как ящик, для своей работы требуют таких же абстрактных моделей и чем более абстрактная модель, тем лучше (уменьшение связанности кода).
И одной из самых главных задач является правильное разделение проекта на сущности(и их обязанности), и тем более их взаимодействие.

На примерах с машинами, котиками, на примерах с паттернами, я все это понимаю.
Я прекрасно понимаю, как взаимодействовать с объектами, написанными другими людьми.
Могу написать свои сущности, но достаточно простые.

Просто в тупик ставит вопрос до какого уровня абстракции должен я спускаться, чтобы потом, при изменениях системы, не было больно?
В полный тупик меня ставит событийная система в js.
Ее механизмы работы я знаю; как строить объекты, основываясь на ивентах - нет
Ее механизмы работы я знаю; как строить объекты, основываясь на ивентах - нет.
Конечной точкой становится переход от интерфейсов к реализации.

Пример возникающих проблем:
Ноду знаю неплохо, понимаю что есть наследование, интерфейсы, абстрактные классы, даункаст, апкаст.
Хочу написать чат на typescript.

Выделяю сущность сервер, создаю интефейс, не думаю о реализации:
export interface IServer {
    events: ServerEventEmitter - Это обычный эмитер
    start() : Promise<boolean>
    stop() : Promise<boolean>
}


Теперь дело доходит до реализации.
Я думаю о том, что все библиотеки сетей работают на ивентах( 'listening', ... ) - каким образом я напишу для всех, кто реализует интерфейс так, чтобы они вернули true/false в зависимости от успеха операции запуска.
Перейти от системы ивентов к промисам = говнокодить. Создавать кучу различных событий = говнокодить.

Если бы я писал без ооп - написал функцию обработчик для каждого ивента.
С объектами совсем не понимаю.
  • Вопрос задан
  • 429 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы