最近的一次讨论结束时嘲笑程序员的坏习惯,当他们开始用另一种语言编程时,他们过于暴露于某种语言.最好的例子是Pascal程序员开始#define begin {和#define end }开始写C.
目标是在他们开始使用C++时尝试捕捉C程序员的坏习惯.
告诉你不要遇到的大事.请回答一个建议,试图实现一种最好的.
对于那些对良好习惯感兴趣的人,请看一下这个问题的接受答案.
Phi*_*ipp 51
使用原始指针和资源而不是RAII对象.
Fra*_*eld 38
jef*_*ffm 30
声明函数顶部的所有变量,而不是尽可能接近它们的使用位置.
Bin*_*ier 19
不使用STL,特别是std :: string,
和/或
使用std :: strings并在紧凑的角落恢复旧的c字符串函数.
C J*_*son 18
Jen*_*edt 17
使用指针而不是引用
Mat*_*_JD 14
非常有经验的开发人员不理解编译甚至面向对象的编程
我开始帮助一个项目,其中一个高级人员遇到了一些过去工作但现在没有的代码问题.
(类名已被更改以保护无辜,我不记得确切的名称)他有一些C++代码正在侦听传入的消息类并阅读它们.它过去的工作方式是传递一个Message类,然后他会在其上插入一个变量,以找出它是什么类型的消息.然后,他将C-style转换为另一个他写的继承自Message的专门类.这个新类具有可以提取数据的功能.现在,这对他来说很好,但现在却没有.
经过几个小时查看他的代码,他看不出问题,我看了看他的肩膀.我马上告诉他,将C风格的消息传递给派生类并不是一个好主意.他不同意我的观点并说他多年来一直这样做,如果这是错的,那么他所做的一切都是错的,因为他经常使用这种方法.他得到了承包商的进一步支持,他告诉我我错了.他们都认为这总是有效并且代码没有改变所以它不是这种方法,而是其他破坏了他的代码的东西.
我看得更远,发现了差异.Message类的最新版本具有虚函数,之前没有使用虚拟.我告诉他们这对他们现在有一个虚拟的桌子和正在查找的功能等等......这导致他们的问题等等......他们最终同意了,我被提出了一个评论我永远不会忘记:"虚拟完全搞砸了多态性和面向对象的编程".
我向他们转发了一个装饰器模式的副本,作为如何向现有类添加一个函数但是没有从它们那里听到回复的示例.他们如何解决我不知道的想法.
Mik*_*our 10
使用C风格的演员表.
C++允许您独立选择是否允许不相关类型之间的转换,以及是否允许更改const和volatile限定符,与C相比,对编译时类型安全性有相当大的改进.它还以运行时检查为代价提供完全安全的转换.
C风格的强制转型,几乎任何类型之间的未经检查的转换,允许整个类错误,可以通过更严格的强制转换来轻松识别.如果您想要审核错误转换的错误代码,他们的语法也会使它们很难搜索.
假设程序员已经犯了试图学习C++的错误:
写作,using namespace std因为每个人都做,然后从不反思它的意义.或者知道它意味着什么,但说" std::cout << "Hello World" << std::endl;看起来很难看".
让一切都在公共场合.因此,应该是私有的数据成员不是.