如何避免类与本机类之间的名称相似?[关闭]


9

我刚遇到一个“有趣的问题”,我想请您就以下问题提出意见:

我正在开发一个系统,由于多种原因(含义:抽象,技术独立性等),我们创建了自己的信息交换类型。

例如:如果有一个称为SendEmail的方法并由业务逻辑调用,则该方法具有类型OurCompany.EMailMessage的参数,该参数是完全与技术无关的对象,并且仅包含“与业务相关的数据”(对于例如,除了头编码之外,没有其他信息)。

在SendEmail函数内部,我们从EMailMEssage对象获取此信息,并创建一个MailMessage对象(该对象是特定于技术的),以便可以通过网络发送它。

您已经注意到,我们的类与“本地”语言类的名称非常相似。问题是:这正是电子邮件的含义,因此很难为它们找到另一个有意义的名称。

您经常遇到这个问题吗?您如何管理?

编辑:@mgkrebbs刚刚评论了使用完全限定的名称。这是我们目前的方法,但是恕我直言有点太冗长了。如果可能的话,我想要更清洁的东西。


2
如果有点冗长,始终使用资格似乎是一个可行的解决方案。将OurCompany.EMailMessage用于一种类型,将SendEmailClass.EMailMessage(或其他类型)用于另一种类型。采用这种方法是否有问题?
mgkrebbs 2011年

是的,我考虑过,但是变得冗长。我想要一种“清洁”的东西,但是您提出的解决方案是我目前的解决方案。我将其添加到解释中
-JSBach

3
名称来自上下文。通常是一个名称空间或类似的名称。因此,这应该不是问题。
deadalnix

+1,我喜欢这个问题。大约7年前,我曾经向教员问过这个问题,他认为我是一个完整的“ ....” :)
NoChance 2011年

您使用什么语言?答案是特定于语言的。通常,答案是“使用命名空间”。在单个Java应用程序中,很常见的是有六个库使用相同的类名。
凯文·克莱恩

Answers:


3

这是关于要用于项目的名称空间的问题。

基本上,名称空间是由您的所有类和/或您要在项目中使用的所有类(包括通常随language / compiler / IDE一起提供的标准类)提供的关键字的集合。

由于名称空间是一个集合,因此一些基本的规则适用于防止术语混乱而没有任何相关行为,并且某些语言(例如C#)还允许您照常定义自己的名称空间,并在其他类中使用它。

不要将名称空间与语言的基本关键字混淆,它们都是关键字的集合,但是两者之间有很大的区别:您可以修改名称空间,但通常不能修改语言的基本关键字。您在项目中使用的名称空间与所使用语言的基本关键字之间的总和为您提供了关键字的总数。

该主题在网络上进行了大量讨论,我可以建议使用术语“名称空间[您的语言]”或类似名称进行基本搜索。我不会直接回答您的问题,只是因为您可以对不同的语言使用不同的方法。


3

好吧,我以前的开发团队经常在每个自定义类中附加应用程序的首字母缩写。例如,我们有ABCEmail类。

我认为它比依赖名称空间更直接,但也可以作为名称空间使用的补充解决方案。

最后但并非最不重要的一点,因为您正在创建一个新对象,这意味着本机对象无法满足您的需求,因此您的电子邮件文件名称可以是CustomizedEmailAdvancedEmail ... etc


1
同意您的最终观点,但是为什么会OAEmail比这更好OurApplication.Email呢?OAEMail它对软件的每个部分都有影响,而名称空间符号仅在发生转换的地方具有影响,并且两个类都在同一源文件中使用。
Steven Jeuris 2011年

1
当您的语言不支持名称空间时,我认为前缀是一个好主意。但是,如果语言支持某种形式的命名空间,然后使用它(这是问题的命名空间被设计来解决!)`
马丁纽约

@Steven Jeuris:班级的名称一旦创建便应选择。之后,由于所有不必要的影响,我发现更改它是一种不好的做法。
阿米

@Loki Astari:我不知道您使用的是哪个IDE,但是我发现在搜索或打开给定的类时,更容易处理不同的类名。我看到项目具有自定义版本的“电子邮件”,每次我想打开文件时,都不得不浏览多个命名空间。您的观点仍然有效,我想这取决于包组织要创建多少个定制类。
阿胺

1
@Amine:我没有意识到您实际上是在反对名称空间。我建议您阅读一些有关名称空间的文章,以了解使用它们的所有优点:封装,消除歧义,减少冗余,... Ps:大多数现代IDE具有搜索功能,可让您快速浏览源文件而无需浏览层次结构。关于您对我的评论:持续重构是软件开发的一部分。当您想出一个更合适的名称(无论是否具有重大影响)时,应考虑重命名。但是最好先与同事讨论。
Steven Jeuris 2011年

3

您使用什么语言?答案是特定于语言的。通常,答案是“使用名称空间”。为了避免与某些外部名称空间发生冲突,我几乎永远不会修改类型名称。

在单个Java应用程序中,在六个命名空间中定义相同的类名(例如“日期”)是很常见的。如果一个类需要使用两个单独的Date类,则其中一个Date类必须在出现的所有位置都完全合格,因为Java不支持类型别名。在C ++中,生活会更轻松;您可以使用typedef重命名其中之一。


我将要发布一个类似的答案,但不是C ++别名示例想要提及C#的using alias指令
Steven Jeuris 2011年

@Steven:我要提到的是C#而不是C ++,但是自从我用C#编程以来已经有好几年了,还不确定。
凯文·克莱恩

2

您经常遇到这个问题吗?您如何管理?

这实际上取决于您使用的语言。在c ++和java中,通过使用命名空间可以解决此问题。我正在使用c ++,碰巧我得到了具有相同名称的不同类。没问题,因为它们位于不同的命名空间中。

在其他语言中,除了提供不同的名称外,别无选择。


对于计算机而言,这不是问题,但是对于开发人员而言,则可能是问题,因为例如,您拥有EmailMessage和MailMessage。
JSBach

@奥斯卡显然。对于计算机,它可以xyz123并且仍然可以正常工作。我看不到其他方法,然后再进行详细说明(您在评论中表示,您正试图避免这种情况)。
2011年

2

您的问题很好。如果为方法加上前缀U(或u)或cls(类的缩写)怎么办?举些例子:

clsEMailMEssage或uEMailMEssage

这不需要很多输入,您可以立即知道类型是“您的”。

编辑 - 针对前2条评论:

我想提醒读者注意以下事实:并非所有匈牙利符号都是相同的。我们应该区分System HungarianApps Hungarian,我假设以上建议遵循Apps Hungarian类型,这是无害的。

在上面的建议中,不存在与系统匈牙利符号相关的危害,例如在将ID命名为intID时。

有关更多信息,请看:使错误的代码看起来不正确-Joel On Software


3
每当有人推荐匈牙利符号时,上帝就会杀死一只小猫。
Konamiman

2
BIgHUmpCAmelCAsing也无济于事。
史蒂文·杰里斯

以上评论表示赞赏。请看我的编辑,尽管我知道我们当中有些人不会改变主意,毕竟谁想要杀死一只小猫?:)
NoChance 2011年

现在您添加了一些有效的推理,因此我删除了否决票。但是,在这种情况下,我不同意Apps Hungarian比namepaces更合适。当语言支持别名时,这是一个更合适的解决方案。参见凯文·克莱恩的答案
史蒂文·杰里斯

@Steven Jeuris,感谢您的评论。命名空间是完美的,除了它们需要长时间输入之外,我将检查您提供的链接。
NoChance 2011年
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.