学习心得《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006 ”

《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006

实验一报告
实验二报告
实验三报告
实验四报告
实验五报告
实验七报告

1、课程简介
简单地说,学习软件工程能够让人在软件开发时少走一些弯路。

2、熟悉Linux编程环境
为什么要学习用Linux系统?1、专业的程序员应该了解unix类的操作系统。2、大多数服务器用Linux系统。3、Linux环境下做开发可以彻底掌控设计。

个人感觉,在Linux下开发,过程会比较清晰,但效率暂时偏低,需要较长时间的使用才能彻底掌握vim等工具。另外还有一个好处,就是会减少程序员对系统的依赖,能够更快适应其它平台。

3、代码风格规范
这一章详细讲了缩进、命名、注释等代码编排的风格规范,对我产生了重大的影响。以前我也知道代码风格的重要性,却没有去认真了解一般规范是怎样的,只是按照自己觉得怎么好看、怎么方便去写。经过老师点拨,我尝试采用公认规范去写,的确感觉代码比以前有条理得多,十分易于阅读,特别是在改bug的时候。现在我已经完全形成了编写规范代码的习惯!

4、基本的模块化设计(separation of concerns)
代码设计中的一些常见方法:

KISS(keep it simple & stupid):一个函数或一个方法,只做一件事。扩展开来,在设计上,一个系统、一个子系统、一个模块、一个类等也只做一件事。

using design to frame thecode(matching design with implementation):including pseuducode,在从设计到实现的过程中加入伪代码要好于直接将设计翻译成代码。

不要和陌生人说话原则(Law of Demeter):一个对象应当对其他对象有尽可能少的了解。

合理利用Control Structures、DataStructures来简化代码:采用合适的控制结构和数据结构能大大简化代码。

一定要有错误处理:Debug版本中所有的参数都要验证是否正确;Release版本中从外部(用户或别的模块)传递进来的参数要验证正确性。

5、可重用模块的接口设计(天王盖地虎,宝塔镇河妖)
简单地说就是造轮子,要求达到高内聚低耦合的设计目标,方便重复使用。

常见接口设计规范有:参数化上下文,生死相依原则,移除前置条件,简化后置条件等,另外还需编写开发者指南,供用户阅读使用。

这里要考虑一个接口通用的问题,并不是越通用越好,因为过于通用需要考虑很多情况,导致模块臃肿、效率低下,因此应该not too specific, not too general。

6、callback函数
用callback函数设计接口能够方便地实现多态,使接口更加通用而避免考虑许多情况,用户使用起来也更简洁。但callback的做法是把某些实现丢给了用户,也算造成了一些不必要的麻烦,应该尽量少用callback。

这里还提到了信息隐藏,一般地说,定义和实现需要隐藏,而声明和接口暴露给用户。

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

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

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

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

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

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

8、子系统的可重用设计
尽管已经为链表设计好接口,但要避免错误:手里有把锤子,看哪里都是钉子。menu子系统比较特殊,与链表等常用模块不同,接口不需要太通用,但为了可用于不同的项目,也不能太具体(够用就好)。同时为了方便工程编译,应该写Makefile文件,可以用automake或autoconf。

为了让menu子系统功能更强大,可用strtok和getopt等函数使其支持带参数命令。

9、代码背后的设计思想
设计方法论:不断地重构

几个重要的设计指导原则:

Modularity

Interfaces

Information hiding

Incremental development

Abstraction

Generality

总结体会:
软件工程是研究和应用如何以系统性的、规范化的、可定量的过程化方法去开发和维护软件的一门科学,代码的设计不单单是为了使程序可运行,可实现需要的功能,在代码的规范,设计的规范,模块化思想,线程的安全性,子系统统的可重用性上都有所要求。

代码实现内部模块化,代码的业务逻辑和数据存储使用不同的源文件实现.
代码设计风格有如下几点:

  1. KISS(keep it simple and stupid)一个函数或者方法只做一件事
  2. Using design to frame the code 设计与实现保持一致
  3. 不要和没陌生人说话
  4. 合理运用Control Structure和Data Structure简化代码
  5. 一定要有错误处理

将命令行小程序的程序逻辑和数据结构进一步分离,利用通用的链表来实现命令行小程序。底层为通用链表数据结构,中间层为命令链表数据结构,最上层为程序逻辑。
在模块化的思想中,讲究高内聚低耦合,接口要规范,代码要注意通用性
在子系统的设计当中,要设计出可重用的接口。使menu子系统支持带参数的复杂命令,并在用户范例代码中自定义一个带参数的复杂命令.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值