从语义上来说,比`util`更合适的软件包名称是?


18

就像一个稻草人考虑的那样,java.util它是各种课程的垃圾场,在大多数情况下,除了让他们在那里的人懒惰或没有动力为他们的课程提出一个语义上更正确的软件包名称外,大多数情况下没有其他共同点。

作为一个示例,使用该类UUID在该语义上正确的包名称是什么?

我正在努力实现自己的UUID类,以使其更加轻巧。我不想使用me.myproject.util.UUID我的包裹名称。

我考虑过,me.myproject.rfc4122.UUID但这并不意味着使用的语义UUID

我也考虑过,me.myproject.uuid.UUID但我不喜欢重言式,尽管在Python中将同名的类放入模块中是一种流行的方法,而packagesJava在语义上并不等同modules于Python。

我也考虑me.myproject.UUID但拒绝了它,因为我不想用不相关的内容污染名称空间的那一部分。这只是使问题更上一层楼。

我也考虑过,me.myproject.lib.UUID但这并没有更多的语义含义.util,只是重命名了问题。

semantics:与意义有关的语言学和逻辑学分支。


怎么me.myproject.UUID样 或me.UUID
罗伯特·哈维

对我来说,from me.myproject.uuid import UUID, GetUUIDInfo看起来不错。一个模块中可能有多个导出的东西。
9000

2
JXTA有一个与id有关的“ id”包。
greg-449

@ greg-449-我倾向于identityidentifiers将您的建议带一点解释,作为可能会被接受的答案。

Answers:


11

试图将每个类放入具有该类的语义正确名称的包中的问题是,它倾向于导致包含很少类的包,有时甚至只包含一个类。这又导致了很多包装。

包命名的一种更实用的方法是简单地帮助您查找内容。将经常使用的东西保存在一个地方,您总是知道在哪里可以找到所有的东西,从而避免了它们的麻烦,因此可以更轻松地找到很少使用的东西。因此,您实际上并不需要在其所包含的每个类的语义上正确的程序包名称,而只需要在语义上并非正确的程序包名称。显然,“ util”包名称是根据以下思路选择的:它不是包含类语义上正确的名称,但在语义上也不是不正确的,这就足够了。

因此,如果您的这种UUID类型注定仅由该特定应用程序使用(如您计划将其放在“ myproject”下的事实所证明),则它可能是您的“模型”的一部分项目。您应该已经有了一个“模型”包,其中包含与您的持久性实体相对应的所有类的集合,其中许多类之间可能存在关系,而UUID可能是实现这些关系的方法。另外,您的UUID可能知道如何保持自身,对吗?而且,您的UUID可能只能作为模型实体的成员找到,对吗?因此,您的模型包装可能是最好的选择。

否则,如果您的UUID类型也可以在其他项目中使用,则需要将其视为某些框架的一部分。因此,它可能位于该框架的根源文件夹中,或者位于MainMa建议的某些“类型”子包中,或者甚至位于该框架的某些名为“ util”或“ misc”的子包中。没有错。


2
请尝试限制评论中的评论,这些评论并不能真正增加答案的实用性。评论部分保留用于此类免责声明。谢谢。
maple_shaft

1

包的目的是根据某些条件将类分组(按类型/层的包与按功能的包等)。我真的没有发现只为一个类创建包的意义-尤其是如果您不希望将来该包中还会有其他类。

同样,我认为“ util”包名称并非完全没有意义-只是按照特定的标准对类进行分组-对我而言,“ util”类意味着它不是应用程序领域的一部分,但也不是应用程序领域的一部分框架(它不会影响应用程序的结构)。它基本上只是(非)标准库的扩展。

在这种情况下,将这个UUID类放入“ util”包中不会有问题。如果还会有其他一些与UUID相关的实用程序类(例如用于生成UUID的单独类),则很容易为它们重构和创建“ util.uuid”包(除非您正在创建库,并且UUID将成为公开接口的一部分) ,那么您需要有点“前瞻性”)。


1
这是我的方法。创建一个没有明确目的的软件包是没有意义的。如果不能轻易将一个类分配给有意义的包,那么“ util”很好,甚至可能是首选。通常情况下,发生的事情是足够多的类最终都在util中关联,并且很容易将它们从util中重构出来(至少在开发过程中)成有意义的包。如果您尝试为每个类创建唯一的软件包,而这些类不知道它的去向,那么您可能会很容易错过这些关系以及重构为更简洁的体系结构的机会。
Dunk 2015年

@Dunk,这实际上是一个很好的观点-过早地创建一些人为的包结构将阻止您在此过程中看到更好,更自然的组织。
2015年

1

鲍勃叔叔有一些包装分离的准则

前三个包装原则是关于包装内聚力的,它们告诉我们在包装内放入什么:

  1. 再利用的颗粒是释放的颗粒
  2. 一起变化的类打包在一起
  3. 一起使用的类打包在一起

那么,回答您的问题,谁/将使用 UUID类,将其作为属性或在其中调用操作?你的依赖图怎么样?UUID将与其他哪些类一起使用?

根据您的答案,也许您应该将其称为me.myproject.identity程序包,me.myproject.serialization程序包me.myproject。DTO甚至完全是其他东西。也许应该将UUID类与模型保持在一起,并将其放入已经拥有的包中,例如me.myproject.models


1
dto大约是语义无用的libutils,整个dto概念是从90年代中期,一个天真的反模式,model属于同一没用的概括类别以及

我们鸵鸟政策足够了解你的项目给你更多有用的名称
HBA卡

-2

首先,对于我来说,对于包名或类名来说,UUID(带有大写字母)似乎是一个非常糟糕的主意,因为从一种方式强制执行的所有样式中,所有大写名称都与“常量”相关联。包是用来组织东西的,最简单的命名包的方法是通过其持有的类的值:

  • 您可以选择按类别的bussines值分隔类别,例如com.example.identifier
  • 或例如通过其技术价值com.example.uuid

简化IT


2
在Java中ALLCAPS类的例子:java.util.UUIDjava.net.URLjava.util.zip.CRC32
scriptin

如果开发人员可以仅区分大写字母样式,“常量”类,封装名称等成员,@ scriptin会不会更轻松?为什么您认为CRC32,UUID是类的好名字,仅因为Java做到了?还是因为它是“通用唯一标识符”或“循环冗余校验”的首字母缩写,所以请稍等!这java.util.zip.GZIPOutputStream节课是什么?GZIP代表... ? there is also a java.util.zip.ZipOutputStream`
Tiberiu C.

1
类是类型,常量是值,没有混乱。我不认为这些名称是好是坏,我只是指出您所谈论的(编码)样式不会强制类使用小写字母。在Python中UUID也是大写的。
scriptin

如果您每天都看到/保留代码,那么它的样式就会使“易于阅读”和“前进和后退”福特嘉年华之间有所不同,这里仅将其与大写字母风格隔离开来,我认为通过大写字母,成员的类型(类,常量,包等),而不是缩写词。
Tiberiu C. 2015年

1
最初的问题与编写程序包名称时使用的字母大小写无关。在语义上, UUID与Uuid,uuid,UuId,UuID或您碰巧认为是“最佳”的任何其他任意大写方案没有什么不同。
布兰登2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.