Отдавая должное классам ES6

внешний интерфейс JavaScript ECMAScript 6

Недавно на Жиху идет дискуссия"Почему ES6 включает классы? Это безвкусно?вопрос, и эта статья – ответ на него. Сам этот вопрос меня немного смущает.Класс, который был важнейшей новой фичей ES6, всего за несколько лет доведен до безвкусицы в глазах прохожих.Генеральная линия фронтенда сообщество было потрясено слишком быстро ...

По общему признанию, классы получили много критики в последние годы. Но поскольку мы хотим проследить происхождение, мы не можем игнорировать такую ​​важную предпосылку:Классы в JS изначально отключены! Когда Брендан Эйх разрабатывал JS, руководство Netscape пыталось избежать конфликта с Java.Явно не требует класса. Этот политический мандат привел к тому, что самая ранняя объектная модель JS была основана на более простых прототипах, только «объектно-ориентированных», а не «объектно-ориентированных», и не могла достичь того же уровня ООП, что и Java.

Но то, что мы спрашиваем здесь, очевидно, ES6, почему мы упоминаем этот старый альманах? На самом деле это "Почему ES6 включает классы?«Прямой ответ на этот вопрос — класс ES6, его цель — завершить карьеру, в которой еще никто не участвовал!class не то, чего никто не хотел до ES5, ES6 вдруг хлопнули по голове и добавили. Это важная функция, которая широко обсуждалась сообществом более десяти лет и, наконец, успешно реализована в ES6 после многих неудач.

Подытожим одним предложением, что делал ES12345 до ES6:

Дело в том, что до выпуска ES5 в 2009 году объектная модель JavaScript существенно не изменилась по сравнению с 1995 годом. Мы все говорим, что ES5 — это, по сути, ES3.1, я думаю, вы можете назвать его ES1.3... И теперь технология Trait, ставшая интернет-знаменитостью благодаря Rust, не будет предложена до публикации 2003 года (Traits: Composable units of behavior). Учитывая, что классы широко используются в распространенных языках, таких как Java, C++, Python, Ruby и даже PHP, естественно, что сообщество JS хотело бы ввести классы для замены прототипов, чтобы лучше поддерживать разработку крупномасштабных проектов. кто хотел быпаразитарное гибридное наследование«А как насчет таких загадочных вещей? Это типовая гимнастика эпохи до ES6.

Что касается долгосрочной важности занятий, отрывок из исходного текста «JavaScript 20 лет»:

На собрании TC39 в июле 2008 г., которое положило начало работе над Harmony (предшественником ES6), значительное количество времени было посвящено обсуждению того, «если и как» включать классы.В обеих попытках до и после ES4 прилагались огромные усилия для разработки сложного синтаксиса и семантики определения класса....

Для получения более подробной информации о дизайне класса вы можете обратиться к полной записи в этой книге.Процесс проектирования класса ES6, которая должна быть самой авторитетной информацией по этому вопросу в Интернете. Вкратце, разница вот в чем: учитывая два провала ES4, TC39 не смог и не осмеливается добавлять классы в соответствии с методом «делать правильные вещи», а может только скомпрометировать метод синтаксического сахара «Взломать сеть». . Хотя это принесло успех ES6, оно также проложило путь к сегодняшним спорам о классах.

Классы ES6 имеют большое влияние. Классовые компоненты React сейчас вообще не нравятся, но вы все еще помните React 0.14.createClassAPI? Я помню, что классы ES6 обычно рассматривались как важная, фундаментальная, популярная функция языка, по крайней мере, в определенный момент истории. Не сейчас, потому что наша генеральная линия снова качнулась...

Теперь критика классов в JS в основном сосредоточена на этих местах:

  • Основываясь на моделировании прототипов, продолжать эволюцию становится все труднее. Предложение по декоратору всегда было трудно создать, приватное поле очень противоречиво, и становится все труднее соответствовать стандартам TS и ECMAScript.
  • Он плохо сочетается с компонентами пользовательского интерфейса в стиле JSX и теряет большой рынок интерфейсных фреймворков. Среди трех основных фреймворков React в основном сохраняет компоненты классов для обеспечения прямой совместимости, Vue также отказался от предложения классов, только Angular по-прежнему использует типизированные (нестандартные) классы.
  • Он часто используется в качестве церемониального шаблона «все есть гвоздь с молотком в руке», который включается в учебники по шаблонам проектирования, внося ненужную абстрактную инкапсуляцию.
  • Когда вы принимаете и поддерживаете большой проект, слишком легко «упаковать еще один слой» и привести к злоупотреблениям.

Фактически, в качестве альтернативы классу мы можем использовать простые функции с синтаксисом объектного литерала (то есть писать напрямую{a:1, b:2}Такого рода вещи), во многом заменяющие ненужные классы в бизнес-логике. Традиционно этот подход имеет так называемую проблему ad-hoc, которая является тривиальной и нечеткой и представляет собой конструкцию, лишенную «структуры». А вот интерфейс ТС на самом деле проходитStructural TypingПроблема решена, поэтому звонки высоки.

Однако лично я не думаю, что проблема класса в JS может отражать "FP в конечном итоге заменит ООП», что больше похоже на довольно специфичное для JS явление. Потому что, в конце концов, класс JS по своей сути основан на прототипах, а объектные литералы очень удобны (JSON, полученный из этой грамматики, может быть самым большим вкладом JS во всю компьютерную индустрию). Это не обязательно так, если вы переключаете языки. Например, Dart может использовать кучу классов Widget для моделирования пользовательского интерфейса, аналогичного вложению функций JSX, а лямбда-выражения и классы C++ вообще не являются заменой. У Rust есть трейты, но знаете ли вы, что разработчики классов ES6 уже давно предлагают трейты?И черта в этом JS не может быть реализована из-за проблем с производительностью.- Доказывает ли это, что Черта уступает классу?

В современном JS классы, очевидно, имеют собственное значение:

  • класс легко использовать в качестве синтаксического сахара для фабричного шаблона,newИз долгоживущего экземпляра объекта для использования.
  • При расширении базовых возможностей различных платформ для среды JS класс является базовым примитивом для построения «объектов с отслеживанием состояния», что очень подходит для отображения 1:1 классов C++ и классов JS, а также N-API. опора коробки.
  • Класс имеет хорошую поддержку IDE.Если вы спроектируете его правильно, вам не нужно будет модифицировать мелкозернистую логику функций, разбросанных по всему проекту, при разработке новых требований, а нужно будет только сосредоточиться на модификации кода, связного в классе, то есть, данные и поведение.
  • Самое главное, класс представляет собой одну из наиболее распространенных ментальных моделей в языках промышленной разработки. Как и английский язык, он может использовать понятия «класс, экземпляр, жизненный цикл» для общения практически с любым программистом с нормальным уровнем навыков. В качестве контрпримера на самом делеМастер Objective-C более объектно-ориентирован., еще "композиция лучше наследования". Язык в конечном итоге зависит от людей, которые будут использовать.Даже если концептуальные настройки ниши (например, протокол OC и делегат) на самом деле сияют инновациями, будут проблемы, которые трудно изучать, трудно набирать людей и трудно культивировать. экология эффект социальное явление.

На самом деле, во всей индустрии разработки графических интерфейсов моделирование классов является довольно успешным отраслевым примером. Абстракции элемента/представления/слоя в графическом интерфейсе легко выразить в виде наследования дерева. Например, для определенного фреймворка Canvas все слои должны иметь состояния x/y/w/h/hidden/opacity, а также им нужен метод рисования, доступ к которому осуществляется при обходе сцены. На этот раз вы получаете общедоступный BaseLayer, который представляет собой простой и понятный дизайн. С помощью этой ментальной модели легко понять большое количество графических интерфейсов, включая Flutter Engine. Кроме того, классы, отличные от JS, обычно используют систему номинальных типов, которая более удобна для оптимизации компиляции AOT. С этой точки зрения дизайн класса Dart ближе к полной форме маршрута ES4, который сложнее в использовании, чем TS, но имеет более высокий предел производительности.

Теперь здесь можно ответить»класс безвкусный" проблема. Я лично считаю, что программирование — это средство решения проблем,Необязательно политически придерживаться определенной парадигмы, но абстракции всегда следует выражать с помощью самых простых и удобных языковых конструкций.— В зоне комфорта современных фронтенд-стеков (TS+UI фреймворков) эта конструкция часто не класс. Но языки программирования сложны и со временем развивались. Точно так же, как каждый использует только 10% функциональных возможностей программного обеспечения, ваши часто используемые языковые функции могут составлять только 10% всех языковых функций. Итак, 90% того, что вы не используете, просто безвкусны?

Наконец, этот вопрос может отражать тот вид ""класс плохой и безвкусныйстереотип. Хотя эта точка зрения в какой-то степени верна для сегодняшней JS-экологии, если она основана на этом для формирования межъязыкового предубеждения против класса «как распространенной ментальной модели в индустрии», она даже исключает контакт с основанными на языках ​кроме JS. Если есть много инженерных достижений, установленных классом, это кажется чем-то вроде лягушки на дне колодца.