Re[10]: Интерфейсы и реализация
От: · Великобритания  
Дата: 04.09.20 09:49
Оценка:
Здравствуйте, rosencrantz, Вы писали:

R>·>Ок. Вот тогда твой пример с UserHandler непонятен. Я так и не понял накой там interface UserHandler, чем плох просто class UserHandler.

R>·>И уж тем более кошмарик BatchInsertingUserHandler, как будто ты имя класса так придумал.
R>·>Я для сравнения привёл код без интерфейса — по каким критериям он хуже?

R>Он не обязательно хуже, он просто не обладает теми свойствами, которыми обладает мой вариант. Плохо это или хорошо — я ж как раз пытаюсь донести — зависит от восприятия автора/читателя.

Ок. Каким образом в коде выражается это разбиение на модули? Ну т.е. представь себе ты написал код, закоммитил, я открываю твой код и я там увижу эти модули? Как читатель узнает твоё авторское восприятие этого кода?

R>Вот сокращённая версия моего кода:

// модуль 3 - "импорт" (использует модуль "чтение CSV" и модуль "запись в базу батчами")
class BatchInsertingUserHandler implements UserHandler {
  BatchInsertingUserHandler(BatchInserter<UserRow> batchInserter) {...}
}

 --- вот здесь явно видна ещё граница между модулями. "модуль импорт" и "модуль сборки конечного приложения"
 --- т.к. это явно просто wiring code, composition root.

BatchInserter<UserRow> batchInserter = new BatchInserter("insert into Users(...)");
BatchInsertingUserHandler userHandler = new BatchInsertingUserHandler(batchInserter);
UserCsvReader reader = new UsersCsvReader();
reader.readAllUsers(userHandler);
// конец модуля 3


R>Интерфейс UserHandler здесь нужен для того, чтобы показать границу между модулем 1 (как мы читаем CSV) и модулем 3 (когда мы читаем CSV, что мы с этим делаем). Модуль 1 в этом случае именно вполне самостоятельный модуль. Его можно без изменений переиспользовать для например написания конвертора из CSV — в XML. Но это не очень важно. Важно что самодостаточная концепция изолирована от остального мира То же самое, что ваша иллюстрация про "файловая система не должна знать про сеть" — у меня "читалка csv не должна знать про писалку в бд", просто масштаб другой.

Тут я топлю за принцип YAGNI. Вот когда нам не станет хватать, что наш class UserHandler пишет батчами в бд, вот тогда мы отрефакторим код и у нас получится interface UserHandler и реализующие его class DbUserWriter, class XmlUserWriter — с не вымученными enterprisified именами, а явно продиктованными новыми появившимися требованиями.

R>В вашей версии если UserHandler превращается в BatchInsertingUserHandler, модуль 1 исчезает и его содержимое становится частью модуля 3. Конвертор CSV->XML вы уже не напишете без правок кода, но такой цели и не было. Но вообще чтение CSV у вас теперь гвоздями прибито к вставке в базу.

Модуль 1 не исчезнет, а станет состоять из только лишь класса UserCsvReader.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.