gpt4 book ai didi

java - Java中的大类分解

转载 作者:搜寻专家 更新时间:2023-10-30 21:23:48 24 4
gpt4 key购买 nike

我刚开始学习 Java,我很好奇在 Java 中是否有任何好的对象分解实践?让我描述一个问题。在大型软件项目中,它总是像“核心”或“用户界面”这样的大类,它们往往有很多方法,并且旨在作为较小类之间的中介。例如,如果用户单击某个窗口上的按钮,则此窗口的类会向“ui”类发送一条消息。这个“ui”类捕获此消息并通过对应用程序用户界面执行某些操作(通过调用其中一个成员对象的方法)或通过将消息发布到应用程序“核心”(如果它是“退出应用程序”或“启动网络”之类的东西)来相应地采取行动连接”。

这样的对象很难分解,因为它们只是许多小应用程序对象之间的中介。但是在应用程序中拥有一个包含成百上千个方法的类并不是很方便,如果这些方法是从一个对象到另一个对象的微不足道的任务委托(delegate)的话。 C# 通过允许将类实现分解为多个源文件来解决此类问题:您可以按照自己选择的任何方式划分 god 对象,并且它会起作用。

在Java中划分这样的对象有什么做法吗?

最佳答案

开始分解如此大的对象的一种方法是,首先找到由大对象管理的字段或属性的良好子集,这些字段或属性彼此相关并且不与对象的其他字段或属性交互。然后,仅使用这些字段创建一个新的更小的对象。也就是说,将所有 逻辑从大类移动到新的小类。在原来的大类中,创建一个简单地传递请求的委托(delegate)方法。这是一个很好的第一步,只涉及更改大对象。它不会减少方法的数量,但可以大大减少大型类中所需的逻辑量。

这样做几轮之后,您可以通过将其他对象直接指向较新、较小的对象而不是通过之前位于所有对象中间的巨大对象来开始删除一些委托(delegate)。

参见 Wikipedia's Delegation pattern例如讨论。

作为一个简单的例子,如果您有一个人事对象来代表公司的员工,那么您可以创建一个薪资对象来跟踪与薪资相关的值,一个评级对象来跟踪员工评级,一个奖励对象跟踪此人获得的奖项,等等。

也就是说,如果您从一个包含以下方法的大类开始,每个方法都包含业务逻辑以及许多其他方法:

...
public boolean isManagement() { ... }
public boolean isExecutive() { ... }
public int getYearsOfService() { ... }
public Date getHireDate() { ... }
public int getDepartment() { ... }
public BigDecimal getBasePay() { ... }
public BigDecimal getStockShares() { ... }
public boolean hasStockSharePlan() { ... }
...

然后这个大对象可以在它的构造函数中创建一个新创建的对象 StaffType 和一个新创建的对象 PayInformation 和一个新创建的对象 StaffInformation,最初大对象中的这些方法看起来像:

// Newly added variables, initialized in the constructor (or as appropriate)
private final StaffType staffType;
private final StaffInformation staffInformation;
private final PayInformation payInformation;

...

public boolean isManagement() { return staffType.isManagement(); }
public boolean isExecutive() { return staffType.isExecutive(); }
public int getYearsOfService() { return staffInformation.getYearsOfService(); }
public Date getHireDate() { return staffInformation.getHireDate(); }
public int getDepartment() { return staffInformation.getDepartment(); }
public BigDecimal getBasePay() { return payInformation.getBasePay(); }
public BigDecimal getStockShares() { return payInformation.getStockShares(); }
public boolean hasStockSharePlan() { return payInformation.hasStockSharePlan(); }
...

以前在大对象中的完整逻辑已移至这三个新的较小对象。通过此更改,您可以将大对象分解成更小的部分,而无需接触任何使用大对象的东西。但是,随着时间的推移,您会发​​现大对象的某些客户端可能只需要访问其中一个可分割组件。对于这些客户,他们可以直接使用小对象,而不是使用大对象并委托(delegate)给特定对象。但是,即使这种重构从未发生过,您也通过将不相关项的业务逻辑分离到不同的类中来改进了事情。

关于java - Java中的大类分解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/579454/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com