如何正确拆分 类(OOP)?

how to split classes correctly(OOP)?

好吧,我有一个 Class 可以读取 Excel 文件作为模板。

我正在阅读一些关于单一职责原则的文章,并决定我需要重构我的 class,因为它做的不止一件事。

我只是不确定我在这里做了多少?

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. 

乍一看,这对我来说还不错。

重点是在 class/method 中有 有意义的 数量的 "responsibility"。只需阅读 class 的名称并查看 public 方法,就应该清楚 class 可以为您做什么,并且您如何 与 class 互动以实际获得这些结果。

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

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

其中:我假设您的 public 静态实用程序方法在多个 class 中使用,只有这样它们才应该进入不同的 class。唯一 worth 考虑的是:是否所有方法和 classes 都需要公开?整个解决方案的外部用户(从不同的包调用它),客户端代码真的需要 all 这些 public 方法吗?含义:仅使 public 外部 客户端代码应该使用的内容!

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

首先让我印象深刻的是 class 名字。其中三个描述的是动作而不是 "thing",第 4 个是带有静态方法的 "Utils" class,如果我们坚持使用 OOP,这是一个很大的禁忌。

所以,让我们先选择正确的名字。如果您的域大约是 Excel,您的 classes 应该是:ExcelFileSheetRowCell 等。您有一些已经有它们了,这很好,但是 所有 对象需要来自您的域,特别是您域中的 "things"。

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

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

ExcelFile.readFrom(...).addInformation(...).writeTo(...);

您应该能够从代码中读回您的需求。

如果你达到了这一点,那么检查代码并查看某个对象是否有太多责任是有意义的这证明重构是合理的。