Наследование и композиция: Angular State Management - Django Rest Framework

Я пишу фронтенд приложение, использующее хранилище данных "ngxs: a state management pattern library" в "angular", подключенное к бэкенду "django rest framework". Хранилище имеет общие модели поведения для управления пагинированными данными:

Смещение предельной пагинации:

который будет использоваться для управления данными, предназначенными для отображения в виде таблицы (пример таблицы клиентов, платежей, ...):

  1. получить страницу с сервера, используя параметры запроса (смещение, ограничение)
  2. изменить размер страницы с помощью параметров запроса (limit)
  3. изменить условия поиска, используя параметры запроса (search)
  4. >изменить упорядочивание с помощью параметров запроса упорядочивания (ordering) по возрастанию или по убыванию (ordering) имя
  5. .
  6. добавить пользовательские фильтры, пример: (age__exact=30)

Пагинация курсора:

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

  1. получить следующую страницу с сервера, используя параметры запроса (nextCursor)
  2. получить предыдущую страницу с помощью параметров запроса (previousCursor)
  3. изменить условия поиска, используя параметры поискового запроса (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 |
|-------------|             |------------------|

3. Есть ли другие решения?

Вернуться на верх