|
|
|
single responsibility principle или DRY
|
|||
|---|---|---|---|
|
#18+
Доброй ночи. И у меня вопрос. Сейчас создам абстрактную ситуацию с этой же проблемой. Допустим есть школа курсов. В школе есть курсы Cource{ Sring id;(PK) String name; } и студенты Students{ Sring id;(PK) String firstName; String lastName; } Ну и само собой, они между собой связаны, на любой курс может записаться любой студент: CourceStudents{ String id;(PK) String courceId(FK); String studentId(FK); } Теперь. Изначально задача звучала так: >Дайте нам список студентов, и мы хотим видеть список всех курсов для каждого студента, хотим назначать определенные курсы каждому (добавлять в этот список) или удалять Путем нехитрых манипуляций была создана система запросов, содержащих в себе иннер джойн, который джойнит инфу из таблицы CourceStudents вместе с данными из таблицы Cource. Т.е. клиенту(API) выдавались такие данные: GET: /students [{id:1, firstName:'Artem', lastName:'Ivanov'},{id:1, firstName:'Alexandr', lastName:'Tkachenko'}] это метод просто для получения всех студентов GET: /cources?studentId=1233212 Response: {id: '12_ид_из_таблицы_CourceStudents_21', name: '121_name_из_таблицы_Cource_12', studentId: '1233212_просто_возвращаем_его_хотя_он_и_так_в_запросе'} а это метод ля получения всех курсов определенного студента (для простоты опустим, что там на самом деле возвращается список) Все работает, клиент доволен. Потом были добавлены новые требования: >мы бы хотели видеть еще всех студентов определенного курса и делать управление там т.е. клиент хочет иметь еще и такое апи: GET: /students?courceId=1233212 Response: {id: '12_все_тот_же_ид_из_таблицы_CourceStudents_21', firstName: 'Артем', lastName: 'Иванов', studentId: '1233212_а_вот_теперь_это_важно'} Понятно, что придется писать новые ендпойнты, ведь данные немного другие. Но это не сложно. Куда более интересней дилемма с запросами в базу, ведь раньше я джойнил данные из одной таблицы а сейчас надо из другой. И тут вопрос. У меня(на уме) есть несколько вариантой действий: 1) Сделать все то же самое, только джойнить с данными из другой таблицы, т.е. написать немного другой код но для для той же логики и для той же таблицы, писать новый парсер ответа от базы(пускай это будет RowMapper от Spring JDBCtemplate) и новый ендпойнт, кароч писать кучу кода, которая по сути делает уже то что было сделано, дублировать логику и все такое. 2) Использовать существующий код, получения связей, сделать нему условия для получения студентов по курсу т.е. сначала получаем данные в таком виде: {id: '12_ид_из_таблицы_CourceStudents_21', name: '121_name_из_таблицы_Cource_12', studentId: '1233212'} Из всего этого нас сейчас интересует две вещи: это ид связи и ид студента. Имея ид студента, мы делаем другой запрос в базу, уже получения полной инфы о студентах по их ид. Далее просто сопоставляем данные и возвращаем пользователю нужный ответ. Т.е. вопрос стоит в том что лучше: Повторное использование кода и отсутствие дублирования логики но несколько запросов в базу ЛИБО один запрос в базу, но куча кода, который делает то же самое с теми же дынными, но в другом представлении. Приложение не является критичным по производительности, но критическим по поддерживанию. Если бы производительность была критичной, я бы не думая выбрал первый вариант. А тут даже не знаю. Вроде два запроса это не так уж и плохо. Ну, логика будет немного запутана, зато никакого дублирования. С другой стороны написать полный стек конвертеров, логики, держа все "просто" тоже неплохо, тем более в том случае всегда можно будет изменить реализация в одном месте, не трогая в другом. Такая себе борьба single responsibility principle и DRY. Что можете посоветовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 02:14 |
|
||
|
single responsibility principle или DRY
|
|||
|---|---|---|---|
|
#18+
Скажу даже более - у меня используется не простая база данных, а очень тяжелая самописная распределенная база. И потому один запрос выполняется существенное время (около трети секунды). Но снова таки, это приложение не является критичным, хотя за неоправданную "тормознутось" операций будет как минимум "не ловко" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.06.2015, 04:58 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=127&tid=2125262]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
43ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
20ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 305ms |

| 0 / 0 |
