Является ли использование классов ES6 в vue / vuex (/ flux?) Анти-паттерном? - PullRequest
0 голосов
/ 24 января 2019

Я использую Vuex, и его приверженность только изменению состояния через mutators или actions заставляет меня думать, что ваш магазин должен включать в себя как можно более плоский объект, только с типами примитивов.

Некоторые потоки даже предписывают нормализацию ваших данных (поэтому вместо вложенных деревьев объектов у вас есть объекты с массивами идентификаторов, указывающими на древовидные отношения). Это, вероятно, близко соответствует вашему JSON API.

Это заставляет меня думать, что хранение классов (которые могут иметь методы для изменения себя ) в вашем хранилище потоков является анти-паттерном. Действительно, даже гидратация данных вашего магазина в класс выглядит так, как будто вы идете против течения, если ваш класс не выполняет никаких изменений своих внутренних данных.

Что тогда заставило меня задуматься, использует ли любой класс в Vue / Vuex / Reactive / Flux анти-паттерн?

Библиотеки явно предназначены для работы с простыми объектами JS, и общее взаимодействие с API (данные, данные) заставляет меня думать, что более функциональный подход (без неизменности) - это то, о чем думали первоначальные дизайнеры .

Кажется также проще написать код, который запускается с function => test => state mutator wrapper around function.

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

Есть ли общее мнение в сообществе, что ваш код потока должен быть более функциональным и менее объектно-ориентированным?

1 Ответ

0 голосов
/ 24 января 2019

Да. Вы абсолютно правы в том, что вы думаете. Контейнеры состояний, такие как Redux, Vuex, должны содержать ваши конструкции данных, а не функции. Это правда, что функции в JavaScript - это просто объекты, которые можно вызывать. Вы также можете хранить статические данные о функциях. Но это все еще не квалифицируется как чистые данные. По этой же причине мы не помещаем Symbols в наши контейнеры состояния.

Возвращаясь к классам ES, если вы используете классы как POJO, т.е. только для хранения данных, вы можете их использовать. Но зачем иметь классы, если вы можете иметь простые простые объекты.

Отделение данных от компонентов пользовательского интерфейса и перемещение их в контейнеры состояний имеет фундаментальные корни в функциональном программировании. Так работают большинство строгих функциональных языков, таких как Haskell, Elm, OCaml или даже Elixir / Erlang. Это дает убедительные аргументы о ваших потоках данных в вашем приложении. Кроме того, это дополняется тем фактом, что в этих языках данные являются неизменяемыми. И, таким образом, нет места для сохраняющего состояние класса, подобного конструкции.

В JavaScript, поскольку все по своей природе изменчиво, границы немного размыты, и трудно определить хорошие практики.

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

И теперь даже у нас есть функциональные компоненты в Vue и React.

...