我刚刚开始学习Java,并且很好奇Java是否有良好的对象分解方法?让我来描述一个问题.在大型软件项目中,它总是像"核心"或"ui"这样的大类,往往有很多方法,并且打算作为较小类之间的调解者.例如,如果用户单击某个窗口上的按钮,则此窗口的类会向"ui"类发送消息.这个'ui'类捕获此消息,并通过使用应用程序用户界面(通过其中一个成员对象的调用方法)执行某些操作或通过将消息发布到应用程序'core',如果它类似于"退出应用程序"或"启动网络"连接'.
这些对象很难分开,因为它们仅仅是许多小应用程序对象之间的调解器.但是,如果这样的方法是从一个对象到另一个对象的简单任务委托,那么在应用程序中使用成百上千种方法的类就不是很方便.C#通过允许将类实现分解为多个源文件来解决此类问题:您可以按照您选择的方式划分上帝对象,并且它将起作用.
通过在Java中划分这些对象的任何做法?
开始分解这么大的对象的一种方法是首先找到由大对象管理的字段或属性的良好子集,这些字段或属性彼此相关并且不与对象的其他字段或属性交互.然后,仅使用这些字段创建一个新的较小的对象.也就是说,将所有逻辑从大类移到新的小类.在原始的大类中,创建一个简单地传递请求的委托方法.这是一个很好的第一步,只涉及改变大对象.它不会减少方法的数量,但它可以大大减少大类中所需的逻辑量.
执行此操作几轮之后,您可以通过将其他对象直接指向较新的较小对象来开始删除某些委托,而不是通过位于所有内容中的前一个巨大对象.
例如,请参阅维基百科的委托模式讨论.
举一个简单的例子,如果你有一个人员对象来代表公司的员工,那么你可以创建一个工资单对象来跟踪与工资单相关的值,一个用于跟踪员工评级的评级对象,一个用于跟踪的奖励对象该人赢得的奖项,等等.
也就是说,如果你开始使用一个包含以下方法的大类,每个方法都包含业务逻辑,以及许多其他方法:
... 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(); } ...
以前在大对象中的完整逻辑已经移动到这三个新的较小对象.通过此更改,您可以将大对象分解为更小的部分,而无需触摸任何使用大对象的内容.但是,随着时间的推移,您会发现大对象的某些客户端可能只需要访问其中一个可分割组件.对于这些客户端,他们可以直接使用小对象,而不是使用大对象并委托给特定对象.但即使这种重构永远不会发生,你也可以通过将不相关项的业务逻辑分成不同的类来改进.