smartProgram学习笔记
背景:转正前要完成这样一个编程课的学习。平时写代码只是完成基本的功能,没有养成良好的习惯,感觉这样的课程还是要好好学习下,要不真是不知道什么叫写代码。
Week1
为什么要写好代码?
因为平时读:写代码的时间是10:1,所以写好代码很重要
代码是债务而不是资产,你拥有的代码越多,添加新内容所要付出的成本就越高。
使用接口的优势;
1 可以方便的进行扩展
2 保证调用接口的类主体不发生变化。
编程价值观:
代码是作品,是供读者心上的,呈现的是读者所需要的内容。
源代码即设计
源代码是对软件的唯一精确描述。
如何编写整洁代码
布局原则:
1.凸显代码逻辑
2 不增加不必要的维护成本。(优先考虑凸显代码逻辑)
3 空行:分离相关逻辑
4 换行:凸显逻辑
5 换行:一行一条语句
6 变量声明:使用时再定义
注释原则:
尽量用代码注释自己
说明代码意图
命名原则
瞄准问题,命名要提供业务层面的含义
避免无意义的编码
避免类型编码
整洁函数的原则:
要短小
单一职责(函数应仅有一个让他变化的原因)
单一抽象层次(即一个函数的操作应该在一个抽象层次)
创建函数原则
降低复杂度
提升可读性
封装变化
如果没有函数的抽象能力,我们的智力将无法管理复杂的程序。
圈复杂度:用来度量函数的复杂度
导致函数复杂的原因:
超长函数是滋生代码异味的温床
深层嵌套 (违反了单一抽象层次的原则)
复杂表达式
减少嵌套:
重复检测条件
利用break
表驱动(通过下标直接访问要访问的元素)
合理的参数:
最理想的参数数量是零个,其次是一个,再次是两个,有足够的理由我们才使用三个以上
DRY原则——Don't Repeat Youurself。
当增加一个功能或者修复一个缺陷时,如果经过严密的逻辑分析需要修改N个地方,结果要修改多于N个地方才能完成,则说明存在重复。
编程的好习惯:
尽量编写和测试小块代码。写一小块,测一小块,在稳固的基础上增加代码。
简单直接地表达代码意图,代码是写给别人看的,别人包括自己。
代码看不顺眼,立即动手优化,记住Later=Never。
写完代码立即进行自检,自检完进行交叉评审。
解决错误是最最最要紧的事情。
经常提交代码,代码一旦OK(不影响现在功能),立即提交。
在找到正确的解法之前,不要一味地“试”,要花时间寻求正确的解。
如果一种观点或习惯会阻碍你写出整洁代码就坚决摒弃它。
代码性能
响应时间+吞吐率
性能既是设计出来的,也是编码出来的。设计决定性能的上限,编码决定性能的下限。
影响软件性能的因素:
1 硬件
(寄存器,缓存,主存,磁盘;CPU系统)
2 软件
(编译器——源码到二进制)
编译器的优化能力:
1)优化计算
常量计算优化;消除重复的复制或合并计算
2)内存访问
栈变量->寄存器,如循环中的递增变量
全局变量——>局部变量——>寄存器
3)指令流水线
4)函数调用
Inline函数;非递归函数;地址对齐(减少对内存的访问次数,节约内存空间);优化函数栈
代码性能优化方法:
数据结构定义注意点:
联系紧密的字段集中定义
减少指针引用字段
考虑字节对齐
合并字段
变量定义:
充分利用寄存器
充分利用局部变量
尽量使用字长变量
少用static变量
少用全局变量
全局数据访问:
全局转局部,多用局部指针和变量,减少重复访问。
内存数据访问:
更好的利用高速缓存
消除不必要的存储器引用
一致原则与清晰原则:
一致原则:代码不是时装,不需要混搭
清晰原则:清晰胜于技巧
吝啬原则:除非别无它法,不要编写大函数
透明原则:设计和实现都要可见
简单的设计,简明的实现
预先添加调试信息,而不是亡羊补牢
缄默原则:只输出有用的信息
精炼原则:输出的信息要言简意赅
补救原则:临终遗言要干净而详细
代码可维护性的评价标准:
代码圈复杂度(Cycomatic Complexity)
Depths:语句嵌套深度
Fan-out:扇出数,即一个函数/方法对其它函数的调用次数综合
代码重复度(code duplicate)
MI(Maintainability Index):可维护性洗漱,综合均值CC,均值Depth,均值Fan-out
典型的静态分析工具——
PC-Lint
SAM:按模块度量并通过网页展示
Source Monitor
Simian
smartProgram学习笔记的更多相关文章
- js学习笔记:webpack基础入门(一)
之前听说过webpack,今天想正式的接触一下,先跟着webpack的官方用户指南走: 在这里有: 如何安装webpack 如何使用webpack 如何使用loader 如何使用webpack的开发者 ...
- PHP-自定义模板-学习笔记
1. 开始 这几天,看了李炎恢老师的<PHP第二季度视频>中的“章节7:创建TPL自定义模板”,做一个学习笔记,通过绘制架构图.UML类图和思维导图,来对加深理解. 2. 整体架构图 ...
- PHP-会员登录与注册例子解析-学习笔记
1.开始 最近开始学习李炎恢老师的<PHP第二季度视频>中的“章节5:使用OOP注册会员”,做一个学习笔记,通过绘制基本页面流程和UML类图,来对加深理解. 2.基本页面流程 3.通过UM ...
- 2014年暑假c#学习笔记目录
2014年暑假c#学习笔记 一.C#编程基础 1. c#编程基础之枚举 2. c#编程基础之函数可变参数 3. c#编程基础之字符串基础 4. c#编程基础之字符串函数 5.c#编程基础之ref.ou ...
- JAVA GUI编程学习笔记目录
2014年暑假JAVA GUI编程学习笔记目录 1.JAVA之GUI编程概述 2.JAVA之GUI编程布局 3.JAVA之GUI编程Frame窗口 4.JAVA之GUI编程事件监听机制 5.JAVA之 ...
- seaJs学习笔记2 – seaJs组建库的使用
原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...
- CSS学习笔记
CSS学习笔记 2016年12月15日整理 CSS基础 Chapter1 在console输入escape("宋体") ENTER 就会出现unicode编码 显示"%u ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- DirectX Graphics Infrastructure(DXGI):最佳范例 学习笔记
今天要学习的这篇文章写的算是比较早的了,大概在DX11时代就写好了,当时龙书11版看得很潦草,并没有注意这篇文章,现在看12,觉得是跳不过去的一篇文章,地址如下: https://msdn.micro ...
随机推荐
- python爬虫之git的使用(windows下pycharm使用)
相信很多同学学会了git或者github以后都不知道怎么跟windows上的pycharm连在一起工作,那么下面我们开始介绍简单的安装和使用方法. 一.安装 1.首先你的有一个github的账户.注册 ...
- python之路--面向对象-成员
一 . 成员 在类中你能写的所有内容都是类的成员 class 类名: # 方法 def__init__(self, 参数1, 参数2...): # 属性变量 self.属性1 = 参数1 self.属 ...
- MySQL 单个表锁死 对查询语句无响应
这个时候应该怀疑读取都被加锁,应该尝试使用 show processlist 查看每一个正在运行的进程. 可以看到这样一个列表,里面有使用者即用户,正在使用数据库的 host, 使用的 db 目前的 ...
- jquery的show()和hide()方法
显示和隐藏元素的方法 相当于CSS中的display属性 show()方法,相当于display:block hide()方法,相当于display:none
- postfix 邮箱设置及常见错误
postfix 邮箱设置及常见错误 1.如果装了sendmail的话,先卸载了. yum remove sendmail 2.安装 Postfix yum install postfix 3.更改默认 ...
- 利用 ajax自定义Form表单的提交方式
需求场景:有时候单纯的form表单无法向后端传递额外的参数 比如需要action传递js异步生成的参数 ,form表单默认的action就无法满足需求,这时就需要我们自定义form表单的提交方式. h ...
- codeforces534B
Covered Path CodeForces - 534B The on-board computer on Polycarp's car measured that the car speed a ...
- UVA 11988 Beiju Text
https://vjudge.net/problem/UVA-11988 题目 你有一个破损的键盘.键盘上所有的键都可以正常工作,但有时候Home键或者End键会自动按下.你并不知道键盘存在这一问题, ...
- 搭建Hexo博客(二)-连接github
没有github账号先需要创建账号,地址:https://github.com/join?source=header 有账号的看下面: 1.创建repo 创建一个repo,名称为yourname.gi ...
- BZOJ2229[Zjoi2011]最小割——最小割树
题目描述 小白在图论课上学到了一个新的概念——最小割,下课后小白在笔记本上写下了如下这段话: “对于一个图,某个对图中结点的划分将图中所有结点分成两个部分,如果结点s,t不在同一个部分中,则称这个划分 ...