搜索
查看
编辑修改
首页
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
点云半径滤波去噪数据_点云半径滤波c++实现
2
Android构建系统——Android.mk——Android.bp_android android.mk与android.bp
3
Ubuntun使用ISO镜像中的软件包作为本地镜像源_ubuntu iso镜像源
4
linux 配置C/C++环境(gcc-12.1 cmake gdb-12.1)_linux g ++环境变量配置
5
@getmapping @postmapping @requsetmapping_use precise mapping annotation, i.e. '@getmapping'
6
selenium 选定ul-li下拉选项中某个指定选项_selenium 处理ul菜单li
7
安装 | Anaconda3下载链接_anaconda3下面链接
8
Gradle引用本地Jar包_gradle引入本地jar包
9
一场AI“革命”开始,OpenAI文生视频模型Sora_sora配置要求
10
C语言控制台实现进度条_c语言控制台下载进度条源码
当前位置:
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
helm
安装...
它基于一定的模板规范、目录结构和文件格式进行打包后的 tar 和 gzip 压缩包(并且可选签名) ,
helm
最核心的就...
赞
踩
article
Clickhouse
安装
部署及简单
使用
_
clickhouse
安装
和部署和
使用
...
clickhouse
安装
部署_
clickhouse
安装
和部署和
使用
clickhouse
安装
和部署和
使用
...
赞
踩
article
linux
的
php
探针
使用
,
php
探针
在
Linux
下
的
安装过程...
在我们之前
的
文章中,我们只给大家介绍了
php
探针
的
如何
使用
,以及
使用
方法!那么我们如何来安装
php
探针
呢?还是在Linu...
赞
踩
article
usb
的
hub
分析_
usb
hub
分析...
1:在入口函数
usb
_init调用
hub
的初始化retval =
usb
_
hub
_init();int
usb
_
hub
_...
赞
踩
article
开发小记-
Content
Provider
获取
调用者
包名_
contentprovider
获取
调用者
...
最近公司开发的程序有个需求,系统桌面调用了我们的provider,要给provider加上权限只让桌面调用,本来是个很小...
赞
踩
article
微信小
程序
开发
--
分类
页面
实现_微信点餐小
程序
中
分类
页面
的样式怎么做...
微信小
程序
开发–
分类
页面
实现之前在详情
页面
利用Vant Weapp的UI库构建出了GoodsAction 商品导航功能,...
赞
踩
article
kubernetes
的三种探针
startupprobe
,
ReadinessProbe
,Livenes...
kubernetes
的三种探针_
startupprobe
startupprobe
...
赞
踩
article
鸿蒙
hdf
框架
,HarmonyOS
HDF
驱动
框架
---
驱动
服务
管理...
驱动
服务
管理
驱动
服务
是
HDF
驱动
设备对外提供能力的对象,由
HDF
框架
统一管理。
驱动
服务
管理主要包含
驱动
服务
的发布和获取。...
赞
踩
article
hbuildx
&&
微信
开发者
工具
-
微信
小
程序
测试_
hbuilder
清除缓存...
微信
小
程序
测试的环境搭建,整体流程是: 1.安装
微信
开发者
工具
2.登录
微信
开发者
工具
3.安装
hbuildx
4.导入...
赞
踩
article
红黑树
的
理解
与
编写
(
c++
实现)
_
c++
手写
红黑树
...
红黑树
的
理解
与
c++
编写
基础性质
红黑树
是一种二叉搜索树,并且相对于二叉搜索树做了一定
的
改进。
红黑树
具有下列五种性质:根...
赞
踩
article
鸿蒙
体验
手册
,
鸿蒙
内核移植
手册
之
安装
驱动程序
...
截取自:HarmonyOS内核liteos-a开发
手册
第三篇:体验
鸿蒙
内核Liteos-a1.2
安装
驱动程序
下载“10...
赞
踩
article
云计算 3月11号
(
NFS
远程
共享
存储及
vsftpd
配置
)...
NFS
:Network File System 网络文件系统,
NFS
和其他文件系统一样,是在 Linux 内核中实现的...
赞
踩
article
Android
Studio
出现
APP
闪退问题(My
Application
keeps
stopp...
我重新看来一下自己的代码,发现activity_main.xml文件里面少写了Button的定义,但是对应的java文件...
赞
踩
article
最新
微信
小
程序
端
直播
功能
开发
流程,
小
程序
直播
组件接入指引_
微信
开发
者工具实现
直播
...
最新
微信
小
程序
端
直播
功能
开发
流程,
小
程序
直播
组件接入指引_
微信
开发
者工具实现
直播
微信
开发
者工具实现
直播
...
赞
踩
article
ubuntu18.04
内核
自动更新
导致
驱动
掉了
_
万兆网卡
升级
内核
掉
驱动
...
环境:CPU:i5-8400@2.8GGHz*6–64 位GPU:GeForce GTX 1060 6GB推荐显卡
驱动
...
赞
踩
article
android
学习:使用它
ContentProvider
获取其他程序共享的
数据
_
android
怎么
...
一、这里通过getContentResolver()方法获取联系人的姓名,详情看文档,和从
数据
库中读信息相似,其实我也没...
赞
踩
article
[连接
HarmpnyOS
]-使用 ADB+
USB
进入华为
鸿蒙
系统_
鸿蒙
adb
命令
查看
系统文件
...
通过
命令
行和数据线进入手机
鸿蒙
操作系统关于数据线知识
USB
数据线扫盲华为 nova 4
鸿蒙
手机成功连接华为的Harm...
赞
踩
article
人工
智能
大
模型
即服务时代:
智能
教育
的智慧
学习
_
人工
智能
大
模型
即服务时代:
智能
教育
的个性化
学习
...
1.背景介绍近年来,随着移动互联网、物联网等新型技术的快速发展,
智能
化程度已经不断提升,人们生活节奏也在加快。
智能
教育
便...
赞
踩
article
ubuntu 可以连接无线网络但是连接不上有线网络_
intel
corporation
device
...
问题描述: 博主是双系统电脑,Windows可以正常使用有线网络,Ubuntu却无法使用,也没有图标问题解决:认为Ubu...
赞
踩
article
【
javaWeb
微服务架构
项目
——乐优商城
day03
】——(搭建
后台
管理
前端,
Vuetify
框架
,使...
0.学习目标
使用
资料搭建
后台
系统会
使用
nginx进行反向代理
实现
商品分类
查询
功能掌握
cors
解决跨域
实现
品牌
查询
功能1....
赞
踩
相关标签
kubernetes
docker
运维
clickhouse
数据库
mysql
linux的php探针使用
servlet
java
jvm
小程序
鸿蒙hdf框架
鸿蒙体验手册
云计算
android studio
android
ide
微信小程序
微信
Android
安卓调试桥
ADB 调试命令
HarmpnyOS 2
数据线的区别