易读程序之美学(六)~(十)

上传人:j****9 文档编号:57553942 上传时间:2018-10-22 格式:PPTX 页数:130 大小:392.66KB
返回 下载 相关 举报
易读程序之美学(六)~(十)_第1页
第1页 / 共130页
易读程序之美学(六)~(十)_第2页
第2页 / 共130页
易读程序之美学(六)~(十)_第3页
第3页 / 共130页
易读程序之美学(六)~(十)_第4页
第4页 / 共130页
易读程序之美学(六)~(十)_第5页
第5页 / 共130页
点击查看更多>>
资源描述

《易读程序之美学(六)~(十)》由会员分享,可在线阅读,更多相关《易读程序之美学(六)~(十)(130页珍藏版)》请在金锄头文库上搜索。

1、易读程序之美学(六)(十),第六章 让批注精确与简洁,批注应该要有高信息空间比,重要概念,范例: / int 是 CategoryType / pair 中的第一个 float 是 “score“ / 第二个 float 则是 “weight“ typedef hash_map ScoreMap;为什么要花三行解释?,维持批注简洁,范例: / CategoryType - (score, weight) typedef hash_map ScoreMap;这样有没有比较好?,维持批注简洁,范例: /将数据插入串行,并会先检查它是否过大它是谁,数据还是串行?/将数据插入串行,并会先检查资料是否过

2、大 /如果数据过小,就将它插入串行中,避免模棱两可的代名词,范例: /根据是否已经爬过这个URL,给予不同的优先权/给予不曾爬过的URL较高的优先权,修整草率的语句,范例: /传回这个档案的行数 Int CountLines(string filename)问题是怎样才算一行? “ “hello“ “hellon“ “hellon world“ “hellonr crueln worldr“,精确描述函数行为,范例: /计算档案中的换行位(n)个数 Int CountLines(string filename),精确描述函数行为,范例一: /从输入字符串 src 中移除 chars 前缀/字尾

3、 String strip(String src, String chars) .问题: 1.chars是会移除的子字符串,或只是个没有特定顺序的字符集合? 2.如果src的结尾有多组chars重复出现会如何?,使用具有代表性的输入/输出范例,范例一: /从输入字符串 src 中移除 chars 前缀/字尾 /范例:Strip(“abaa/a/ba“, “ab“)传回“/a/“ String Strip(String src, String chars) .这个范例好吗? /范例:Strip(“ab“, “a“)传回“b“,使用具有代表性的输入/输出范例,范例二: /重排v 让= pivot的

4、元素之前 /再回传最大的i,让vi * v, int pivot) .问题: 难以想象,使用具有代表性的输入/输出范例,范例二: /重排v 让= pivot的元素之前 /再回传最大的i,让vi * v, int pivot) .为何选择这范例?,使用具有代表性的输入/输出范例,范例: void DisplayProducts(list products) products.sort(CompareProductbyPrice);/以相反的顺序查访串行for( list:reverse_iterator it = proecuts.rbegin(); it != products.rend();

5、 +it)DisplayPrice(it-price);. ,表达程序意图,范例(重复检查): void DisplayProducts(list products) products.sort(CompareProductbyPrice);/由高到低显示所有价格for( list:reverse_iterator it = proecuts.rbegin(); it != products.rend(); +it)DisplayPrice(it-price);. ,表达程序意图,函数呼叫(大多数的函数呼叫并不需要): Connect(10, false); /这参数是什么意思?在Python

6、之类程序语言中,能以名称指定参数值: def Connection(timeout, use_encryption): #使用参数名称呼叫函数 Connection(timeout = 10, use_encryption = false),函数参数名称的批注,在C+与Java程序语言 void Connection(int timeout, bool use_encryption) #利用加上批注的参数呼叫函数 Connection(/* timeout_ms = */ 10, /* use_encryption = */ false);不要这样用: Connection(, false /

7、* use_encryption */); Connection(, false /* = use_encryption */);,函数参数名称的批注,在批注中使用通用模式或惯例之名称,能让批注更加简洁。 范例一: /这个类别包含了几个成员,这些成员储存的信息与数据库相同 /但为了速度的关系而储存在内存,当后续读取这个类别时, /会先检查这些成员是否存在,如果存在就回传成园中的内容; /否则,就读取数据库,并储存数据供后续使用。,使用讯息密集的词汇,范例一改进: /这个类别是数据库的cache layer,使用讯息密集的词汇,范例二: /移除街道名中多余的空白与其他的整理 /例如将“Avenu

8、e“转换成“Ave.“ /如此一来,万一有两个只是输入方式稍有不同的地址, /就能够用这个函数转换为相同版本,同时比较两者是否相同。,使用讯息密集的词汇,范例二改进: /正规化地址(移除额外空白、 “ Avenue“转换成“Ave.“ 等等),使用讯息密集的词汇,第二部分 简化循环与逻辑,流程控制 逻辑表示法 让程序运作的变量,讨论内容,减少程序中的心理负担,方法,第七章 提高控制流程可读性,让所有的条件判断、循环与其他改变流程的叙述尽量自然,重要概念,哪一个比较好?If (length = 10)或If (10 = length),条件式中的条件顺序,条件式中的条件顺序,If (a = b)

9、 /状况一 else /状况二 或If (a != b) /状况二 else /状况一 ,If/else区块顺序,先处理肯定条件 先处理简单的情况 先处理比较有趣或明显的情况,If/else区块顺序,范例: if (!url.HasQueryParameter(“expand_all“) respone.Render(items);. else for (int i = 0; i times.size(); i+) itemsi.Expand();. ,If/else区块顺序,范例: if (url.HasQueryParameter(“expand_all“) for (int i = 0;

10、 i = 12) ? “pm“ : “am “;if (hour = 12) time_str += “pm“; else time_str += “am“; ,?:条件式(又称三元运算符),缩短他人理解程序所需的时间,比减少程序代码行数还要好。,重要观念,范例: / 从 node 开始搜寻串行,寻找指定的 name / 不考虑大于 max_length 之后的节点 public boolean ListHasNode(Node node, String name, int max_length) do if (node.name().equals(name)return true;node

11、= node.next(); while (node != null ,避免do/while循环,程序至少执行一次。 是否继续执行由底下的条件来决定。 循环内的continue叙述很难理解do continue; while(false);可转换成while循环叙述。,do/while的问题,范例修用: / 从 node 开始搜寻串行,寻找指定的 name / 不考虑大于 max_length 之后的节点 public boolean ListHasNode(Node node, String name, int max_length) while (node != null 当max_len

12、gth = 0 或 node = null 时,也能使用。,避免do/while循环,某些程序设计认为函数只能有一个return叙述。 尽快从函数返回是比较好的做法。 强调单一跳出点的原因之一是要执行资源清除。 现代程序语言已提供更成熟的机制。,尽早从函数中返回,让程序难以追踪。 适当的使用goto会有所帮助。if (p = NULL) goto exit;.exit:fclose(file1);fclose(file2);.return;,恶名昭彰的goto,多层巢状结构程序代码十分难懂。if (user_result = SUCCESS) if (permission_result !=

13、SUCCESS) reply.WriteErrors(“error reading permissions“);reply.Done();reply_WriteErrors(“); else reply.WriteErrors(user_result); reply.Done();,减少巢状结构,原来的程序if (user_result = SUCCESS) reply_WriteErrors(“); else reply.WriteErrors(user_result); reply.Done();,减少巢状结构,修改程序代码时要以全新的角度审视,退一步以整体的角度考虑程序代码。,重要概念,

14、用尽早返回函数来消除巢状结构if (user_result != SUCCESS) reply.WriteErrors(user_result);reply.Done();return; if (permission_result != SUCCESS) reply.WriteErrors(“error reading permissions“);reply.Done();return; reply_WriteErrors(“); reply.Done();,减少巢状结构,消除循环中的巢状结构for (int i=0; iname != “) cout “Considering candida

15、t .“ endl;. ,减少巢状结构,for (int i=0; iname = “) continue;cout “Considering candidat .“ endl;. ,减少巢状结构,之前所讲都是低阶控制流程。 程序设计师也需从较高层级思考程序流程。 许多程序语言有提供幕后执行或难以追踪的机制。,能否理解程序流程?,关键在于不让这些结构占有太高的比例。,能否理解程序流程?,第八章 分解巨大表示式,将巨大表示式分解为更容易消化的大小,重要概念,范例:if line.split(:)0.strip() = “root“:.这样好吗?username = line.split(:)0.strip() if username = “root“:.,解释性变量,范例 if (request.user.id = document.owned_id) / 使用者可以编辑的文件 . if (request.user.id != document.owned_id) / 文件状态是只读 .,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号