搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
小小林熬夜学编程
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
kubelet docker read-only file system error_/bin/calico-node -felix-live -bird-live' from runt
2
【计算机视觉】OpenCV 4高级编程与项目实战(Python版)【6】:使用NumPy创建随机雪花点图像_彩色雪花像素点
3
【计算机视觉 | 图像分类】图像分类常用数据集及其介绍(九)_breakhis使用
4
opencv图像算法_opencv 图像识别
5
使用PMT和IPMT在Excel中显示贷款付款
6
都在卷鸿蒙开发,那就推荐 几个鸿蒙开源项目_鸿蒙应用开源项目
7
代码随想录day19(2)二叉树:二叉树的最大深度(leetcode104)
8
idea修改thingsboard前端页面,打包成npm,发布到centos运行_thingsboard修改前端教程
9
DVWA通过攻略之SQL注入_dvwa sql注入
10
电脑安装双系统教程,电脑安装两个系统_双系统怎么安装
当前位置:
article
> 正文
《代码大全》笔记_代码笔记
作者:小小林熬夜学编程 | 2024-03-16 02:38:44
赞
踩
代码笔记
最近将去年毕业时,大神推荐的《代码大全》看完了(已经过去一年了,要十分感谢推荐,还有凤林兄的《深入理解计算机系统》)。
零零碎碎的时间,发现很多东西虽然在书中标记了,
但是再去翻看时,还是有很多已经模糊的地方。
想来,还是需要留个笔记,供以后看看。
关于《代码大全》,
每章后边的CheckList都需要好好分析与思考,并能实际运用。
第六章
提出抽象数据类型,是进行模块化(原文为类)的基础。可以让我们只根据当前类型来理解代码,或者操作相应的功能。
良好抽象数据类型,让我们有效地隐藏一些数据以及实现的细节,同时提高程序的可读性,降低程序的复杂度(不用去关心底层具体实现),让程序更容易理解。避免使用全局数据,提高程序的可重用性。
第七章,
高质量子程序
何为子程序?
子程序是为实现一个特定的目的,而编写的一个可被调用的方法或者过程。发明子程序的作用,节省空间,提高性能。
子程序的作用,
可以降低复杂度,不必去关心子程序的具体实现。
避免代码重复,都是提高修改程序的效率(因为代码只出现一次,所以只在一处修改就可以)。
隐藏操作顺序,
隐藏指针操作,
提高可移植性,隔离硬件无代码和硬件底层代码,减少移植时需要修改的工作量。
对于子程序而言,提高子程序的内聚性是关键,而功能性的内聚性,是最有效的内聚性。
同时,好的子程序名字,提高程序的可读性,使代码更易读。更多的时候,阅读代码的次数,远远大于编写的次数。
描述子程序所做的事情,
避免使用无意义的,模糊的动词。
不仅仅通过数字来星辰不同的子程序名
合适的子程序长度一般在200以内,偶尔长的子程序,尽量不超过500行。
对于子程序的参数,尽量按照同样的顺序出现在同一个工程中,同样不把输入参数,用作工作变量(这个是经常做的事情)。使用所有输入参数。
对于宏和内联子程序,尽量不用。不到万不得已不使用,如果使用,按照子程序的方法来使用。
创建子程序的原因,
提高可读性,可靠性,可修改性,节省空间(一个次要的原因)。
第八章,
防御式编程,
原则,保证垃圾进,正确出。
检查输入参数,是最有效的方式。
其中断言是最好检查输入参数的方式。对于断言的使用要讲求方法,同时在正式代码中要避免存在断言。
在看到断言的时候,想起来自己之前使用断言的方式,
突然发现有些问题。
那个时候,总希望断言能够判断并决定是否返回值,或者不返回。
其实这里,只需要进行判断就行了。对于具体的处理,
由程序代码处理,
是返回值,或者不返回值。
当然,这里就需要,断言只是判断的代码,而没有执行的代码。
对于健壮性与正确性,是一对矛盾,根据需要,
合适的时候,选择合适的处理平衡。
断言处理,函数的前条件和后条件。
当然,对于错误处理的方式,有很多种,也需要根据需要,
选择合适的方式。
对于健壮性要求,和正确性要求,他们适合的方式,不一样。
工业类软件,及要求健壮性,也要求正确性。
要同时保证这两个。
如果可以,将断言单独做一块处理。
保证进入子函数的数据,都是正确的。
区分开发代码,和产品代码。在开发代码中,尽量采用进攻式编程,找出尽可能多的错误。
在发布的产品代码中,尽量使用防御式编程。
分级式防御。
第九章
对于伪代码编程,感觉更多的是编程前的构建,当然好的伪代码编程,可以直接将伪代码转换为注释。
对于程序的性能优化,最好的还是从高层进行优化。单独的对于一个函数,一个子程序进行优化,所起到的作用,都是有限的。
做到从迷信到理解的转变。
创建子程序是一个迭代的过程。在创建子程序的过程中,获得的认识常常会反过来影响子程序的设计。
在编程完成后,立即检查代码的成本是最小的。
第十章
关于变量的命名,使用以及初始化等内容,应该是很好的一段帮助提升代码可读性的内容。代码的逻辑性,本就复杂,如果代码的变量能够一定程度上指示此时的操作内容,可能会一定程度上提高代码的自说明性。
因为代码写的是给人读的程序,而不是给机器读的程序。
几个原则:
变量的初始化,是很关键的一项。变量在靠近第一次使用的时候初始化,既可以减小变量的作用域,又减小代码跨度,提高程序的阅读性,减少同一时间考虑的代码量。查看编译器警告,消除未初始化的变量。
因为程序读的次数,要比写的次数多,所以尽可能写出,容易读的程序。
灵活性与复杂性是一个对矛盾。绑定时间晚的程序灵活性大,但是复杂度高;绑定时间早的程序灵活性小,但复杂度低。
第十一章
好的变量名,反映的是问题,而不是解决方案。
好的变量名,是提高程序可读性的一项关键因素。
对于状态变量的命名,尽量采用能够反映状态的名称。
对于命名规则,有很多种,并没有最好的规则。采用适合的,团队使用的。
命名规则应该你呢够区分,局部数据,类数据和全局数据局。
代码阅读的次数,远远超过编写的次数。
第十二章
感觉这一章提到了很多平时忽视的细节。
尽量使用具名常量。
预防除零的情况。
C中,尽量使用强制类型转换。
避免不同类型之间的比较。同时对于浮点型的比较,不能使用等量判断,只能使用一定的精度值。
注意编译警告。
整数:
注意整数除法。
检查整数溢出,uchar型注意不超过255,uint16,注意不超过65535
检查计算中间的结果溢出。
浮点数:
避免数量级差别大的数之间运算。
避免等量判断。
处理舍入误差问题。
字符和字符串
使用具名常量,来代替神秘字符和字符串
避免off-by-one
避免使用不安全的字符拷贝函数,尽量使用strncpy(),等安全的字符串函数。
尽量使用具名常量
数组
避免下标越界
注意数组边界,避免off-by-one
在C中可以结合ARRAY_LENGTH()宏来判定数组长度。对于指针无效。
使用typedef,
第十三章
这一章,涉及了我们初学时,不经常接触,但是实际用时,却经常用的,
指针,结构,全局数据
在C,中可以将结构体当做“类”一样来使用,进而通过C,实现面向对象编程的思想。当然,会麻烦一些,但是对于所带了的可读性与可复用性,绝对是是值得的。
当然,结构体也有自己的优势:
明确数据关系,使得代码更易阅读
简化了对于数据块的操作
同时可以简化函数的参数列表(尤其当有很多变量需要传递时),
为以后的维护代码,减少工作量。
对于指针的运用尤其固有的复杂性,正确的使用指针要求你对所有编译器的内存管理机制有很好的理解。
指针的两部分:内存中的某处位置(内种中的地址),如何解释该位置的内容(指针的基类型)。
关于指针错误很难发现,也很难调试,
所以首先要避免造成指针错误,
其次编写代码后,尽快检测出指针错误。
几点方法:
把指针操作限制在子程序里,
同时声明和定义指针
在与指针分配相同的作用内删除指针(实际中,这种情况经常被违反)
使用前检查指针,
先检查指针所引用的变量,然后使用之
先填充无效数据,然后再释放的内存,
增加明显的冗余
用额外的指针变量,来提高代码清晰度。丛长久而言,代码的清晰度,远比代码的执行效率要重要。更何况,有时候这样做,还会提高执行效率。
简化复杂的指针表达式
按照正确的顺序删除链表中的指针
分配一片保留的内存后备区域
粉碎垃圾数据
在删除或者释放指针后,将他们设置为空值
在删除变量前,检查非法指针(指释放已经释过的指针,很可能会造成程序崩溃)
跟踪指针分配情况
采用非指针技术(记得以前考C二级的时候,指针还不怎么会用,就都用数组来替,竟然也都没有问题)
对于C指针而言的技巧
使用显示指针类型
避免强制类型转换
遵循参数传递的型号规则
在内存分配中使用sizeof()确定变量的大小(sizeof在编译时执行)
对于全局数据的使用要慎之又慎,只在万不得已的时候使用全局数据
全局数据减弱了模块化,增加了 耦合度,阻碍了代码重用,增加了复杂度(正好背离的软件的出发点,降低复杂度)
在使用全局数据时需要注意的:
首先吧每一个变量设置为局部的,仅当需要时才把变来那个设置为全局的。
区分全局变量和类变量
使用访问子程序(使用访问子程序还有需要需要注意的地方,这个慢慢消化)
结构体是程序更简单,更易理解,更易维护
指针很容易出错,
避免使用全局。
附:
《代码大全》推荐的几本书:
入门类:
《代码大全》
《编程珠玑》
《Software Project Survival Guide》
提高类/专业类:
《Rapid Development》
《编程精粹:编写高质量C语言代码(中文版)》
《重构:改善现有代码的设计》
工程类:
《软件工程:实践者的研究方法》
对于这些书的内容,大多数是不分语言的。
作者在《代码大全》中也一直强调深入一种语言去编程,而不是在一种语言上编程。
正确的时候,读合适的书!
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/246430
推荐阅读
article
C++
STL中
的
RB-
tree
_
stl
c++
rb
tree
...
RB-
tree
概述红黑树是平衡二叉搜索树
的
一种,其通过特定
的
操作来保持二叉查找树
的
平衡。二叉搜索树是指一个空树或者具有以...
赞
踩
article
GPU
核心
性能指标
_gpu
性能指标
...
内存科普CPU缓存分为三类,一级缓存(L1)、二级缓存(L2)和三级缓存(L3)。CPU在实际数据读取中重要的却是一级缓...
赞
踩
article
快速理解
红黑树
原理
_
红黑树
的
原理
...
红黑树
红黑树
其实就是一个二叉树。常用
的
二叉树类型简单说二叉树概念: 二叉树 又称度为至多二
的
树。 平衡二叉树平衡二叉树...
赞
踩
article
微信
小
程序
接入
直播
_
微信
小
程序
如何对接
直播
...
文章目录
微信
小
程序
接入
直播
一.
小
程序
配置1.添加/更改服务类目2.开通实时播放/录制音视频流二.云
直播
服务器1.云
直播
申...
赞
踩
article
软件
设计师
-
22
年下半年-上午
答案
...
软件
设计师
-
22
年下半年-上午
答案
软设
22
年11月上午
答案
软件
设计师
-
22
年下半年-上午
答案
...
赞
踩
article
【
ClickHouse
】
集群
安装
部署流程(踩坑解决)_[
root
@
bigdata1
clickhou...
ClickHouse
集群
安装
部署流程(防止踩坑)
ClickHouse
集群
安装
部署Fisrt1、
安装
之前1.1、SSE 4...
赞
踩
article
mmap
虚拟
映射
(
DMA
机制)_
dma
mmap
...
一:顺便看看
mmap
的
映射
程序:(吧物理内存
映射
到用户空间)直接提供驱动程序,内存
映射
提供用户程序直接访问设备内存的能力...
赞
踩
article
华硕主机安装
linux
的
Intel
,
ubuntu
intel
网卡驱动安装(华硕
B250F
GAMIN...
1 [emailprotected]:~$ sudo sudo lspci -knn2 00:00.0 Host bri...
赞
踩
article
kubenetes1.16.0 安装
helm
报错与解决办法_./.
local
-
helm
-
output
...
1. 安装Helm客户端方式一:公有云环境可以使用官方安装脚本一键安装,只需要执行如下一条命令:curl https:/...
赞
踩
article
小
程序
直播
功能
的
实现原理和简单
的
示例
代码
_
小
程序
直播
接口
...
pusherUrl: '', // 推流地址。playerUrl: '', // 拉流地址。// 创建实时音视频通话房间...
赞
踩
article
科研伦理与学术规范
期末考试
2
(40题)_《人道
实验
技术
原理
》中
首次
系统提出
3r
理论,
3r
运动最终
使
...
科研伦理与学术规范
期末考试
1(40题)
2
0
2
0.1
2
.30题目顺序可能不对,答案没问题。侵删可以下载PDF 进行搜索查...
赞
踩
article
com.
google
.
gson
.JsonSyntaxException
:
java
.
lang
.Ill...
可能的错误:1、bean类字段类型和字段名称不一致。2、服务器访问得到的字符串不是纯json前面有空格和回车等字符(难发...
赞
踩
article
HTML
5
+
app
开发学习之
IOS
打包
篇_
hbuilder
5
+ ios
打包
...
目录
IOS
离线
打包
说明
IOS
原生工程配置开发环境配置SDK目录说明
打包
准备工作配置应用标识(Bundle Identif...
赞
踩
article
小
程序
用
php
介入
直播
功能
,
微信
小
程序
直播
接入指南...
一、
功能
简介
小
程序
直播
是
微信
官方在2020年2月公测推出的产品,帮助商家在自有
小
程序
中实现
直播
互动与商品销售的闭环,打造...
赞
踩
article
初学
Android
Studio
出现的
gradle
sync
failed
_
android
stud...
刚开始学
Android
Studio
打开界面还没开始写代码,下面一片爆红,百度搜一堆都不行,暴风哭泣,就要这么被拒之门外...
赞
踩
article
小
程序
添加
悬浮
在线客服
源码
...
源码
获取方式:搜一搜 万能工具箱合集。然后点击 资料库 直接抵达获取。小
程序
添加
悬浮
在线客服
源码
...
赞
踩
article
解决
Ubuntu
不小心更新内核系统出现的问题(显卡和无线网卡失效)_/
usr
/
sbin
/
grub
-...
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、出现的问题二、
解决
方法1.选早先的内核2...
赞
踩
article
内容
提供者
ContentProvider
和
内容
解析
者
ContentResolver
_
android
内...
个人认为比较好的介绍:
内容
提供者
ContentProvider
和
内容
解析
者
ContentResolver
本文转载自htt...
赞
踩
article
USB
驱动开发之
USB
四种
传输
模式
...
转自:http://blog.csdn.net/xxxluozhen/article/details/5023543...
赞
踩
article
Android
:
内容
提供
者(
ContentProvider
)和
内容
访问者(ContentResolv...
ContentProvider
(
内容
提供
者)是
Android
四大基本组件之一。用来共享应用程序内的数据;当你需要把你应用...
赞
踩
相关标签
C++
CUDA
内存带宽
b树
算法
数据结构
微信小程序
小程序
前端
html5
职场和发展
软考
软件设计师
服务器
spark
华硕主机安装linux的Intel
kubernetes
经验分享
iOS
xcode
iOS打包
HTML5+APP
小程序用php介入直播功能
Android Studio