《代码大全2》第六、七章

作者在第六章中从抽象数据类型(Abstract Data Type)出发阐释类(class)的概念,给出创建类的原因以及创建高质量的常涉及的设计问题。抽象数据类型(ADT)是指一些数据以及对这些数据所进行的操作的集合,ADT是一个比类更基础的概念,类由ADT出发得到扩展,或者说,类是ADT的实现形式之一。ADT概念是与本书前文中的整体抽象概念一脉相承的,使用ADT可以隐藏实现细节,更容易提高性能,让程序更具有自我说明性(self-explanatory),这都是从管理复杂度的基本任务出发的。

那么在什么情境下我们应该选择创建一个类呢?本书作者总结了诸多合理原因例如对现实世界中的对象或抽象对象建模、降低及隔离复杂度、隐藏全局数据、限制变化所影响的范围、实现中心控制点、让代码易于重用和重构等等。创建具有良好抽象的类接口对于创建一个高质量的类至关重要。在一个良好抽象化的类接口中,每一个子程序都朝着一致的目标工作;反之,没经过良好抽象的类混杂着各种子程序,内聚性差。封装是一个比抽象更强的概念,抽象提供一个让程序员忽略实现细节的模型,而封装强制阻止程序员看到细节。良好的封装会尽可能地限制类和成员的可访问性,避免把私用的实现细节放在类的接口中。

相比起ADT,类还衍生出继承和多态两个概念。在书中作者重点讨论了继承的优势和危险。继承的目的在于“定义能为两个或多个派生类提供共有元素的基类”,但如果使用不当,继承会大幅增加程序的复杂度。作者建议慎用继承,避免让继承体系过深,把公用的接口、数据和操作放到继承树中尽可能高的位置。

另外在设计和实现类时,要保持类与类之间较为松散的耦合,对其他类的子程序的简介调用要尽可能的少,避免创建万能类,消除无关紧要的类。而在一个类内,如果可能,应该在素有构造函数中初始化所有的数据成员,优先采用深层副本。

第七章就如何编写高质量的子程序展开讨论。子程序是为了实现一个特定的目的而编写的一个可被调用的方法或过程,例如C++中的function, Java中的method。子程序可以避免代码的重复,引入中间、易懂的抽象,简化复杂的逻辑判断,隔离复杂度,提高整个程序的可移植性。在子程序层上的设计,作者阐述了几种内聚性,其中被最好的一种内聚性是功能上的内聚性,也就是说,令子程序实现的功能专一化。紧接着是一些在代码编写过程始终存在的问题:如何给变量取个好名字?子程序可以写多长?如何使用子程序参数?等等。作者给出了相当详实的建议和例子,此处不一一列举。最后作者对函数和过程的概念进行了辨析,并指出使用宏子程序和内敛子程序应该注意的问题。

《代码大全2》读书笔记 Week3的更多相关文章

  1. 代码的未来读书笔记<二>

    代码的未来读书笔记<二> 3.1语言的设计 对Ruby JavaScript Java Go 从服务端client以及静态动态这2个角度进行了对照. 这四种语言因为不同的设计方针,产生了不 ...

  2. 《第一行代码 android》 读书笔记:找出当前界面对应的Activity

    在android开发中找出当前界面对应的Activity,步骤如下: 新建一个BaseActivity继承自Activity,然后在BaseActivity中重写onCreate()方法,通过getC ...

  3. 《Linux命令行与shell脚本编程大全》- 读书笔记1 - 基本的bash shell 命令

    这本书买了好久了,除了刚到手的那几天翻看了一下以外,竟然到今天都没有看过.突然想要写一个shell脚本,发现什么也不会,是时候开始学习了,今天先把最简单的一章再看一遍顺便做一些笔记,明天继续后面的! ...

  4. 软工读书笔记 week3 (《黑客与画家》上)

    一.何谓黑客? 黑客,在我们大多数普通人眼里,就是入侵计算机的人,通常还与干坏事挂钩.而书中告诉我们,这 并不是它的真正含义.而要想理解这本书,就要首先理解什么是黑客. 黑客这个词最初起源时,完全是一 ...

  5. 【代码大全2 学习笔记】ADT 抽象与封装

    ADT abstract data type 抽象数据类型 要理解面向对象编程,就要先理解ADT这个概念.不懂ADT的程序员开发出来的类只是名义上的"类"而已--只是单纯的把一些相 ...

  6. 《Linux命令行与shell脚本编程大全》- 读书笔记3 - 理解shell

    当用户登录终端的时候,通常会启动一个默认的交互式shell.系统究竟启动哪个shell,这取决于用户配置.一般这个shell都是/bin/shell.默认的系统shell(/bin/sh)用于系统sh ...

  7. 《Linux命令行与shell脚本编程大全》- 读书笔记2 - 更多的bash shell命令

    更多的bash shell命令 想检测进程,需要熟悉ps命令的用法.ps命令好比工具中的瑞士军刀,它能输出运行在系统上的所有程序的许多信息.默认情况下,ps命令只会显示运行在当前控制台下的属于当前用户 ...

  8. 《Linux命令行与shell脚本编程大全》读书笔记

    第一章:初识Linux 1.linux可划分为四个部分:内核.GNU工具.图形化桌面环境.应用程序 2.内核主要负责:系统内存管理.软件程序管理.硬件设备管理.文件系统管理 3.内核的系统内存管理,有 ...

  9. 《代码大全》阅读笔记-33-个人性格(personal character)

    很多好的编程做法都能减轻你的大脑灰质细胞(指脑力)的负担. 将系统"分解",是为了使之易于理解("设计的层次"). 进行审查.评审和测试正是为了减少人为失误.如 ...

随机推荐

  1. shell 跟踪命令

    添加跟踪 set -x 去除跟踪 set +x

  2. 数据结构与算法简记--Trie树

    Trie树 概念 多叉树,节点为字符串中的单个字符. Trie 树的本质,就是利用字符串之间的公共前缀,将重复的前缀合并在一起. 将多个字符串按字符拆分插入Trie树,用于字符串查找,关键词提示等 举 ...

  3. webservice的使用-axis1-02

    1.webservice传递javabean 自定义javabean必须是可序列化的 如果javabean中有内部类必须是静态的,因为只有静态的类才可以序列化 如果javabean中用到了其他的jav ...

  4. LLppdd's class meeting!

    LLppdd's class meeting! Time Limit: 1 s Memory Limit: 256 MB 题目背景 LLppdd 有一个可爱团结的班级,他们会定期举行班会活动...比如 ...

  5. 【知识强化】第五章 输入/输出(I/O)管理 5.2 I/O核心子系统I

    学习I/O核心子系统相关的一系列功能. 设备独立性软件.设备驱动程序.中断处理程序这三层其实是属于操作系统的内核部分的,所以它们也称作“I/O核心子系统”,又可以简称为“I/O系统”.在考研当中我们需 ...

  6. 2018-2-13-win10-uwp-网络编程

    title author date CreateTime categories win10 uwp 网络编程 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17: ...

  7. 2018-8-10-win10-uwp-json

    title author date CreateTime categories win10 uwp json lindexi 2018-08-10 19:16:53 +0800 2018-2-13 1 ...

  8. Linux上安装JDk教程

    使用如下命令 uname –a.如果输出结果中含有X86_64,表明系统是64位的,如果出现i686,证明系统是32位的. 没有安装包,就去官网下载 http://www.oracle.com/tec ...

  9. 笔记66 Spring Boot快速入门(六)

    SpringBoot中使用Mybatis 一.注解方式 1.创建映射文件CategoryMapper.java 使用注解@Mapper 表示这是一个Mybatis Mapper接口.使用@Select ...

  10. vue之ref

    ref 被用来给元素或子组件注册引用信息.引用信息将会注册在父组件的 $refs 对象上.如果在普通的 DOM 元素上使用,引用指向的就是 DOM 元素:如果用在子组件上,引用就指向组件. 1.ref ...