第1章 软件开发的任务 1
1.1 草拟任务 2
1.2 保留公司的知识 4
1.3 创建过程的标准化 5
1.4 错误处理编码 6
1.5 灵巧编码 7
1.6 鉴别这种可能性 8
1.7 实现这种可能性 9
1.8 灵巧编码三角 10
1.9 实现任务的障碍 11
第2章 理解任务的障碍 13
2.1 Visual Basic错误处理编码 14
2.2 为什么好的错误处理编码很少能实现 15
2.2.1 样本代码将注意力放在了功能上 15
2.2.2 错误处理编码不具魅力 15
2.2.8 错误处理编码不可能正确地分别实现 16
2.2.7 错误处理编码需要大量的代码 16
2.2.9 错误处理编码在最终产品中是不可见的 16
2.2.4 错误处理编码难以实现 16
2.2.6 错误处理编码被认为是不言而喻的 16
2.2.5 错误处理编码被看作是辅助性的 16
2.2.3 错误处理编码难以掌握 16
2.2.10 错误处理编码是首先被节省的部分 17
2.2.11 如果确实节省了错误处理编码部分会怎样? 17
2.2.12 即使后来出现了错误,当它们出现时总是可以被修复 17
2.2.13 管理设立了障碍 17
2.2.14 认为代码是一次性的 17
2.3 “我们将适应” 18
2.4 获得好的错误处理编码 19
2.5 错误处理编码的障碍 19
2.6 评估错误处理编码 20
2.7 代码标准化的障碍 21
2.8 代码重用的障碍 22
2.9 消除障碍 22
第3章 有效错误处理编码的实现 23
3.1 提高我们的期望 24
3.2 尽早处理错误 24
3.3 随时进行错误处理编码 26
3.4 预料错误 28
3.5 预防错误 29
3.6 处理错误 30
3.7 捕获错误 30
3.8 报告错误 31
3.9 避免假设 33
3.9.1 我将再也不需要使用这些代码 33
3.9.2 我是唯一接触到这些代码的人 33
3.9.3 我仅仅为一个特殊的情况而设计它 33
3.9.4 一般编码假设 33
3.10 为重用设计函数 34
3.11 重用错误处理编码 34
3.12 系统化错误处理编码 35
第4章 显式编码 37
4.1 显式变量的用法 38
4.1.1 永远使用Option Explicit 38
4.1.2 显式地指出变量类型 40
4.1.3 避免Deftype语句 41
4.1.4 使用指定的数据类型 42
4.1.5 初始化所有变量 42
4.1.6 一行使用一个变量 45
4.1.8 使用枚举 46
4.1.7 使用TypeName、VarType及TypeOf 46
4.2 参数 47
4.2.1 永远使用ByVal或ByRef 47
4.2.2 显式地指明参数的类型 48
4.2.3 为可选参数设置显式缺省值 49
4.2.4 验证所有参数 50
4.2.5 使用命名的参数 51
4.3 数组 52
4.3.1 永远不要假设数组的下界 52
4.3.2 不要硬编码数组的界 53
4.3.3 避免使用Option Base 55
4.4 编码建议 55
4.4.1 永远包括Else 55
4.4.2 避免使用缺省属性 57
4.4.3 避免在表达式中混合使用数据类型 57
4.4.4 使用常量(Constant) 58
4.4.5 避免使用操作符优先级 58
4.4.6 检查字符串长度 59
4.4.7 关闭所有打开的对象 61
4.4.8 设置对象为Nothing 61
4.4.9 永远显示地关闭错误捕获 62
4.4.10 永远不要对外部世界做任何假设 64
4.4.11 不要剪切并粘贴 64
4.4.12 正确使用+和 65
4.4.13 伪代码 65
4.4.14 在运行时设置属性 65
4.5 基本原则:显式编码 66
第5章 错误处理编码机制 67
5.1 错误处理编码并非是一种假设 68
5.2 Visual Basic错误处理 69
5.3 没有错误处理 69
5.4 错误处理器 70
5.5 On Error Resume Next 70
5.6 错误抑制 71
5.7 On Error Goto 72
5.8.1 Resume 73
5.8 恢复程序执行 73
5.8.2 Resume Next 74
5.8.3 Resume line 75
5.9 多个错误处理器 76
5.10 检查错误 76
5.11 检查Err.Number 78
5.12 处理错误 80
5.13 清除Error对象 80
5.14 关闭错误处理器 82
5.15 错误处理的范围 83
5.16 错误冒泡 87
5.17 错误中的错误 88
5.18 修改错误处理器 90
5.19 错误捕获 91
5.20 错误捕获处理器 92
5.21 内联处理错误 93
5.22 引发错误 94
5.23 错误捕获块与内联错误处理器 94
5.24 何时使用错误捕获块 95
5.25 何时使用内联错误处理 96
5.26 完全避免错误处理 97
第6章 错误预防 99
6.1 错误类型 100
6.1.1 程序错误 100
6.2 预防的种类 102
6.3 预防编码错误 102
6.1.2 逻辑错误 102
6.3.1 长远考虑 103
6.3.2 为他人编写 103
6.3.3 防御性编码 103
6.3.4 攻击性编码 105
6.3.7 同一个地方不能跌倒两次 107
6.3.8 不要修复同一个错误两次 107
6.3.6 雅洁性预防技术 107
6.3.5 避免错误抑制 107
6.3.9 重用 108
6.3.10 标准化 109
6.3.11 包装系统函数 109
6.3.12 不要对预防使用错误捕获 110
6.4 预防用户错误 111
6.4.1 程序设计的三条基本原则 112
6.4.2 使用显式方式 113
6.4.3 精炼所做的设计 113
6.4.4 使用户界面清晰 114
6.4.5 使消息清晰 115
6.4.6 过滤用户输入 116
6.4.7 确认用户输入 116
6.4.8 使用控件数组 118
6.4.9 选择正确的控件 118
6.4.10 包装控件 118
6.5 窗体预防习惯 119
第7章 安全编码框架 121
7.1 可重用性例程 122
7.2 安全过程 122
7.3 安全函数 125
7.3.1 忽略错误 125
7.3.2 报告错误 126
7.3.3 传回错误 126
7.3.4 返回一个新的错误 127
7.3.5 添加检查跟踪 127
7.4 安全错误消息 128
7.3.6 处理错误 128
7.5 防御函数 129
7.6 防御子例程 131
7.7 安全类 131
7.8 重用SPF程序 133
7.9 自完备程序 133
7.10 代码块 133
7.12 参数 134
7.11 命名约定 134
7.13 限定范围 136
7.14 计数器变量 136
7.15 修订版编号 136
7.16 可重用性文档 137
7.16.1 过程头 137
7.16.2 注释头示例 138
7.16.3 版本历史注释 139
7.17 清除 139
7.18 使用SPF 139
7.19 实现标准 140
第8章 SPF实例 141
8.1 通用结构 142
8.2 安全错误应用 144
8.2.1 创建安全错误消息 144
8.2.2 在安全错误消息中统计错误 145
8.2.3 分析安全错误消息 146
8.2.4 报告安全错误消息 148
8.3 数组处理 150
8.3.1 获得数组下界 150
8.3.2 获得数组的两个界 151
8.3.3 获得数组计数 152
8.4 类型转换和数据验证 153
8.4.1 转换字符串 153
8.4.2 转换日期 154
8.4.3 转换数字 155
8.4.4 验证数字 156
8.5.1 安全Len包装程序 157
8.5 字符串处理 157
8.5.2 SSN格式 159
8.6 窗体和控件 162
8.6.1 判断窗体是否载入 162
8.6.2 卸载所有窗体 163
8.6.3 设置焦点 164
8.6.4 确定调整大小安全 165
8.6.5 拷贝List控件 166
8.7.1 格式化SQL字符串 167
8.7 数据库例程 167
8.7.2 检查游标的位置 169
8.7.3 编辑域 171
8.8 使安全过程正常工作 173
第9章 团体策略 175
9.1 灵巧编码团队 176
9.2 合作的竞争 176
9.3 开发自己的标准 178
9.5 动机催化 179
9.4 创建安全过程 179
9.6 认证可重用 180
9.7 共享被认证的过程 181
9.8 使用超级库 181
9.9 奖励永久的贡献 181
9.10 通过认证检查代码 182
9.11 适应性开发 182
9.12 消除非技术的障碍 183
9.13 还差一步! 184
第10章 编程体系 185
10.1 程序失败的方式 186
10.1.1 结束失败 186
10.1.2 执行失败 186
10.1.3 维护失败 186
10.2 串珠程序 186
10.3 可维护性 187
10.4 维护噩梦 189
10.7 叶和层 190
10.5 隐式事务逻辑 190
10.6 体系结构的量度 190
10.8 普遍的分层结构 192
10.8.1 用户层 192
10.8.2 事务层 193
10.8.3 数据层 193
10.8.4 用户连接层 193
10.8.5 数据库层 194
10.8.6 数据连接层 194
10.9 可重用层 194
10.10 分层的流 195
10.11 分层与绑定 196
10.12 分层与类 197
10.13 分层与级 197
10.14 层打包 197
10.15 配置层 198
10.16 分层的优点 198
10.17 学习分层实例 199
10.18 数据集 200
10.19 不受技术变化的影响 201
10.20 实现分层的应用程序 202
第11章 设计分层的应用程序 203
11.1 数据库 205
11.2 规划数据库 205
11.3 映射控件 206
11.4 创建层 208
11.5 伪编码用户层 208
11.5.1 Form_Load 209
11.5.2 Students_Click 210
11.5.3 Cutomers_Click 210
11.5.4 编辑域 211
11.5.5 保存变化 211
11.5.6 添加和删除 212
11.6.1 显示数据集 213
11.6 伪编码事务层 213
11.6.2 显示被计算的域 215
11.6.3 改变数据集中的数据 217
11.7 数据层的方法 218
11.8 用户连接层的方法 219
11.9 数据连接层的方法 219
11.10 分层应用程序的优点 220
11.11 创建一个安全的分层库 220
11.12 使用层包装控件 221
11.13 实际应用 222
第12章 完成任务 223
12.1 获得全方位视图 224
12.2 评价成功 226
12.3 进行下一步 226
12.4 继续前进! 227
附录A 命名约定 229
附录B SPF检查表 233
附录C 认证评价单 237