gpt4 book ai didi

java - 扩展类只是为了使用它的方法和属性

转载 作者:行者123 更新时间:2023-12-04 01:11:23 25 4
gpt4 key购买 nike

在网上找到的许多关于 Java extends 的例子中,使用了具有某种“逻辑联系”的类。例如,banana 扩展为 fruitStudent 扩展为 Person

即使两个类都没有像上面的示例那样显示“连接”,用另一个类扩展一个类只是为了继承方法和属性是否是一种好习惯?

例如,类 UserManagementService 扩展类 DatabaseConnectionService 以便 UserManagementService 可以通过调用 connect() 方法简单地连接到数据库,而不是实例化 DatabaseConnectionService 并调用 databaseConnectionService。连接()。

最佳答案

是的,这显然很糟糕;那是因为您的类型层次结构必须是公共(public) API。如果您的 API 公开了 UserManagementService,我可以将其用作 DatabaseConnectionService 对象。这意味着您选择让 UMS 扩展 DCS 是锁定 - 如果您更改它,那么使用您的 UMS 的任何代码都可能会失败。您可以尝试在文档中解决这个问题:

/**
* Lets you query information about, and perform operations on,
* the storage of users allowed on this service.
*
* IMPORTANT NOTE: Even though this class extends DatabaseConnectionService,
* this is <em>not guaranteed</em> by this implementation,
* so do not rely on this!
*/
public class UserManagementService extends DatabaseConnectionService {
...
}

但您肯定会看到这是非常次优且“丑陋”的(难以维护 - 您无法测试您无法控制的其他代码实际上是否注意到您的警告)。

它也适用于相反的情况:如果 DCS 添加了一些对 UMS 来说毫无意义的东西,那么你的 UMS 会突然崩溃,并暴露出毫无意义的疯狂东西,并导致许多问题或更糟.

将此与声明学生是某种人进行对比:这本质上是正确的;这不仅仅是一个方便的实现细节。如果整个国家/地区都获得了某种服务编号功能,并且您扩展了 Person 类来支持它,那么 Students 突然间也获得了这种服务编号功能。但这很好:毕竟,学生人。

那么,如何解决呢?

简单。不要扩展 DCS。创建一个 DCS 类型的字段,如果 DCS 有一堆您希望 UMS 也有的方法,请将它们写出来。它们的实现可以是非常简单的一行代码:

public int count() {
return dataConService.count();
}
// and a lot more of this, if really needed.

对此逻辑的常见反驳:但我控制了一切,我预计不会添加新功能!

好吧,但是要明白,单人一次性项目是谈论“风格指南和代码清洁度”的一个非常糟糕的基础——只有你,周末偷偷摸摸,随心所欲地写,你会很好。

当一个由 50 名程序员组成的团队编写的应用程序要生存并在业务中运行十多年时,风格指南和编码方法变得有用,程序员离开,新程序员加入团队,并且在项目完成 5 年后启动后,由于客户需求,您甚至没有想到的功能需要添加。

考虑到这一点,请理解代码库变得庞大,安全地更改内容和培训新程序员以熟悉它将会非常困难。使事情变得更容易的一种非常有用的方法是积极地将事物模块化:任何时候你都可以在白板上画出整个源代码库(这将是巨大的),然后在它的一小部分周围画一个小圆圈然后:东西可以自己理解,自己测试,并在没有完全理解所有其他源代码的情况下继续开发——这很好。这就是您想要的。

“UMS 目前扩展了 DCS 但不依赖于它”正是那种让绘制那个小圆圈变得更加复杂的事情,这就是为什么这样做不是一个好主意。

关于java - 扩展类只是为了使用它的方法和属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64740463/

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