Java: Как спроектировать класс, которому нужно несколько свойств от его потомка для обработки файла? - PullRequest
0 голосов
/ 07 октября 2018

У меня есть следующие требования:

  1. Чтение данных из файла CSV.
  2. Поиск повторяющихся строк на основе переданного ключа.(Например, CSV-файл имеет 10 столбцов, нам нужно найти дубликаты, основанные на определенном ключе строки)
  3. Логическое значение, чтобы отклонять / принимать дублирующиеся строки.
  4. Процессоры ячеек для проверки каждой строки вфайл.

Это для массовой загрузки данных, где я читаю файл строка за строкой, определяю, есть ли в строке правильные данные, и не является ли строка дубликатом на основе переданного ключа, и, наконец, возвращаю списокдопустимых строк.

abstract class BulkUploadService {
     List<BulkDTO> process(File file) {
       // Read a file and the value from below methods overridden by their child classes
     }

     abstract CellProcessors[] cellProcessors();
     abstract boolean isDuplicatesAllowed();
     abstract String[] headers();
     abstract String rowKey();
 }

Метод process () требует - Файл, ключ строки, CellProcessors, логическое значение для приема / отклонения дубликатов и еще несколько для обработки и возврата списка допустимых строк вформа DTO.Дочерние классы будут реализовывать BulkUploadService и переопределять все методы, кроме process (), для предоставления данных для метода process () для возврата действительного списка.

Причина, по которой я хочу абстрагироваться, заключается в следующем: BulkUploadServiceдолжен обрабатывать всю бизнес-логику и возвращать действительный список для конкретных классов, а конкретные классы должны быть сосредоточены только на предоставлении информации.Есть ли лучший способ разработки для этого сценария?

1 Ответ

0 голосов
/ 07 октября 2018

Я не большой поклонник наследования и не понимаю, почему вы используете его здесь.

Вы четко определили две обязанности:

  • обработка данных (1);
  • сбор необходимых деталей для обработки (2).

Теперь ваши подклассы должны выполнять обе обязанности, , что неверно .

Я предлагаю вам разработать отдельные классы для (1) и (2).

class BulkUploadService {
     private BulkUploadDataCollector collector;

     List<BulkDTO> process(File file) { ... }
}

interface BulkUploadDataCollector {
     CellProcessors[] cellProcessors();
     boolean isDuplicatesAllowed();
     String[] headers();
     String rowKey();
}

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

Я бы написал класс DTO (скажем, BulkUploadData), который освободит BulkUploadDataCollector (теперь переименованный в BulkUploadDataFetcher) от хранения данных и ослабит связь между BulkUploadDataFetcher и BulkUploadDataService.

Эти двое не будут знать друг о друге и будут работать исключительно через BulkUploadData экземпляров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...