Здравствуйте, 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.