可能的重复: *.h或*.hpp用于类定义 正确的c++代码文件扩展名?.cc vs .cpp

我曾经认为它是这样的:

.h文件是C和c++的头文件,通常只包含声明。 . C文件是C的源代码。 .cpp文件是c++源代码(也可以是C源代码)。

然后出现了。hpp、。cc和。cxx这样的文件,我完全搞糊涂了……它们之间有什么区别?什么时候使用“新的”?

分支名称中哪些字符是非法的?

我发现在c#中可以用“@”字符开始变量名。 在我的c#项目中,我使用了一个用Java编写的web服务(我在我的项目中添加了一个web引用)。WSDL中定义的一个接口对象有一个名为“params”的成员变量。显然,这在c#中是一个保留词,所以你不能有一个类的成员变量名为“params”。生成的代理对象包含一个如下所示的属性:

public ArrayList @params {
    get { return this.paramsField; }
    set { this.paramsField = value; }
}

我搜索了VS 2008 c#文档,但没有找到任何关于它的东西。而且搜索谷歌也没有给我任何有用的答案。那么“@”字符在变量/属性名中的确切含义或用途是什么?

两者似乎都被用于web开发领域,例如HTML5 Cross Browser Polyfills,它说:

所以我们在这里收集所有的垫片、备用材料和填充物……

或者,还有es5-shim项目。

在我目前的项目中,我们使用了许多这些,我想把它们都放在同一个目录中。所以,我应该叫这个目录——垫片,还是填充物?

我知道@符号可以用在字符串文字之前,以改变编译器如何解析字符串。但是,当变量名的前缀是@符号时,这意味着什么呢?

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

例如,如果我的应用程序(作为一个典型的商业应用程序)处理用户、公司和地址,我会有一个User、一个Company和一个Address域类,并且可能会在某个地方弹出一个UserManager、一个CompanyManager和一个AddressManager来处理这些事情。

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

我读到的文章建议使用非常具体的名称。如果它是一个C++应用程序,而UserManager的任务是分配用户并将其从堆中释放出来,那么它不会管理用户,而是保护用户的出生和死亡。嗯,也许我们可以称之为UserShepherd。

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

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

我可以描述这些类做什么,(只要我不陷入快速和肮脏的编码)我编写的类只做一件事。我错过了从描述到名称的一种名称目录,一种将概念映射到名称的词汇表。

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

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

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

注:我还对讨论这个问题的文章和博客的链接感兴趣。首先,这是一篇让我思考的原创文章:在没有“管理器”的情况下命名Java类


更新:答案摘要

下面是我从这个问题中学到的一点总结。

尽量不要制造新的隐喻(保姆)看看其他框架做什么

关于此主题的更多文章/书籍:

你发现自己经常在课前加上什么名字?命名类的最佳方法是什么?书:设计模式:可重用面向对象软件的元素(精装本)书:企业应用程序架构的模式(精装本)书:实现模式(平装)

以及我(主观地)从答案中收集的当前名称前缀/后缀列表:

协调员建设者作家读者处理程序容器协议目标转换器控制器看法工厂实体水桶

还有一个很好的建议:

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