Java 如何正确拆分类(OOP)?

Java 如何正确拆分类(OOP)?,java,oop,solid-principles,Java,Oop,Solid Principles,我有一个类,它读取Excel文件作为模板 该类将Excel文件转换为Java对象 将信息添加到模板中 用添加的信息重写模板 我读了一些关于单一责任原则的东西,决定重构我的类,因为它做的不止一件事 我只是不确定我在这里做了什么 public class ExcelWorkbookCreator { public Workbook create() } public class ExcelToBean { public List<ExcelBean> convert(Work

我有一个类,它读取Excel文件作为模板

  • 该类将Excel文件转换为Java对象
  • 将信息添加到模板中
  • 用添加的信息重写模板
我读了一些关于单一责任原则的东西,决定重构我的类,因为它做的不止一件事

我只是不确定我在这里做了什么

public class ExcelWorkbookCreator {
public Workbook create() 
}

public class ExcelToBean {
  public List<ExcelBean> convert(Workbook workbook);
  private void writeCellDataToBillingBean(ExcelBean excelBean, DataFormatter   dataformatter, Cell cell, int counter);
  private boolean isDatevalueFormattedCorrectly(String datevalue);
}

public class ExcelWriter {
  public void beanToExcel(List<ExcelBean> excelBeanList, Workbook workbook);
  public int write();
  private void fillValidationInformation(Sheet sheet, int rowCount, ExcelBean   excelBean);
  private void fillHeaderRow(Sheet sheet, int rowCount);
  private void autoSizeCoulmn(Sheet sheet);
}

public class ExcelUtils {
  public static boolean isHeaderRow(int rowNumber);
  public static boolean isCellEmpty(Cell cell);
  public static boolean isRowEmpty(Row row, DataFormatter dataformatter);
  public static void closeWorkbook(Workbook workbook);
}

//before i had all methods in One Class. 
公共类ExcelWorkbookCreator{
公共工作簿创建()
}
公共类ExcelToBean{
公共列表转换(工作簿);
私有void writeCellDataToBillingBean(ExcelBean ExcelBean、DataFormatter DataFormatter、Cell单元格、int计数器);
私有布尔值IsDateValueFormatted正确(字符串datevalue);
}
公开课优秀作家{
公共作废beanToExcel(列表excelBeanList,工作簿);
公共int write();
私有void fillValidationInformation(Sheet-Sheet、int-rowCount、ExcelBean-ExcelBean);
私有空白填充头错误(表格,整数行计数);
专用void autoSizeCoulmn(第页);
}
公开课的优异成绩{
公共静态布尔isHeaderRow(int rowNumber);
公共静态布尔值为空(Cell);
公共静态布尔值isRowEmpty(行,数据格式化程序DataFormatter);
公共静态工作簿(工作簿);
}
//以前我在一个类中有所有的方法。

乍一看,这对我来说相当不错

关键是在一个类/方法中有大量的“责任”。只需阅读类的名称,并查看公共方法,就应该清楚该类可以为您做什么,以及您如何与该类交互以实际获得这些结果

除此之外,方法应该做一些易于用单元测试测试的事情

考虑到以上所有想法:是的,这看起来不错


其中:我假设您的公共静态实用程序方法在多个类中使用,只有这样它们才应该进入一个不同的类。唯一值得考虑的是:所有的方法和类都需要公开吗?作为整体解决方案的外部用户(从不同的包调用),该客户机代码真的需要所有这些公共方法吗?意思是:只公开外部客户端代码应该使用什么

您的设计可以在OOP方面得到改进。它是否符合SRP和SOLID的思想应该在您对OOP充满信心之后排在第二(或第三)位

我首先想到的是类名。其中三个描述的是一个动作而不是一个“东西”,第四个是一个带有静态方法的“Utils”类,如果我们坚持使用OOP,这是一个很大的禁忌

所以,让我们先选择正确的名字。如果你的域是关于Excel的,那么你的类应该是:
ExcelFile
Sheet
单元格
,等等。你已经有了一些,这很好,但是所有的对象都需要来自你的域,特别是你域中的“东西”

如果你有这些,想想他们必须做什么(责任),以便最终得到你想要的。不是他们必须拥有的数据,而是他们可能提供的功能。例如,我可以想象
ExcelFile
有一个名为
writeTo(File File)
的方法,或者
Cell
isEmpty()
,等等

你做得很好,如果你的逻辑是最后一行,比如:

ExcelFile.readFrom(…).addInformation(…).writeTo(…);
您应该能够从代码中读回您的需求


如果你达到了这一点,那么仔细检查代码,看看某个对象是否有太多的责任来证明重构是正确的。

所有这些类都在同一个文件中吗?在我看来,你错了一个责任。单一责任表示模块应负责系统的一部分。现在它可能会做很多事情,但这并不意味着它违反了单一责任原则。您所做的是试图将一个模块的责任划分到不同的模块/类中。@ivange94所以您认为如果我有一个名为“ExcelProcessor”的类,其中包含所有方法,我就可以了?通过这种方式,我将有一个类,它只负责项目的一部分,这是处理Excel操作…好问题顺便说一句!我希望更多的人能真正考虑他们代码的质量。当考虑“服务”时,类名中的动词可以很好。并非每件事都必须是关于事物的。有时更多的是关于行为和处理。