Pull to refresh

Comments 19

Вот потом и разберись в коде. Один выберет классы с примесью, второй без примеси, третий фабрики так далее

Вот как выглядит описание TodoModel с использованием ключевого слова class:


Вот — описание того же самого объекта, выполненное средствами фабричной функции


не совсем корректно, т.к. методы, которые объявлены в ES6 классе будут свойствами прототипа
Мне кажется тогда проще использовать прототипирование. Иначе какой-то дуализм выходит.

Честно говоря не совсем понимаю Крокфорда. Если в мире сложились стандарты и общие представления ООП для всех языков, то зачем в JS городить свои велосипеды и все усложнять? Основное преимуществ ООП, на мой дилетантский взгляд, легкость обслуживания приложения в дальнейшем. И если в JS ООП будет, как и везде, то жить станет легче.
Статья с слишком провокационными заявлениями. Тут всеми силами выпячиваются достоинства фабричных методов и принижаются все их недостатки, в то время как классы всячески осуждаются и все их недостатки раздуваются. Самый яркий пример:
Фабричные функции содействуют использованию композиции вместо наследования, что даёт разработчику более высокий уровень гибкости в плане проектирования приложений.
, при том что это абсолютно такой же не менее популярный метод и в случае классов, однако «более гибкий», хоть и ограничивает один из подходов. Пункт про безопасность тоже особо весомым не нахожу, ибо если кому-то действительно сильно надо влезть в контекст замыкания, то он может воспользоваться грязным хаком через Function.prototype.toString(). И самое удивительное неужели человек склоняющий к функциональному программированию высказывается против стрелочной нотации которую повсеместно для этого используют. Статья была бы хороша как сравнение подходов, но в итоге в конце она превратилась в сплошное осуждение классов.
Классы медленнее инициализируются(у меня получилось, что иногда даже медленнее чем DOM ready с большим количеством нод. возможно я где-то не так реализовал архитектуру, но проявляется во всех браузерах)… Единственный, пожалуй, весомый недостаток.

Все верно подмечено про стрелочные функции, мы теряем название функции в стеке ошибок, что серьезно усложняет понимание в каком месте отвалилось. Их нужно использовать с умом.

Все верно подмечено про стрелочные функции, мы теряем название функции в стеке ошибок, что серьезно усложняет понимание в каком месте отвалилось.

Если присваивать стрелочную функцию переменной, то в стеке отобразится имя этой переменной.

(() => {
     throw new Error('Some error');
})();

// Uncaught Error: Some error
//    at <anonymous>:2:12

const funcName = () => {
    throw new Error('Some error');
};

funcName ();

// Uncaught Error: Some error
//    at funcName (<anonymous>:2:11)

(() => {
     throw new Error('Some unnaned func error');
}).name;
// ""

funcName.name; 
// "funcName"

2018 год на дворе, надо пользоваться асинхронными функциями:


async function doSomething() {
  await new Promise(resolve => setTimeout(resolve));

  throw new Error('test');
}

В них стектрейс сохраняется:


> Error: test
    at doSomething (repl:4:9)
    at <anonymous>
1. Зачем в синхронном коде асинхронные функции?
2. Функция doSomething у вас не стрелочная.

Изначально в статье был наброс на стрелочные функции в setTimeout и других асинхронных коллбеках:


setTimeout(() => {}, 0);

Я показал, как этого избежать, правильно используя фичи языка.


Функция doSomething у вас не стрелочная.

Я придерживаюсь правила: все функции верхнего уровня в модуле — обычные, именованные, вложенные функции — стрелочные.

Понятно, но я отвечал не автору статьи, а на комментарий про стектрейс.
Проблема с потерей контекста высосана из пальца. С появлением стрелочных функций это ушло в небытие. У нас даже у джунов не возникает такой ошибки.

Что касаемо скрытия и иммутабельности, то в чем проблема? Так часто кто-то на проекте делаем манки патч? Не делаются тесты и код ревью? За 10 лет девелопинга не было ни разу такой проблемы. Теоретически может быть… Но на практике — не было.

И да, наследование. Зачем отказаться от наследования в пользу функционального подхода? Надо уметь пользоваться арсеналом, который предоставляет язык.

Да, статья, если честно, просто однобока.
UFO just landed and posted this here
UFO just landed and posted this here

На прошлой неделе уже публиковался перевод: Элегантные паттерны современного JavaScript: Ice Factory.


В той статье была хорошо рассказана идея, было интересно. А здесь — сплошные набросы на классический подход.


Вопрос к переводчику: а в чем был смысл переводить вторую статью почти с таким же контентом?

Проблема с доступностью свойств абсолютно надумана. Всё равно весь код обычно в модулях/функциях, и получить к нему доступ нельзя. А если разработчик использует глобальные переменные для хранения чего-то хоть сколько-нибудь важного, у него проблемы посерьёзнее, чем доступ к свойствам.

Первая особенность, которую можно заметить, сравнивая классы и фабричные функции, заключается в том, что все члены, поля и методы объектов, создаваемых с помощью ключевого слова class, общедоступны.

Тем временем в TC39 добавили private поля.
github.com/tc39/proposal-class-fields/blob/master/PRIVATE_SYNTAX_FAQ.md

пример использования в Canary c флагом `Experimental JavaScript`
image
Например, this теряет контекст во вложенных функциях. Это не только усложняет процесс программирования, подобное поведение ещё и является постоянным источником ошибок.

Можно подумать, вложенные функции сами по себе не усложняют процесс программирования и не являются постоянным источником ошибок.
Выносим коллбэки в отдельные методы и байндим, и если есть проблемы, то точно не с этим.
Sign up to leave a comment.