Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 命名类-如何避免将所有内容都称为“类”&书信电报;无论如何>;经理;?_Design Patterns_Oop_Naming Conventions_Naming - Fatal编程技术网

Design patterns 命名类-如何避免将所有内容都称为“类”&书信电报;无论如何>;经理;?

Design patterns 命名类-如何避免将所有内容都称为“类”&书信电报;无论如何>;经理;?,design-patterns,oop,naming-conventions,naming,Design Patterns,Oop,Naming Conventions,Naming,很久以前,我读过一篇文章(我相信是一篇博客文章),这篇文章让我在命名对象方面走上了“正确”的道路:在程序中命名事物时要非常谨慎 例如,如果我的应用程序(作为一个典型的商业应用程序)处理用户、公司和地址,我会有一个用户、一个公司和一个地址域类,可能还有一个用户管理器,一个CompanyManager和一个AddressManager会弹出来处理这些事情 那么你能告诉那些UserManager、CompanyManager和AddressManager做什么吗?不,因为管理器是一个非常通用的术语,适

很久以前,我读过一篇文章(我相信是一篇博客文章),这篇文章让我在命名对象方面走上了“正确”的道路:在程序中命名事物时要非常谨慎

例如,如果我的应用程序(作为一个典型的商业应用程序)处理用户、公司和地址,我会有一个
用户
、一个
公司
和一个
地址
域类,可能还有一个
用户管理器
,一个
CompanyManager
和一个
AddressManager
会弹出来处理这些事情

那么你能告诉那些
UserManager
CompanyManager
AddressManager
做什么吗?不,因为管理器是一个非常通用的术语,适用于您可以对域对象执行的任何操作

我读的那篇文章建议使用非常具体的名字。如果是C++应用程序,而 UsMeReule/Cuff>的任务是从堆中分配和释放用户,它将不会管理用户,而是保护他们的生与死。嗯,也许我们可以称之为
UserShepherd

或者,
UserManager
的工作是检查每个用户对象的数据,并对数据进行加密签名。然后我们会有一个
UserRecordsClerk

既然这个想法一直困扰着我,我就试着去应用它。发现这个简单的想法非常难

我可以描述类的功能,并且(只要我不陷入快速和肮脏的编码中)我编写的类只做一件事。我怀念的是从描述到名字的是一种名字目录,一种将概念映射到名字的词汇表

最终,我希望在脑海中有一个类似于模式目录的东西(通常设计模式很容易提供对象名称,例如工厂)

  • Factory-创建其他对象(命名取自设计模式)
  • Shepherd-Shepherd处理对象的生命周期、创建和关闭
  • 同步器-在两个或多个对象(或对象层次结构)之间复制数据
  • 保姆-帮助对象在创建后达到“可用”状态-例如通过连接到其他对象

  • 等等

那么,你如何处理这个问题呢?你有固定的词汇量吗?你会发明新的名字吗?或者你认为命名的东西不是那么重要还是错误?

附言:我还对讨论这个问题的文章和博客的链接感兴趣。首先,以下是让我思考这一问题的原始文章:


更新:答案摘要 这是我从这个问题中学到的一些小结

  • 尽量不要创造新的隐喻(保姆)
  • 看看其他框架是做什么的
有关此主题的更多文章/书籍:

  • 书籍:
  • 书籍:
  • 书籍:
以及我(主观地!)从以下答案中收集的姓名前缀/后缀的当前列表:

  • 协调人
  • 建筑商
  • 作家
  • 读取器
  • 处理者
  • 容器
  • 协议
  • 目标
  • 转换器
  • 控制器
  • 看法
  • 工厂
  • 实体
  • 水桶
还有一个很好的建议:


不要让命名瘫痪。是的,名字很重要,但它们不够重要,不能浪费大量的时间。如果你不能在10分钟内想出一个好名字,那就继续吧


熟悉(比如)定义的模式,并在这些模式之后命名对象,这让我在命名类、组织类和传达意图方面走了很长的路。大多数人都会理解这个命名法(或者至少是它的一个主要部分)。

我认为这里的关键是在代码的可视性范围内保持一致,也就是说,只要需要查看/处理代码的每个人都理解您的命名约定,那么这应该是好的,即使你决定叫他们“CompanyThingamabob”和“UserDoohickey”。如果你在一家公司工作,第一站就是看看是否有公司命名的惯例。如果没有,或者你没有为一家公司工作,那么就用对你有意义的术语创建自己的公司,把它传递给一些值得信任的同事/朋友,他们至少会随意编写代码,并纳入任何有意义的反馈


在我的书中,应用别人的习惯,即使它被广泛接受,如果它不跳到你的页面上,也是一个错误。首先,我需要了解我的代码,而不需要参考其他文档,但同时它需要足够通用,以使同行业中的同一领域中的其他人不可理解。

< P>我会考虑使用您的系统的模式,类的命名约定/编目/分组往往由所使用的模式定义。就我个人而言,我坚持这些命名约定,因为它们是其他人最有可能获取我的代码并使用它运行的方式

例如,UserRecordsClerk可以更好地解释为扩展UserRecordsClerk和CompanyRecordsClerk都实现并专门研究的通用RecordsClerk接口,这意味着可以查看接口中的方法,以了解其子类的用途

请看一本书,如《获取信息》,这是一本优秀的书,可能会帮助您明确代码的目标——如果您还没有使用它的话;o)

我认为只要您的模式选择得当并尽可能使用得当,那么相当简单的类名就足够了

具体到C#,我发现有很多关于命名逻辑的好信息

至于找到那些更具体的词,我经常使用同义词表,并跳过相关的词,试图找到一个好的词。我尽量不花钱
Universe.Instance.Galaxies["Milky Way"].SolarSystems["Sol"]
        .Planets["Earth"].Inhabitants.OfType<Human>().WorkingFor["Initech, USA"]
        .OfType<User>().CreateNew("John Doe");