Book Review of “The practice of programming” (Ⅳ)
The practice of programming
Chapter 4 Interfaces
A good programmer should always be good at designing. The essence of design is to balance competing goals and constraints. When we do programming, we need to design a friendly, portable and flexible interface.
Among the issues to be worked out in a design are:
interfaces, information hiding, resource management, error handling
These factors are not separated, but combined.
So, how to do a good designer? On the other word, how to handle the issues above perfectly?
The first step is to construct a general frame, leaving out the details. Then we need to test it by thinking of every possible situation, and improve it. By the way, it is essential for our frame to work in changeable environments. In this circumstance, we need specifications to constraint our work. Generally speaking, specifications had better be worked out in advance.
To prosper an interface must be well suited for its task-simple, general, regular,predictable, robust-and it must adapt gracefully as its users and its implementation change.
- Hide implementation details
- Avoid global variables
- Don't reach behind the user's back
- Do the same thing the same way everywhere
About Resource Management:
- Initializationma
- Maintaining state
- Sharing and copying
- Cleaning up (Free a resource in the same layer that allocated it)
To avoid problems, it is necessary to write code that is reentrant, which means that it works regardless of the number of simultaneous executions.
The text of error messages, prompts, and dialog boxes should state the form of valid input.
Charpter 5 Debugging
- Good Clues
- Look for familiar patterns
- Examine the most recent change
- Don't make the same mistake twice
- Debug it now, not later
- Get a stack trace
- Read before typing
- Explain your code to someone else
No Clues
- Make the bug reproducible
- Divide and conquer
- Study the numerology of failures
- Display output to localize your search
- Write self-checking code
- Write a logfile
- Draw a picture
- Use tools
- Keep records
- Last Resorts
This may be the time to use a good debugger to step through the program.
Non-reproducible Bugs
- Check whether all variables have been initialized
If the bug changes behavior or even disappears when debugging code is added, it may be a memory allocation error
Chapter 6 Testing
Test as You Write the Code
- Test code at its boundaries
- Test pre- and post-conditions
- Use assertions
- Program defensively
- Check error returns
- Systematic Testing
- Test incrementally
- Test simple parts first
- Know what output to expect
- Verify conservation properties
- Compare independent implementations
- Measure test coverage
Test Automation
- Automate regression testing
- Create self-contained tests
Test Scaffolds
Stress Tests
Tips for Testing
- Programs should check array bounds (if the language doesn't do it for them), but the checking code might not be tested if the array sizes are large compared to typical input.
- Make the hash function return a constant, so every elemen1 gets installed in the same hash bucket.
- Write a version of your storage allocator that intentionally fails early, to test your code for recovering from out-of-memory errors.
- Before you ship your code. disable testing limitations that will affect performance.
- Initialize arrays and variables with some distinctive value, rather than the usual default of zero; then if you access out of bounds or pick up an uninitialized variable, you are more likely to notice it.
- Vary your test cases
- Provide ways to make the amount and type of output controllable when a program is run; extra output can help during testing.
- Test on multiple machines, compilers, and operating systems.
Chapter 7 Performance
Before changing a program to make it faster, be certain that it really is too slow, and use timing tools and profilers to discover where the time is going.
In any case, times have changed, and both main memory and secondary storage are amazingly cheap. Thus the first approach to optimizing space should be the same as to improving speed: don't bother.
When you're trying to improve the speed or space consumption of a program, it's a good idea to make up some benchmark tests and problems so you can estimate and keep track of performance for yourself.
Chapter 8 Portability
Our message is this: try to write software that works within the intersection of the various standards, interfaces and environments it must accommodate. Don't fix every portability problem by adding special code; instead, adapt the software to work within the new constraints. Use abstraction and encapsulation to restrict and control unavoidable non-portable code. By staying within the intersection of constraints and by localizing system dependencies, your code will become cleaner and more general as it is ported.
Language
- Stick to the standard
- Program in the mainstream
- Be ware of language trouble spots......
Headers and Libraries
- Use standard libraries
Program Organization
- Use only features available everywhere
- Avoid conditional compilation
Isolation
- Localize system dependencies in separate files
- Hide system dependencies behind interfaces
Data Exchange
- Use text for data exch
Byte Order
- Use a fmed byte order for data exchange
Portability and Upgrade
- Change the name ifyou change the specification
- Maintain compatibility with existing programs and data
- Internationalization
Chapter 9 Notation
Regular Expressions
The best-known regular expression tool is the program grep.
Unfortunately, not every system comes with grep or an equivalent. Some systems include a regular expression library, usually called regex or regexp, that you can use to write a version of grep. If neither option is available, it's easy to implement a modest subset of the full regular expression language.
- Programs that Write Programs
Using Macros to Generate Code
Compiling on the Fly
Summary
The book generally introduces how to program practically, including the following topics:
- Style
- Algorithms and Data Structures
- Design and Implementation
- Interfaces
- Debugging
- Testing
- Performance
- Portability
- Notation
It emphasizes the practical problems we may meet in the programming. I think the most important thing is also practice, and learn by doing. Before we do, we need a general structure, a plan, a standard to help us better maintain, transmit a program. When we do, we need a good style, algorithms, and interfaces. When we finished, or half-finished, we need test, debug to improve it.
Some details need more studying because of my narrow knowledge. I'll look back this book from time to time.
That's all.
Book Review of “The practice of programming” (Ⅳ)的更多相关文章
- Book Review of “The practice of programming” (Ⅲ)
The practice of programming Chapter 3 Design and Implementation In this section, we focus on one kin ...
- Book Review of “The practice of programming” (Ⅱ)
The practice of programming Chapter 2 Algorithms and Data Structures Searching sequential search (li ...
- Book Review of "The Practice of Programming" (Ⅰ)
The Practice of Programming In the preface, the author illustrates four basic principles of programm ...
- 2015年第2本(英文第1本):《The Practice of Programming》
2015年计划透析10本英文原著,最开始选定的第一本英文书是<Who Moved my Cheese>,可是这本书实在是太短.太简单了,总体的意思就是要顺应变化,要跳出自己的舒适区,全文不 ...
- net programming guid
Beej's Guide to Network Programming Using Internet Sockets Brian "Beej Jorgensen" Hallbeej ...
- FRP represents an intersection of two programming paradigms.
FRP represents an intersection of two programming paradigms. Functional programming Functional progr ...
- [转]9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...
- 9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也作为之前三个半月的求职的回顾. 首先说说我拿到的offer情况: 微软,3面->终面,搞定 百度,3面->终面,口头of ...
- (转)9个offer,12家公司,35场面试,从微软到谷歌,应届计算机毕业生的2012求职之路
原文:http://www.cnblogs.com/figure9/archive/2013/01/09/2853649.html 1,简介 毕业答辩搞定,总算可以闲一段时间,把这段求职经历写出来,也 ...
随机推荐
- 用MathType编辑异或与非符号有什么方法
在数学中我们会遇到各种数学符号,有运算符号,希腊符号,还有表示逻辑关系的逻辑符号等,这些大多都是比较常用的符号.其中逻辑符号中我们经常会用到异或与非等,这些符号的编辑我们常常会需要用MathType这 ...
- CentOS7.0 安装 Nginx
记录下,方便以后查阅. 1.安装依赖库 yum install gcc-c++ yum install pcre pcre-devel yum install zlib zlib-devel yum ...
- 查询excel中共多少个工作表,绝对好使
用宏表函数:具体做法如下: CTLT+F3,定义一个名称,名字随便起,比如AA,公式=GET.WORKBOOK(4),确认. 然后随便一个单元格输入=AA就可以了显示有几个工作表了.
- pocket
Pocket是一个离线阅读服务软件. Pocket的主要功能就是将你要阅读或者一时没有读完的网页标记下来,接着同步到服务器端,然后你就可以在不同的设备上阅读.如果你在电脑上网的时间不多,一些东西又来不 ...
- zookeeper 事务日志与快照日志
zookeeper日志各类日志简介 zookeeper服务器会产生三类日志:事务日志.快照日志和log4j日志. 在zookeeper默认配置文件zoo.cfg(可以修改文件名)中有一个配置项data ...
- [LintCode] 有效回文串
class Solution { public: /** * @param s A string * @return Whether the string is a valid palindrome ...
- 【MarkDown】使用Html样式和折叠语法
MarkDown很方便,但基本语法有些不足:比如无法使用折叠语法,无法让文字有不同的颜色. 这些功能可以实现,不过需要使用Html语法进行扩展.这篇文章主要是整理一下这些技巧,方便更好的使用. 一.折 ...
- phpstorm 9.0最新 注册码
phpstorm注册码: User Name:newasp 01.License Key: ===== LICENSE BEGIN ===== 14617-12042010 00001xrVkhnPu ...
- JavaServlet实现下载功能
我们在项目中经常会用到下载功能,所以今天我们先说下下载功能实现的思路,然后通过一个案例代码来具体体现. 1.下载的思路: ①首先要获取我们要操作的文件对象的路径 ②然后使用获取的文件对象路径构 ...
- 使用NSKeyedArichiver进行归档、NSKeyedUnarchiver进行解档
一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序 ...