Наследование и композиция: Angular State Management - Django Rest Framework
Я пишу фронтенд приложение, использующее хранилище данных "ngxs: a state management pattern library" в "angular", подключенное к бэкенду "django rest framework". Хранилище имеет общие модели поведения для управления пагинированными данными:
Смещение предельной пагинации:
который будет использоваться для управления данными, предназначенными для отображения в виде таблицы (пример таблицы клиентов, платежей, ...):
- получить страницу с сервера, используя параметры запроса (смещение, ограничение)
- изменить размер страницы с помощью параметров запроса (limit)
- изменить условия поиска, используя параметры запроса (search)
- >изменить упорядочивание с помощью параметров запроса упорядочивания (ordering) по возрастанию или по убыванию (ordering) имя .
- добавить пользовательские фильтры, пример: (age__exact=30)
Пагинация курсора:
который будет использоваться для управления данными, предназначенными для отображения в виде упорядоченного списка (пример сообщений чата)
- получить следующую страницу с сервера, используя параметры запроса (nextCursor)
- получить предыдущую страницу с помощью параметров запроса (previousCursor)
- изменить условия поиска, используя параметры поискового запроса (search): пример поиска термина в окне чата
Допущения:
- Такие функции, как пагинация (следующая предыдущая), поиск, являются общими для обоих типов пагинации.
- На оба типа пагинации будут влиять CRUD операции (добавить/удалить/обновить -> сообщение, клиент).
- Entity - это общий тип для объектов, получаемых с сервера (клиент, сообщения чата, платежи ...).
Мой подход: Я начал с OffsetLimitEntityStore и CursorEntityStore для каждой из стратегий смещения-ограничения и пагинации курсора. стратегия. Такой подход привел к большому количеству дублирующегося кода для общего поведения "Например, добавить, удалить, обновить сущность".
Вопрос:
Какую из этих конструкций я должен рассмотреть?
1. Композиция (паттерн проектирования стратегии):
Использование общего магазина для общей функциональности и извлечение обоих (стратегии смещения-ограничения и курсора) в инжектируемые сервисы, а затем инжектирование желаемой стратегии пагинации в конструктор дочернего магазина (пример: ClientStore inject OffsetLimitStrategy )
|--------------|
| BaseStore |
|------------- |
| +nextPage() |<>----------------------------|
| +addEntity() | |
|--------------| |
^ \|/
/|\ ∨
| |--------------------|
| | PaginationStrategy |
|-------------------| |--------------------|
| | | +nextPage() |
| | |--------------------|
|-------------| |------------------| ^
| ClientStore | | ChatMessageStore | /|\
|-------------| |------------------| |
|-----------------------|
| |
|---------------------| |----------------|
| OffsetLimitStrategy | | CursorStrategy |
|---------------------| |----------------|
| +nextPage() | | +nextPage() |
|---------------------| |----------------|
2. Наследование:
Перемещение общей формы поведения OffsetLimitEntityStore и CursorEntityStore в родительский класс BaseStore.
|--------------|
| BaseStore |
|--------------|
| +addEntity() |
|--------------|
^
/|\
|
|-------------------------|
| |
|------------------| |-------------|
| OffsetLimitStore | | CursorStore |
|------------------| |-------------|
| +nextPage() | | +nextPage() |
|------------------| |-------------|
^ ^
/|\ /|\
| |
|-------------| |------------------|
| ClientStore | | ChatMessageStore |
|-------------| |------------------|