Разделение системы на модули?

Во многих умных книжках пишут, что следует разбивать систему на более мелкие и простые части (подсистемы|пакеты).

Рассмотрим простой пример (возможно не самый лучший).
Допустим, нам нужно разработать API для сервиса по поиску фильмов (наподобие кинопоиска).
Предположим, мы решили, что нам нужно хранить следующую информацию:

Фильмы
  • Название
  • Описание
  • Дата релиза
  • Жанр[]
  • Страна[]
  • Люди[] (актеры/продюсеры и т.д.)
  • Рейтинги[]


Жанры
  • Название


Страны
  • Название


Люди
  • ФИО
  • Пол
  • Дата рождения
  • Дата смерти (если умер)
  • Биография


Рейтинги
  • Стороняя система (IMDB, кинопоиск)
  • Рейтинг


Я бы разделил систему с такими данными на следующие модули:
1. Фильмы (фильмы, жанры, страны) - основные данные о фильмах
2. Люди
3. Сторонние системы и рейтинги

В моем представлении, если модулю нужно работать с БД, он должен иметь свою собственную БД. Если же БД одна, то модуль должен знать только о пренадлежащих ему таблицах и ни в коем случае не должен обращаться к таблицам чужих модулей.
Возникает вопрос: предположим, нужно предоставить пользователям API возможность получения фильмов, в которых принимал участие какой-то человек.
Или нужно отсортировать фильмы по рейтингу IMDB. Модуль фильмов не должен знать ничего о модуле рейтинга. Как быть в этой ситуации?
  • Вопрос задан
  • 692 просмотра
Пригласить эксперта
Ответы на вопрос 1
@MarkusD
все время мелю чепуху :)
Ты все правильно думаешь. Базовое разделение на модули выглядит рационально.
А дальше давай думать логически.

Мы хотим из одной подсистемы взять что-то, а данные другой подсистемы использовать как признак выборки. Наш новый механизм сам собой выглядит как часть полностью отдельной от первых двух подсистемы. Он должен находиться в третьей подсистеме, сущности которой будут знать все нужное как о первой, так и о второй подсистемах.

В итоге, нам надо завести утилитарную подсистему, связанную как с фильмами, так и с рейтингами.
Для утилитарной подсистемы нормально знать сразу о многих других подсистемах, даже о других утилитарных. Поэтому в одной утилитарной подсистеме можно завести связи между фильмами и актерами, фильмами и внешними рейтингами, и.т.д.
Чувство меры в этом деле работает на уровне богатства интерфейса по связи между подсистемами. Если связь между некоторым набором подсистем порождает богатый интерфейс, то этот интерфейс имеет смысл выдавить в отдельную подсистему.

Более того, я обычно рекомендую полностью разделять данные и логику в разные подсистемы. Всякие там поиски, фильтрации и прочие любые манипуляции над неизменными данными лучше держать в отдельной подсистеме. Тогда всегда будет понятно, структура данных поменялась или метода манипуляции с этими данными.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы