Для проекта мне нужно создать отчет из файлов Excel.
У меня есть большой вопрос дизайна, который я не могу решить сам, и я не нашел решения в Интернете.
Вот что я пытаюсь сделать:
Проблема в том, что в первый раз, когда я написал это, я поместил все в свой класс 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() {
}
}
@yuri777 Спасибо за ответ и за ресурс!
да, создание класса для каждой обязанности — это хорошая практика. Это один из принципов ТВЕРДЫЙ. Есть отличный пост о уточнение единой ответственности.
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(); ...)
?
На мой взгляд, это зависит от цели метода? Если метод «Создать()» создает файл Excel, то можно использовать метод Create()
. Если классу Report
требуются некоторые параметры для конструктора, то можно создать такой экземпляр new Report(reportReader.getX(); reportReader.getY(); ...)
Хорошо, большое спасибо, что уделили мне немного своего времени :)
@olsa добро пожаловать. Я рад, что это помогло вам. :)
Использование только одного класса — плохая идея. en.wikipedia.org/wiki/Принцип единственной ответственности