C++函数范式

来源:互联网 发布:工业企业数据库 编辑:程序博客网 时间:2024/05/20 17:25

C++作为一门有函数的语言,函数范式不可获取,接下来是我对C++函数定义的一些建议,有时候也许有大用呢?
说之前,我们先来看一下背景,首先,大部分IDE都支持跳转至声明这一条,而有些可以利用鼠标,直接查看函数定义以及函数四周的注释。
那么,接下来不可或缺的就是针对函数的注释了。我们先看一个如下的定义:

void cr(int*&,int,int);……void cr(int* &a,int b,int c){if(b>c){a=new int[b][c];}else{a=new int[b][c];}}

该函数的作用诸位都看得出来,创建一个二位数组,并将其指针赋值到第一个参数a上。
但是,这是一个非常非常不好的行为。
首先,这个函数的函数名就非常莫名其妙,谁知道cr是什么意思,create resources?cut rock?
因此,函数范式的第一条就是,函数名不能莫名其妙,也不能过长,比如该函数,如果使用createresources作为函数名是很不好的,因为单词太长,导致无法断开词与词之间的空格,此时,把单词中的空格改成“_”是个好办法,这样函数名就成了create_resources,好断句。
然而有时,一些更为快捷的方法是个好做法,比如,由于resource这个单词经常出现,有时适当简化也是可行的,比如create_re,又或者,在全部拼写的基础上写一个等价的简短的宏,也是非常有用的做法。
那么接下来就是关于参数的部分了。
需要重视的一点是,声明时在参数前边加上inout是非常好的做法。尽管vs丧心病狂的为in与out都加上了声明,我们就不用这样做了,直接

#define Out  ;//传入并进行修改的参数#define In  ;//传入的参数

此类空定义使得我们可以在任何位置随便添加而不会报错,因此,create_resources函数会变成这样:

void create_resources(Out int* &,In int,In int);

有时,因这看起来没什么用的声明,一个函数能被轻而易举的理解。
另外,有时候给一个类型命名多个别名也是个好主意,win就常用这种办法,所以int的别名无穷尽也。
另外,作为一个好函数,有时候加上noexcept关键字也是好习惯,但是因为函数中的new是可以引发错误的,不加为妙。
说完了声明,我们看注释。
声明旁边加上注释是个非常非常非常好的习惯,这能有效的说明函数是干什么的,哪怕是一行注释,也比一个什么都没的函数cr好的多。
接下来针对函数体我们做最后的讨论。
一个函数体最为重要的不是内容,而是格式,一个格式就可以使人发疯的函数已经完全没有了去看的价值,对于强迫症来说似乎还有修改的价值,但是我可不是强迫症。
这种完全没有tab的函数我见一个删一个,见着俩直接把库给全删了,放心我说到做到,尽管我见过的库还没一个是这样的。
自动换行和自动加tab乃是神器啊!我真的不明白为什么加个tab都不行!
另外——这个函数并没有涉及的——有些微操作旁边必须加注释,比如以下:

template<class t>void numsdie(Out t x){    x=x<<(sizeof(t)<<3);}

这玩意的意义就是把一个类的所有位清零,比如我们传入一个int型的变量m,其值为1934,我们知道sizeof返回一个类型的大小,但是按byte算而不是bit,因此左移三位也就是乘8(左移就是乘8)以后就是该类型的全部位,所有这会直接清零——
但是谁知道这什么意思啊?你告诉我nums die是什么鬼?用位操作都比这直接了当100倍啊!
所以说,有时候在旁边加上注释是个非常好的习惯,哪怕不解释过程,只有解释目的,也是极好的,毕竟一眼没有看出来这什么意思的人第二眼恐怕就再也看不出来了。
函数体中还有值得注意的一点就是资源的命名,这和函数命名差不多,只要不是abcd就足够了,弄长了反而难以理解。
最后的最后,模板作为c++不可或缺的一环,类型名字的定义并没有什么强制要求,如果有,也只用在旁边在加上一行注释就行了。
遵守这些准则,也算是往高级c++工程师的一步吧!
另外,千万不能不点收藏按钮!o(>﹏<)o不要啊

原创粉丝点击