当前位置: 首页 > 编程日记 > 正文

《代码大全2》读后感czz

经老师推荐,买了一本《代码大全2》,花了近3个月的时间看完了,看完后觉得还有很多值得回味的地方,而且每部分之后作者还推荐了不少经典书籍。所以,作个读书心得。全书的主题是软件构建,关于软件构建问题的方方面面均有涉及,共分7个部分,从软件构建前期准备,到语言层的一些问题,再到代码完善,系统考虑以及软件工艺等等。以下分别进行简单说明。

第一部分是打好基础,本部分主要是软件构建前期的工作,以及对一些基本概念的介绍,具体包括如何选择编程语言和构建实践方法,如何理解软件开发的过程。软件开发本质上说就是工程,书中用建筑工程对其作比喻。不过由于软件产品本身的特性,使其需求产生变化的可能性很大,因而也产生一系列需要额外考虑的问题(否则的话,直接套用现在的工程方法就OK了)。

第二部分是创建高质量的程序,第三部分是变量,第四部分是语句。这三个部分是对语言层进行说明。

第二部分从整个程序的角度,包括构建类的考虑因素,创建子程序需要注意的地方,以及如何进行防御式编程。个人以为防御式编程是很重要的,不光是可以保证程序现在的正确性,同时也可以较长时期保证程序不至于出现大的问题。由于防御式编程,所以可以在出现问题之后,较快的确定问题所在甚至是处理部分问题。这个实现技术主要是异常处理机制,断言等等。实际上一个真正强大的软件大部分的逻辑应该是异常逻辑,只是解决正常工作情况的程序,不能称之为软件,其鲁棒性远远没有达到要求。

第三部分是变量,这是全书描述的最细微的单元。主要包括如果对变量命名,变量与数据的绑定时间,基本的数据类型以及一些不常见的数据类型,比如指针、全局变量等等。变量命名是有多种方法的,用哪种无所谓,关键是要统一。变量与数据的绑定时间,这个问题我以前没有系统考虑过。书中的观点是绑定时间越滞后,则系统越灵活。这个我赞同。硬编码到程序中的,是直接赋予数值的常量,除非修改源码,否则不变;编译时刻确定的,是一些静态变量;运行时间确定的,就难说了,可能是从I/O获得,也可能是从内存获得。其它是介绍基本数据类型,在此不赘述。

第四部分是语句,这是构建程序主体的基本构成单元,比变量又高了一级。这部分主要描述语句的组织结构,比如直线型、循环控制、条件控制、表驱动等。一般的方法比如条件循环等等,大部分情况下可见。表驱动,我是不常见的,应该是对程序逻辑的高度概括,并且高度灵活化。这个只在写编译器课程实践代码的时候简单运用过。

第五部分是代码改善,这部分包括以下几个主题,协同、测试、调试、重构、调整。这里的测试是开发者测试,应该是指单元测试了,现有很多合适的工具,比如NUnit、CppUnit、JUnit等等。调试主要难点在于寻找和定位问题,解决问题虽然也不容易,但需要的是远见,因为再不济,总会存在一种打补丁的方法可以临时解决问题。重构和代码调整是我近期需要关注并且不断提高自己的主题。这两个技术的运用,可以较好的弥补前期代码设计不足所带来的隐患。代码调整的目标是进行性能优化。这需要考虑方法以及后果,书中有一个很重要的观点是,往往表面看起来有效的优化却并不有效,尤其是你看似整洁不重复的代码,却还不如一个重复代码执行效率高。要达到这一步,需要在每次的调整后进行性能测试,以判定性能是否优化。

第六部分是系统考虑,这部分是对软件管理方面的考量,具体包括程序规模对构建的影响,如何去管理构建过程,如何集成模块,以及介绍软件构建的工具。这部分内容像是给Manager准备的哈,现在的我,需要在多个项目中逐步体会。

第七部分,全书最后一部分,讲述软件工艺。软件说到底,也就是一个产品,只不是产品的形式与一般不同。一部分是构建出来的可执行程序,一部分是完整的软件源码。对于源码的书写,就涉及到工艺了,不同层次的人写出来的代码是完全不一样的。水平高低暂且不论,单是注释的规范整齐程序,就可见一斑。这部分主要对代码的布局,如何写注释,个人性格对代码书写的影响等方面进行说明。全书最后一章是好书推荐。

总结到此,之后在构建方面,我需要继续关注重构和代码调整一类的内容,以及系统架构等等。

转载于:https://www.cnblogs.com/chizhenzhen/p/3761549.html

相关文章:

09-dispatch_source

dispatch_source 是BSD系内核惯有的kqueue的包装,kqueue 是XNU内核中发生各种事件时,在应用程序编程中执行处理的技术。 CPU 负荷非常小,尽量不占用资源。 dispatch_queue 和dispatch_source dispatch_source 是可以取消的,取…

如何获取boss直聘搜索牛人被屏蔽的姓名

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 玩玩boss直聘。”最近在用boss直聘,活跃度估计蛮高的。在使用牛人搜索的时候,却遇到了一个问题,就是搜出的牛人姓名是被屏蔽的,让我很是焦虑,虽然知道这种设计是直聘推广…

【Python之路】第二篇--初识Python

Python简介 Python可以应用于众多领域,如:数据分析、组件集成、网络服务、图像处理、数值计算和科学计算等众多领域。目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube、Dropbox、BT、Quora(中国知乎&…

如何实现phpcms v9_4X版本tag的伪静态?

这两个月来写的文章越来越少了,不是懒,因为太忙了--为客户赶做网站。因为客户指定要使用phpcms v9,还要求使用phpcms v9_42版本实现tag伪静态,在接手的时候phpcms v9_42是最新版本,而现在phpcms官方已经发布phpcms v9_5.X了。对于…

OC对象内存布局

OC对象的内存布局 1 每一个实例对象(Instance)内部都有一个isa指针,指向它的类对象,类对象存放着本对象的实例方法列表和成员变量列表。 2 类对象(Class)内部也有一个isa指针指向元类对象(MetaClass),元类对象存放的事…

连信的protobuf数据格式

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 连信里用到的protobuf结构。”在看本文之前,可以先进行一下回顾,之前已经对协议的框架进行了整体的介绍:连信协议整体框架看了后结合自己的分析过程,应该有个初步的了解。后续会陆续…

fileupload控件在ajax中无法使用

google得到的方法:1。http://geekswithblogs.net/ranganh/archive/2008/04/01/file-upload-in-updatepanel-asp.net-ajax.aspxThere is a better way of doing it with Ajax Control Toolkit version 3.0.30930 which works with .NET 3.5 SP1 and Visual Studio 20…

Cron表达式的详细用法

字段 允许值 允许的特殊字符 秒 0-59 , - * / 分 0-59 , - * / 小时 0-23 , - * / 日期 1-31 , - * ? / L W C 月份 1-12 或者 JAN-DEC , - * / 星期 1-7 或者 SUN-SAT , - * ? / L C # 年(可选) 留空, 1970-2099 , - * / 例子:0/5 * * * *…

01-CoreData 概述

CoreData 主要的几个类 1 概述 CoreData 是iOS 3 之后出现的一种数据持久化方案,提供了一种ORM的存储关系,CoreData 是直接将对象存储到数据库中去,也可以将数据库中的数据转化为OC对象,过程中不用编写SQL语句。 2 几个类的讲解…

连信的会话加密密钥协商过程

点击上方↑↑↑蓝字[协议分析与还原]关注我们 “ 介绍连信会话加密密钥的协商过程。” 公号内之前已经对协议的框架和协议内的数据格式进行了介绍,有需要可以回顾下: 连信协议整体框架 连信的protobuf数据格式 本文对连信的会话加密密钥协商过程进行介绍…

6、UmbracoNewsSite:添加新闻分类

上一篇做了一个简单的首页,在导航条上添加了几个新闻板块,接下来我们就添加这几个新闻板块的页面。 开始我们还是需要创建Document Types用来展示新闻列表。我们先做好规划,新闻列表只需要把新闻标题和图片展示出来就可以了,。  …

02-CoreData 的增删改查

CoreData 的增删改查 基本的增删改查的操作 1 数据库的创建 - (void)createDB {// 1.1 创建路径NSURL *modelURL [[NSBundle mainBundle] URLForResource:"AT_CoreDataDemo1" withExtension:"momd"];// 1.2 根据模型文件路径创建模型对象NSManagedObje…

Lemon开源OA

http://www.mossle.com/index.html 转载于:https://www.cnblogs.com/gzmg/p/3770882.html

UC浏览器代理流量解密

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 解密uc浏览器的安全代理流量,看看是不是真安全。”作为一个从上古网络时代过来的人,一定对UC浏览器有深刻印象,它的流量透明代理功能,就是现在的云加速功能,使用UC的服务…

JAVA07 接口与继承

一 动手实验:继承条件下的构造方法调用 1)源代码 1 public class TestInherits {2 3 public static void main(String[] args) {4 // TODO Auto-generated method stub5 6 Child c new Child();7 }8 9 } 10 11 class GrandPa…

学习-现代交换原理与通信技术

帮助学习细化。。。 首先,这书真是难读,像个词典嘛似乎《现代交换原理与通信技术》卞佳丽 北邮 呵呵 呵了个呵 不过词典也有词典的好处 第三章,数字程控电话交换与通信网络 1. 控制子系统 与 话路子系统 前者在于控制,后者在于数…

03-NSPredicate谓词

NSPredicate 谓词 在查询数据的过程中&#xff0c;给NSFetchRequest设置一个过滤条件&#xff0c;不需要讲所有的托管对象加载到内存中去。这样的话就会节省内存和加快查找速度。 一 运算符 1 比较运算符 、< 、 、> 、< 、! 比如说age>80 NSPredicate *pre […

小兵别嚣张,签名算法分析

点击上方↑↑↑蓝字[协议分析与还原]关注我们“分析unity3d游戏小兵别嚣张的签名算法。”不久前&#xff0c;写了个unity3d的引子&#xff0c;介绍了使用工具从unity3d游戏中提取出各种资源和算法&#xff1a;unity3d游戏IL2CPP相关算法简单分析不过内容很少&#xff0c;今天介…

NOIP模拟题——B

【题目描述】我们要从n种食物选m个出来&#xff0c;安排一个顺序吃掉它&#xff08;们&#xff09;&#xff0c;每种食物有个美味值ai&#xff0c;然后我们有k个规则&#xff0c;每个规则有 xi, yi 和 ci三个数&#xff0c;如果吃完第xi种食物接下来马上吃第yi种食物&#xff0…

Maven使用常用命令

> mvn clean删除target文件夹> mvn clean test编译测试代码&#xff0c;默认被放到target/test-classes文件夹下面> mvn clean compile编译主代码&#xff0c;并放到target/classes文件夹下> mvn clean package打包代码&#xff0c;我们可以看到target文件下生成了…

04- CoreData轻量级版本的迁移

CoreData版本的迁移 一 轻量级的数据迁移 例如添加新的实体&#xff0c;新的实体属性。 轻量级版本迁移方案非常简单&#xff0c;大多数迁移工作都是由系统完成的&#xff0c;只需要告诉系统迁移方式即可。在持久化存储协调器(PSC)初始化对应的持久化存储(NSPersistentStore…

通da信TCP长连接数据算法分析

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 分析通da信TCP长连接内部分数据的算法。”作为一款老牌的炒股软件&#xff0c;通da信里面的数据是相当的丰富&#xff0c;免费的也很丰富&#xff0c;准确性也很好&#xff0c;例如&#xff0c;这种股票之间关联的信息。通da信一…

产品经理怎么样用图表传达数据信息(多图)

上文有点仓促了&#xff0c;结尾没有写好。补上&#xff1a; 对劣质成本分析的时候应该注意&#xff1a; 1、在进行劣质成本分析的时候&#xff0c;要注意区分成本和必要的浪费。要注意一个关系&#xff0c;对必要浪费的控制会导致其他成本的上升。例如前文说到四小时送一次货&…

'This NSPersistentStoreCoordinator has no persistent stores 报错

可能是你改变coredata的属性项之后再运行的话在模拟器中会出现这个问题。找上面说的&#xff0c;找到mac下的模拟器中的程序路径&#xff0c;然后删掉其sqlite文件再运行就好了&#xff01;&#xff01;&#xff01;

tcp断开连接,4次握手,为什么wireshark 只能抓到3个包?

用wireshark 抓包&#xff0c;看看tcp 断开连接的过程. 以前书上说tcp断开连接&#xff0c;4次握手&#xff0c;可我为什么wireshark 只能抓到3个包&#xff1f; 百度一下&#xff0c;别人也有类似的疑问。 【求助】书上和网上的资料说&#xff0c;TCP拆除连接需要四次握手。但…

如何在python开发的GUI界面程序中恰当地使用PyExecJS

点击上方↑↑↑蓝字[协议分析与还原]关注我们“解决一闪而过的黑框的小技巧。”在使用python开发过程中&#xff0c;不可避免地&#xff0c;会开发带界面的应用&#xff0c;也会经常使用js来完成一些功能&#xff0c;比如&#xff0c;我使用python开发个了一个小应用&#xff1…

switch和case的理解

下面是复习java基础知识的时候&#xff0c;发现的一些点&#xff0c;总结下&#xff0c;备忘 int a345;switch (a) {case 23:System.out.println("23"); // break;case 345://条件符合&#xff0c;下面的case条件不会在判断&#xff0c;直接执行&#xff1b;System…

05-自己创建mapmodel自定义迁移方式

自动创建Mapping 如果模型的改变很大或者不支持轻量级数据迁移的条件&#xff0c;则我们需要进行自定义迁移。 使用映射模型 适用于更加复杂的数据的迁移 NSMappingModel 类似于数据模型 NSEntityMapping 告知迁移过程如何在目标数据存储中处理源实体的映射。 映射类型决…

Linux内核之内存管理(4)--缺页处理程序

本文主要解说缺页处理程序&#xff0c;凝视足够具体&#xff0c;不再解释。 //以下函数将一页内存页面映射到指定线性地址处&#xff0c;它返回页面的物理地址 //把一物理内存页面映射到线性地址空间指定处或者说把线性地址空间指定地址address处的页面映射到主内存区页面page上…

WebSocket协议分析

点击上方↑↑↑蓝字[协议分析与还原]关注我们“ 解析websocket数据格式。”好久不见&#xff0c;一晃一年又过去了&#xff0c;祝大家新年好运。今天&#xff0c;给大家分析一个常见的协议——WebSocket&#xff0c;这是一个标准协议&#xff0c;虽然没有HTTP历史悠久&#xff…