3

例如,我有这样的事情:

User
-FirstName
-SecondName
-Gender

VIPUser,它是 的子类User

VIPUser extends User
-GiftNum
-Birthday

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

所以,我需要改变所有的User创建方法,并通过Birthday,它涉及很多代码。我怎样才能使它更易于维护?谢谢。

4

5 回答 5

4

我怎样才能使它更易于维护?

我认为您真正要求的是一些设计技术,可以避免您不得不重构代码。

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


对其他问题的评论:

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

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

  • 是的。一个好的 IDE 对进行大规模重构非常有帮助。事实上,你的特殊问题让我觉得很容易重构......使用一个好的 IDE。

于 2012-04-24T15:39:39.563 回答
3

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

与其将 User 类指定为参数类型,不如指定适当的接口……因为底层实现并不重要,因此维护起来更容易。

于 2012-04-24T15:09:59.290 回答
1

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

于 2012-04-24T15:18:01.913 回答
1

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

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

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

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

于 2012-04-24T15:24:37.093 回答
0

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

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

于 2012-04-24T15:21:11.247 回答