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++应用程序,而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");