Является ли разделение класса на два разных класса хорошей идеей?

Для проекта мне нужно создать отчет из файлов Excel.

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

Вот что я пытаюсь сделать:

  1. Чтение содержимого файла Excel
  2. С этим содержимым инициализируйте новый класс Report
  3. Выгода!

Проблема в том, что в первый раз, когда я написал это, я поместил все в свой класс Report (под всем я подразумеваю чтение файла, форматирование полей и т. д.), и в итоге я получил большой класс.

Меня это не удовлетворило, поэтому я попытался сделать что-нибудь получше и создал класс ReportReader, который содержит все мои файлы для чтения, а также геттеры для инициализации класса Report. Это хорошая идея, или я должен придерживаться одного класса?

Кроме того, может быть хорошей идеей создать метод createReport внутри ReportHeader вместо того, чтобы делать общедоступными геттеры?

public class ReportReader {
    private final File file;
    private final Sheet sheet;

    public ReportReader(File file) throws InvalidFormatException
        , IOException {
     
    }

    public ArrayList<String> getFields() {

    }

    private String formatField(String input) {

    }

    public String getName() {
    
    }

    public Cell[][] getContent() {

    }

    public String getType() throws IOException {

    }
}

и:

public class Report {
    private String name;
    private String type;
    private ArrayList<String> fields;
    private Cell[][] content;
    
    public Report(String name, String type, ArrayList<String> fields, 
        Cell[][] content) throws IOException {
    
    }
    
    public void saveFieldsModel() throws IOException {
       
    }
    
    public String getFieldsAsCsv() {
    
    }
}

Использование только одного класса — плохая идея. en.wikipedia.org/wiki/Принцип единственной ответственности

yuri777 16.05.2022 13:54

@yuri777 Спасибо за ответ и за ресурс!

nrbt 16.05.2022 14:18
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

да, создание класса для каждой обязанности — это хорошая практика. Это один из принципов ТВЕРДЫЙ. Есть отличный пост о уточнение единой ответственности.

could it be a good idea to create a createReport method inside ReportHeader instead of making public getters available?

Похоже, CreateReport не связано с ReportHeader. Класс Report был бы более подходящим местом для метода CreateReport(). Кроме того, если вы поместите метод CreateReport() в класс Report, то вы можете называть его как Create, а не CreateReport:

public class Report {
    public void Create(){}
}

а затем в пользовательском классе это будет выглядеть так:

Report report = new Report();
report.Create(); // not "CreateReport()" :)

Извините, я сделал небольшую опечатку в своем вопросе. Это ReportReader не ReportHeader ... Итак, теперь, поскольку мой класс ReportReader содержит все, что мне нужно для инициализации класса Report, уместно ли просто иметь метод .Create() в ReportReader вместо того, чтобы делать new Report(reportReader.getX(); reportReader.getY(); ...)?

nrbt 16.05.2022 15:57

На мой взгляд, это зависит от цели метода? Если метод «Создать()» создает файл Excel, то можно использовать метод Create(). Если классу Report требуются некоторые параметры для конструктора, то можно создать такой экземпляр new Report(reportReader.getX(); reportReader.getY(); ...)

StepUp 16.05.2022 16:16

Хорошо, большое спасибо, что уделили мне немного своего времени :)

nrbt 16.05.2022 16:23

@olsa добро пожаловать. Я рад, что это помогло вам. :)

StepUp 16.05.2022 16:29

Другие вопросы по теме