您的位置:首页 > 编程语言

读书笔记之《代码之髓》 1

2015-07-13 16:48 253 查看
1,“这样写更自然,那就规定这样写吧。规定这东西唾手可得”



----------竹内郁雄

所以其实这些规定并不具有普遍意义,只是因为在当前特定情况下,做此规定能更方便。

2,这些规定也可能自相竞争,比如

vector<vector<int>> x; 是错的,因为>>会被认为是移位运算符

应该写成 vector<vector<int> > x, 也就是以增加空白符的方式来避免。

3,需要限制goto的使用,甚至只使用限制过后的break和continue。

4,for语句是让数值渐增的while语句更简洁。比如

for(i=0;i<N;i++){

printf(“%d\n",i);i

}

用while写如下:

i=0;

while(i<N){

printf(“%d\n",i);i

i++;

}

可见,用while写后,循环外写i=0,循环条件写i<N,循环体内i++;实现一个功能的代码分散在三处,这很明显是很不好的。不利于代码阅读和修改。

5,foreach语句使for语句更加简洁,比如对于数组items[] 的操作

for(int i=0;i<items.length;i++){

int item=items[i];

system.out.println(item);

}

foreach语句

for(int item:items){

system.out.println(item);

}

更加简洁易懂~

6,变量的诞生,就是为了用字符串替代数值来表示存储了某个值的内存的位置。

而函数,也就是用便于理解的字符串取代数值,来表示操作开始时内存的位置。(内存的16进制地址码难以理解)

7,实现跳转指令是简单的,但早期时,这要求调用者必须同时知道跳转目的地和返回命令地址,这是很难办到的。所以改良如下-----》

创建用来事先记录返回目的地的内存空间,并设计能跳转到该内存空间里记录的地址的命令。这样在函数返回时,只需返回到这一固定空间中存放的地址即可。(然而这有一个问题,若嵌套调用函数,则会导致那固定空间中内容被覆盖)于是又改良-----》

使用栈

8.递归的处理

首先,递归结构是常见的,无法回避

而已有方法不能适当解决递归。比如对于列表【1,【2,3】,4】,想取出各数之和。

一种方法是用二重for循环

def total(xs):

result=0

for x in xs:

if is_integer(x):

result+=x

else

for y in x:

if is_integer(y)

result+=y

else

#若再来一个列表又该如何处理呢?

return result

可见,对于这段程序,递归结果若变成3层或其他层数,将导致for循环继续增加,代码可读性就很差了

而递归则解决此问题~

9.对于错误的处理有两种思想:1)利用函数返回值做判断 2)出错时跳转

第1)种有如下问题:可能遗忘对错误的检查,无论如何都会导致代码的可读性下降。

而如何增加可读性?考虑将对错误的处理与函数逻辑的代码分开。即出错时跳转到错误处理代码。

第2)种最早的表现是中断。接着是COBOL语言设计了两种类型的错误处理机制,但只那两种错误可以被识别,程序员不可以自行增加其他希望识别的错误。

接着PL/I语言允许了程序员自行定义新错误,并且实现了统一的错误处理。更棒的是,它允许程序中主动触发错误。 (想想,这里的错误处理与事件处理是多么相像,而且当时的抛出异常使用的都是signal,而不是throw。 而c++只所以使用throw这个关键词,只是因为它的signal已被使用过)

10.1975年,john goodenough提出:程序员有可能编写不正确的异常处理,而为使编译器对程序员的错误发出警告,可以采用如下策略。1)明确声明命令可能抛出的异常,2)需要有将可能出错的操作括起来的语句结构。

大部分语言利用try和catch实现了第2)种策略。而微软加入了finally关键词,为了让程序只有一个出口。因为,一个被调用的程序可能在入口处执行了lock(),如果在多处都有抛出异常的可能性,那么在很多个地方都有可能跳出这个函数,此时要无遗漏地在每个异常点都执行unlock就变得非常困难。

C++没有finally关键词,但它也可以解决finally解决的问题。它是通过resource acquisition is initialization的技术。比如文件是一种资源,并且是一种在操作中打开就要在操作后关闭的资源。所以定义了操作文件的类,在构造函数中打开,在析构函数中关闭。(或许会更为优雅,但析构时若忘记释放文件不也有可能么?有无强制检查?)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: