Я использую методы объектно-ориентированного программирования в течение 25 лет и пытаюсь перейти к функциональному программированию в течение последних 5 лет, но мой ум всегда идет к ООП, когда я пытаюсь сделать что-то сложное, и особенно сейчас ES6 поддерживает достойный синтаксис ООП, который естественным образом позволяет мне создавать материал.
Теперь я изучаю Redux, и я понимаю (cf Как поместить методы на объекты в состоянии Redux?), что это не-no для размещения экземпляров класса в ваших редукторах; и рекомендуемый способ вычисления поверх состояния простой редукции - с помощью селекторов (например, путем повторного выбора). И, конечно же, React рекомендует состав над наследованием (https://facebook.github.io/react/docs/composition-vs-inheritance.html, Реагировать на классы сокращения).
Но есть ли место в экосистеме React/Redux для объектов класса с методами и наследованием?
Я думаю, для того, чтобы ответить на мой собственный вопрос, классы ООП поощряют добавление свойств данных и операций над данными в одном и том же месте, что приятно для читаемости, но не подходит для чистых функций и неизменных данных.
Если бы я собирался использовать ООП, мне нужно было бы отбросить идею о том, чтобы мои экземпляры сохранялись и поддерживали состояние на какое-то время? Например, каждый раз, когда я хочу использовать его, я бы создавал его из хранилищ данных, использовал любые методы, которые я хочу, и выбросил их? Это может устранить большой импульс для использования классов ООП. Но если я буду хранить примеры, у меня будут головные боли, которые будут синхронизироваться с магазином.
Итак, ответ на то, что всегда используйте селекторы, когда я соблазняюсь использовать методы и всегда использую композицию, когда у меня возникает соблазн использовать наследование? В частности, я имею в виду при хранении и управлении данными, хранящимися в хранилище Redux, для использования в компонентах React. И если да, то где он должен вписаться? Подключен к селекторам? Немедленно одноразовое, как я предложил?
Добавление моего прецедента для ясности: мои данные в основном представляют собой огромный график: множество объектов с большим количеством свойств и множеством взаимосвязей между объектами. Он читается только, но сложный. Мои объекты называются "понятиями".
Прежде чем сделать (возможно, глупое) решение перейти на Redux, я использовал классы для структурирования и представления концепций, наборов понятий и отношений между понятиями. Мои классы включали логику асинхронного api для извлечения наборов концепций, информации о каждой концепции и информации о других концепциях, с которыми связана каждая концепция. Если пользователь решил развернуть, классы будут рекурсивно извлекать и создавать экземпляры новых наборов концепций. В документации Redux рекомендуются плоские, нормализованные структуры для вложенных данных (http://redux.js.org/docs/recipes/reducers/NormalizingStateShape.html), что, вероятно, разумно для хранения, но моя модель ООП была хороша для прохождения разделы графика и прочее. Мне тяжело обворачивать голову с помощью селекторов и неизменяемого состояния, которые могут включать вложение, потенциально с циклами, или необходимость делать асинхронные вызовы для большего количества данных.
Я успешно использую https://redux-observable.js.org/ для файлов api.
Возможно, ответ @Sulthan прав: я должен свободно использовать методы ООП в моем приложении Redux. Но это все еще кажется странным. Я не могу удержать свои объекты, потому что, если хранилище изменится (например, будет получено больше данных), мои объекты могут стать устаревшими. Если мои объекты вложены, но мой магазин нормализуется, я создам их (из селекторов), когда они мне понадобятся, и не заставляйте их...