当前位置: 首页 > 面试题库 >

Java中的大类分解

贝浩歌
2023-03-14
问题内容

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

这样的对象很难分解,因为它们只是许多小应用程序对象之间的中介。但是在应用程序中使用具有成千上万个方法的类并不是很方便,如果此类方法是从一个对象到另一个对象的琐碎任务委派,则很容易。C#通过允许将类实现分解为多个源文件来解决此问题:您可以选择任意方式划分God对象,并且它可以工作。

通过在Java中划分此类对象有什么实践?


问题答案:

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

经过几轮操作之后,您可以通过将其他对象直接指向较新的较小对象,而不是通过位于所有内容中间的先前很大的对象来开始删除某些委托。

例如,请参阅Wikipedia的“委托”模式讨论。

举一个简单的例子,如果您有一个人员对象来代表公司的员工,则可以创建一个薪资对象来跟踪与薪资相关的值,一个评级对象来跟踪员工的评级,一个奖励对象来跟踪该人赢得的奖项,等等。

假设,您从一个包含以下方法的大类开始,每个方法都包含业务逻辑以及许多其他方法:

...
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(); }
...

过去大对象中的全部逻辑已移至这三个新的小对象中。通过此更改,您可以将大对象分解为较小的部分,而无需触摸任何使用大对象的东西。但是,随着时间的推移,您会发​​现大对象的某些客户端可能只需要访问其中一个可分割的组件。对于这些客户端,他们可以直接使用小对象,而不必使用大对象并委派给特定对象。但是,即使从未发生这种重构,您也可以通过将无关项目的业务逻辑划分为不同的类来进行改进。



 类似资料:
  • 问题内容: 如果一个人在不同目录中编写了两个具有相同的不区分大小写名称的公共Java类,则这两个类在运行时将不可用。(我在Windows,Mac和Linux上使用多个版本的HotSpot JVM进行了测试。如果还有其他同时可用的JVM,我也不会感到惊讶。)例如,如果我创建了一个名为类的类,则这样命名: 在我的网站上可以找到三个包含上面代码的Eclipse项目。 如果尝试,我像这样调用两个类: 类型

  • 问题内容: 类B继承了类A。现在,当我们创建类型B的对象时,为B分配的内存是多少?是否包括A和B或任何其他内存分配过程? 问题答案: 当创建对象B时,假设调用了默认构造函数 然后,JVM分配具有更多或更少内容的对象: 在B中显式声明的每个字段都有足够的内存(每个字段通常大约4-8字节,但是类型和主机系统之间有很大差异) 对于A及其祖先继承的每个最终字段,都有足够的内存 足够的内存来包含对调度向量的

  • 问题内容: 我想知道java类的最大大小是多少。如代码属性结构中http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1546所示,代码长度指定为4个字节,因此很多。我不明白的是,异常表的pc属性是2个字节。如果代码长度超过2个字节,但异常表只能寻址2个字节,怎么办? 问题答案: 第4.8.1节JVM规范的静态

  • 本文向大家介绍java中最大的整数用法分析,包括了java中最大的整数用法分析的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了java中最大的整数用法。分享给大家供大家参考,具体如下: 8种基本数据类型中,long类型所能表示的整数范围是最大的,但还是有限的。另外,基本数据类型中的整数还有一个问题,那就是不是每个数都能够正确的取负数。例如,对int型而言,“-2147483648”取负就不

  • 问题内容: 我想将这个大字符串分成几行,每行中的内容不应超过MAX_LINE_LENGTH个字符。 到目前为止我尝试过的 输出: 它造成 断字 。我不要这个 而不是我想要这样的输出: 添加了另一个条件: 如果单词长度大于MAX_LINE_LENGTH,则该单词应拆分。 解决方案应该没有外部罐子的帮助。 问题答案: 只需逐个单词地遍历字符串,并在单词超过限制时中断。 我只是以徒手的方式输入了该内容,

  • 本文向大家介绍java中functional interface的分类和使用详解,包括了java中functional interface的分类和使用详解的使用技巧和注意事项,需要的朋友参考一下 java 8引入了lambda表达式,lambda表达式实际上表示的就是一个匿名的function。 在java 8之前,如果需要使用到匿名function需要new一个类的实现,但是有了lambda表达