Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使此对象更易于维护?_Java_Oop_Maintainability - Fatal编程技术网

Java 如何使此对象更易于维护?

Java 如何使此对象更易于维护?,java,oop,maintainability,Java,Oop,Maintainability,例如,我有这样的东西: User -FirstName -SecondName -Gender 以及VIPUser,它是User VIPUser extends User -GiftNum -Birthday 但是突然应用程序需要更改策略,所有用户必须有生日。。。。它不是一个可选字段,不再允许用户设置null,它成为新寄存器user必须填写的变量,但我可以为现有用户保留null 因此,我需要更改所有的用户创建方法,并通过生日,这涉及到很多代码。如何使其更易于维护?谢谢。设计到接口,更加灵活,

例如,我有这样的东西:

User
-FirstName
-SecondName
-Gender
以及
VIPUser
,它是
User

VIPUser extends User
-GiftNum
-Birthday
但是突然应用程序需要更改策略,所有
用户
必须有
生日
。。。。它不是一个可选字段,不再允许用户设置
null
,它成为新寄存器
user
必须填写的变量,但我可以为现有用户保留
null


因此,我需要更改所有的
用户
创建方法,并通过
生日
,这涉及到很多代码。如何使其更易于维护?谢谢。

设计到接口,更加灵活,一个类可以实现多个接口


您可以指定适当的接口,而不是将用户类指定为参数类型。。。由于底层实现并不重要,因此更易于维护。

创建一个包装器来创建
用户
实例,用户必须接收
日期
参数来设置
生日
、验证以及创建该实例的所有规则。此外,正如@NimChimpsky所说,您应该为这个包装器定义一个接口(接口主要用于业务逻辑类,而不是实体)。

这应该很容易。使用实际的JavaIDE右键单击构造函数并执行重构。问题不在于更改代码,而在于获取“生日”的值


重构相当容易(我更喜欢IntelliJ,但我认为Eclipse和Netbeans也会做得很好)。

这样更改API会在代码中产生涟漪,这是无法避免的。至少不是在强类型语言中

正如其他人所建议的,您应该在接口及其实现之间进行严格而清晰的分离

然后,您可以对API及其各自的impl模块进行版本设置,以便在更新程序时不会破坏API客户端。 数据库模式兼容性是另一个有趣的问题。:)

通常,使用工厂(模式)提供用户类的多个实例,并将其实现隐藏在接口后面,这是创建对象的良好封装。 而且,正如其他人所建议的,使用一些具有重构功能的优秀IDE应该是轻而易举的事

如何使其更易于维护

我认为您真正需要的是一些设计技术,以避免您必须重构代码

我认为答案是。。。不幸的是。。。没有这样的技术可以被认为是好的Java实践。最好的策略是在设计API时尽量提前考虑,并准备在需求发生变化时积极重构


对其他问题的评论:

  • 设计接口是一个很好的建议,通常可以简化某些类型的重构。然而,我认为这对解决像你这样的问题没有帮助

  • 创建包装器和支持新状态(生日)的东西可能是个坏主意。包装器类可能以各种方式使代码库复杂化。如果您多次使用这种方法,您会发现您的代码库变得越来越难以理解。实际上,您正在建立一个“技术债务”,其中包括尚未完全修复的问题

  • 对。一个好的IDE在进行大规模重构时非常有用。事实上,我觉得你的问题很容易重构。。。具有良好的IDE


如果兼容性是一个问题:您不能更改代码。如果没有(并且您可以访问所有代码):使用一个好的IDE进行重构。我可以更改代码,但找到所有对象的创建,并将新的
生日
值添加回对象似乎非常混乱。