代码编写过程中的心得体会,关于代码编写及实际操作的收获
五.影响本地化原则
f代码需要仔细组织和设计,这样在某处修改代码只会影响局部范围。
f当修改一个地方的代码会导致不得不修改很多文件中很多地方的代码时,修改的成本会急剧上升。
当代码中的元素具有本地影响时,阅读和理解代码会容易得多。
影响本地化是很多编程原则和设计模式的基础,比如“尽量少用全局变量”、“用多态性实现条件判断”。
五.减少重复代码
F impact本地化的一个重要方面是减少重复代码。
重复的代码使得程序庞大,难以理解和维护。
F代码的可重复性有时只有在代码已知的情况下才能发现。
减少重复代码的一个方法是将程序分成许多不同的部分,——个小语句、小方法和小类。
拆分程序可能更适合应用各种设计模式。
通过设计模式解决部分重复代码的问题。
减少重复代码的示例:
下面是一个函数:
void foo(……)
{
………… .
………………… .
…………………………………….………………………
………………………….
…………………………… .
……………………
}
上面红色的表示重复代码,您可以使用模板来减少重复代码:
例如,上面的代码可以修改为:
模板类型名称操作
无效foo(……,行动法案)
{
……………………….
行动。do something 1();
………………………………….
行动。do something 2();
}
将逻辑和数据放在一起
将数据和逻辑放在一起进行处理是影响本地化的另一个重要方面。
通常我们用类来组织数据和逻辑。
v对称
f程序中处处要体现对称性,add()函数通常伴随着remove()函数;子对象通常由同一个父对象创建和销毁;围绕同一功能的数据对象具有相同的生命周期…
F程序中的对称性是概念性的。
比如下面这段代码就不太擅长对称。
无效流程(){
input();//输入数据
//计数器递增。显然,这里的计数器是递增的,上面的输入函数和下面的输出函数是不存在的。
//在同一个层面上,显得极不对称。
数数;
output();//输出结果
}
我们可以修改上面的代码如下:
无效流程(){
input();
increment count();
output();
}
上面好像做到了对称,但还是做得不够好。为什么?
因为输入函数和输出已经隐藏了实现细节,而incrementCount明显是告诉我们把计数器加1。想到这一点,我们可以做得更好:
无效流程(){
input();
tally();//这里tally的意思是记录
output();
}
五.陈述性表达
尽可能通过陈述来表达自己的意图。
基于过程的命令式表达迫使程序读者在大脑中建立一条执行线,并和代码一起思考。
F的声明性表达式更容易阅读和理解,因为它不执行顺序和条件判断。
f典型的声明式语言:SQL——只描述得到什么,不描述如何得到。
在C语言中,重复的执行序列可以通过宏转化为表达式的声明。
一般认为宏会降低代码的可读性(对此我也有同感。我以前看《深入浅出MFC》,一开始看到前面几章都是宏就头疼),但是我们经常可以看到一些高手写的一些代码都有一些宏。C语言中的声明性表达式不仅可以减少重复代码,还可以使代码易于理解和使用。虽然宏隐藏的代码可能晦涩难懂,但宏用户一般不会在意。
v改变频率
f将变化频率相同的算法逻辑和数据组织在一起。
从数据对象的角度来看,数据对象内部的成员应该以大致相同的频率变化。
如果F的一个成员只涉及到类的某个函数,那么它很可能应该是一个局部变量。
如果F的两个成员总是一起变化,但变化率与其他成员不同,那么这两个成员应该很可能属于一个辅助对象。
例如,我们定义一个帐户类,
//设置某种货币的金额
void Account:setAmount(整数值,字符串货币)
{
this.value=value
this.currency=货币;
}
我们可以看到钱的名称和金额是同时变化的,所以我们可以定义一个钱类的对象,这个对象由钱的名称和金额组成。修改代码如下:
void Account:setAmount(整数值,字符串货币)
{
this.value=新货币(值,货币);
}
我们可以做得更好:
void帐户:setAmount(货币值)
{
this.value=value
}
其实把变化率相同的逻辑和数据放在一起也是对称的一种表现,也促进了本地化的实现。