当您从库中调用方法时,您期望它完全按照其名称所暗示的那样执行。
Connection c = driver.getConnection();
- 回馈联系
- 如果失败则报告错误
- 不要做超出预期的事情
在编写“库代码”时,很容易坚持解耦、内聚、抽象原则。不遵守这些,大多数时候,意味着设计上的错误。
但是当你在业务逻辑中时,会出现一些困难,也许必须改变视角。在业务逻辑级别,我说:
session.connect(); //session is of Session type, my "business logic class"
我希望它读取配置文件,如果没有找到它,则采用默认值,连接,进行一些检查,决定需要通知用户哪个警告,例如数据库版本比客户端旧的事实软件。
如果你说一个方法不应该做所有这些事情,因为它必须是内聚的,并且严格地应用它,你最终会得到一个只有一行的 connect 方法:
public class Session {
...
Connection c;
public void connect() {
c = driver.getConnection();
}
}
也就是connect
业务类Session的方法会塌陷到底层类。
剩下的任务呢?读取文件,检查数据库版本等?
您将业务代码推迟到将执行所有逻辑的“大方法”。
这正是我的观点。
如果您在业务逻辑上下文中应用内聚和解耦原则,您将无法将任务细分为更小的子任务,并且您将拥有一些大型“单体”方法来完成所有工作并且可读性差。
我发现低级库(Driver.getConnection())的良好原则(内聚力、抽象)对于业务逻辑来说是不够的。
我的想法是:
- 凝聚力必须被一个全新的概念取代
- 凝聚力必须“拉伸”到某个点
既然我更喜欢第二个,我的问题是那点是什么。