您的位置:首页 > 其它

《软件工程(C编码实践篇)》学习总结

2017-06-16 22:26 363 查看
徐楷 + 原创作品转载请注明出处 + 《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006

两个月的时间学习软件工程(c编码实践篇)已经接近尾声,现想把学到的知识进行总结并写篇博客记录下来。

代码层面的软件工程的理解

1.代码最初是如何生长起来的

•从hello world开始不断迭代调试使代码长的越来越像一个命令行的菜单小程序

•写代码要小步快跑不断迭代,罗马不是一天建成的。

•声明:做实际项目并不鼓励从头开始写代码,而是找已有的类似项目做逆向工程和再工程。

2.代码风格规范

•代码风格的原则:简明、易读、无二义性

•缩进、命名、注释等代码编排的风格规范

3.经过基本Modularity (also called separation of concerns)设计的代码

•模块化的思想和命令行菜单的实现范例(开源社区中常见的写法)

•基本模块化的写法

代码设计中的一些常见方法

•KISS(keep it simple & stupid)

•using design to frame the code(matching design with implementation)

•including pseuducode

•不要和陌生人说话原则

•合理利用Control Structures、Data Structures来简化代码

•一定要有错误处理

标准目标:高内聚,低耦合.

4.通用Linktable模块的接口设计

将通用的Linktable模块集成到我们的menu程序中

定义接口 - “天王盖地虎,宝塔镇河妖”黑社会接头也设计接口的!

•接口规范

•内聚和耦合

•通用原则

5.接口设计改进

给Linktable增加Callback方式的接口

在menu中用Callback方式查询链表

进一步改进Linktable的Callback方式的接口

•用callback函数实现的多态浅析

•信息隐藏

6.测试函数的可重入性与线程安全

什么是函数的可重入性?

可重入(reentrant)函数可以由多于一个任务并发使用,而不必担心数据错误。相反,不可重入(non-reentrant)函数不能由超过一个任务所共享,除非能确保函数的互斥(或者使用信号量,或者在代码的关键部分禁用中断)。可重入函数可以在任意时刻被中断,稍后再继续运行,不会丢失数据。可重入函数要么使用本地变量,要么在使用全局变量时保护自己的数据。


可重入函数:

不为连续的调用持有静态数据。

不返回指向静态数据的指针;所有数据都由函数的调用者提供。

使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。

绝不调用任何不可重入函数。


什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。


线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。

函数的可重入性与线程安全之间的关系

•可重入的函数不一定是线程安全的;

•可重入的函数在多个线程中并发使用时是线程安全的,但不同的可重入函数(共享全局变量及静态变量)在多个线程中并发使用时会有线程安全问题(
4000
可能是线程安全的也可能不是线程安全的);

•不可重入的函数一定不是线程安全的;

互斥锁,读写锁.

7.子系统的可重用设计

menu作为一个子系统的可重用接口设计

•手里有把锤子,看哪里都是钉子

•够用就好——不要太具体,也不要太通用

8.代码背后的设计思想

几种不同的质量视角

•产品的视角(内部质量)

•用户的视角——是不是对用户有帮助

•商业上下文的质量——投资回报和驱动力问题

•运营推广也是一个关键

•将menu开源希望有人使用它

设计方法论

•不断地重构

几个重要的设计指导原则

•Modularity

•Interfaces

•Information hiding

•Incremental development

•Abstraction

•Generality

实验报告

1.写一个hello world小程序

https://www.shiyanlou.com/courses/reports/1270425

2.命令行菜单小程序V1.0

https://www.shiyanlou.com/courses/reports/1271437

3.内部模块化的命令行菜单V2.0

https://www.shiyanlou.com/courses/reports/1272542

4.用可重用的链表模块来实现命令行菜单小程序V2.5

https://www.shiyanlou.com/courses/reports/1275147

5用callback增强链表模块来实现命令行菜单小程序V2.8

https://www.shiyanlou.com/courses/reports/1276082

6.将menu设计为可重用的子系统

https://www.shiyanlou.com/courses/reports/1277830

学习总结

学习《软件工程(C编码实践篇)》课程中最大的收获是加深了对代码设计与书写规范的理解尤其是对模块与接口的设计,最大的遗憾是孟老师没有给出软件工程撰写文档,ppt的一些步骤与规范。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: