App*_*ker 12 java import coding-style package
在我的项目中,我有一个shapes包含我为我的图形程序设计的形状的包,例如Rectangle,Circle.我还有一两个与java.awt类名相同的包.
现在,因为我不想重命名我的代码库中的每个类,为了向我的源文件显示我所说的类,当我声明一个新的Rectangle时,我需要:
1-显式导入矩形类,即导入shapes.Rectangle
要么
2-只导入我需要的java.awt类而不导入java.awt.*,它自动包含awt.Rectangle
现在问题是两种方式导致大量导入,我目前在每个源文件中平均有15-25个导入,这严重地使我的代码混乱和混乱.
代码中的导入太多是件坏事吗?有没有办法解决?
是的,过多的导入是一件坏事,因为它会使您的代码变得混乱并使您的导入更具可读性.
使用通配符避免长导入列表.
Kevlin Henney在他的演讲中谈到了这个精确的Stack Overflow问题27:54 当您使用 NDC伦敦的这些企业编程技巧时,清洁编码器会讨论您的代码会发生什么? 2017年1月16日至20日
我使用显式导入,并且已经这样做很多年了。在过去十年中我的所有项目中,团队成员都同意这一点,并且所有人都乐意同意使用显式导入并避免使用通配符。这并没有引起争议。
支持显式导入:
支持通配符:
在我职业生涯的早期,我确实使用过通配符导入,因为当时 IDE 还没有那么复杂,或者我们中的一些人只使用文本编辑器。手动管理显式导入需要相当多的工作,因此通配符导入确实很有帮助。
然而,至少有一次我被通配符导入的使用所困扰,这导致了我目前的仅显式策略。
假设您有一个具有 10 个通配符导入的类,并且它编译成功。然后,您将 5 个 jar 文件升级到较新的版本(您必须将它们全部升级,因为它们是相关的)。然后代码不再编译,出现类未找到错误。现在该类位于哪个包中?班级的全名是什么?我不知道,因为我只使用简称,现在我必须区分罐子的新旧版本,看看发生了什么变化。
如果我使用了显式导入,那么很清楚哪个类已被删除,它的包是什么,以及哪个 jar (通过查看该包中的其他类)负责。
读取代码历史或查看历史合并也存在问题。当您使用通配符导入时,读者无法确定哪个类是哪个类,因此代码更改的语义是什么。通过显式导入,您可以获得代码的精确描述,并且它可以作为更好的历史记录。
因此,总的来说,维护导入的少量额外工作和额外的代码行所带来的好处很容易被显式导入所提供的额外精度和确定性所抵消。
我仍然使用通配符的唯一情况是同一包中的导入数量超过 50 个。这种情况很少见,通常仅适用于常量。
更新 1:为了解决 Peter Mortensen 的评论,如下......
Kevlin Henney 在演讲中为使用通配符所做的唯一辩护是,名称冲突问题并不经常发生。但这发生在我身上,我从中吸取了教训。我在上面讨论过这一点。
他没有涵盖我在上面的回答中提出的所有观点。-- 但最重要的是,我认为你所做的选择,显式的还是通配符的,并不那么重要,重要的是项目/代码库中的每个人都同意并使用一致的风格。凯夫林·海尼 (Kevlin Henney) 继续谈论货物崇拜编程。我的上述决定是基于几十年来的个人经验,而不是货物崇拜的推理。
如果我要加入一个现有风格是使用通配符的项目,我会同意的。但如果我开始一个新项目,我会使用精确导入。
有趣的是,在 Node.js 中没有通配符选项。(虽然您确实有“默认”导入,但它并不完全相同)。
另一种替代方法是根据需要键入完全限定的类名。在我的示例中,有 2 个Element对象,一个是我创建的org.opensearch.Element,另一个是org.w3c.dom.Element.
为了解决名称冲突,以及尽量减少导入“混乱”,我已经这样做了(在我的org.opensearch.Element课堂上):
public org.w3c.dom.Element toElement(org.w3c.dom.Document doc) { /* .... */ }
Run Code Online (Sandbox Code Playgroud)
如您所见,返回Element类型是全类型的(即我指定了 的全限定类名Element)。
问题解决了!:-)
按类导入类而不是导入整个包是一种很好的做法
任何好的IDE(例如Eclipse)都会在一行中折叠导入,并且您可以在需要时展开它们,这样它们就不会使您的视图混乱
如果发生冲突,您可以始终引用完全限定的类,但如果您控制的是这两个类中的一个,则可以考虑重命名它.(使用Eclipse,右键单击该类,选择Refactor -> Rename,它将注意更新其所有引用).
| 归档时间: |
|
| 查看次数: |
2355 次 |
| 最近记录: |