软件工程(C编码实践)学习总结及心得
徐礼超 原创作品转载请注明出处:http://www.cnblogs.com/xulichao
《软件工程(C编码实践篇)》MOOC课程http://mooc.study.163.com/course/USTC-1000002006
一、实验一:写一个Hello word小程序
主要是熟悉实验楼环境,初步了解代码规范,熟悉linux基本命令,包括cd、ls、mkdir等命令,vim基本命令,包括vi使用,一般模式、编辑模式、命令模式等模式切换,markdown的书写,包括标题、插入链接、插入图片、两次enter等。
实验报告:https://www.shiyanlou.com/courses/reports/644985
实验代码:http://git.shiyanlou.com/chaoge282/shiyanlou_cs122/src/master/lab1
二、实验二:命令行菜单小程序
实现了命令行的小程序,最主要的学习到很多代码规范,包括:
- 缩进4个空格
- 变量命名采用lowCamel风格
- 类型/类/函数名用Pascal风格
- 类型/类/变量名用名词或名词组合
- 函数名用动词或动宾短语
- 行宽小于100字符
- 括号清楚地表示逻辑优先级
- 所有{和}独占一行,且成对对齐
- 不要把多个语句和多个变量定义放在同一行
- 注释、文件名、路径等用英文ASCII字符,不要用中文和特殊字符
- 不要解释程序如何工作(How),要解释程序做什么(What),为什么这么做(Why),需要特别注意的地方
实验报告:https://www.shiyanlou.com/courses/reports/661548
三、实验三:内部模块化的命令行程序内部模块化的命令行程序
将程序内部进行模块化,设置接口,使程序更加逻辑清楚
- KISS(keep it simple and stupid)一个函数或者方法只做一件事
- Using design to frame the code 设计与实现保持一致
- Including pseuducode
- 不要和没陌生人说话
- 合理运用Control Structure和Data Structure简化代码
- 一定要有错误处理 goto 语句的用法 用数据结构简化代码
实验报告:https://www.shiyanlou.com/courses/reports/686392
实验代码:http://git.shiyanlou.com/chaoge282/shiyanlou_cs122/src/master/lab3
四、实验四:用可重用的链表模块来实现命令行菜单小程序
将数据结构抽出来独立成一个通用模块的技巧,
linktable模块与具体的数据类型无关,是一个通用的链表模块,我们要用到模块时,再具体定义数据类型。这样就可以在C语言没有泛型的情况下尽最大可能复用数据结构的代码,这是非常厉害的技巧
- 用可重用的链表模块来实现命令行菜单小程序,执行某个命令时调用一个特定的函数作为执行动作
- 链表模块的接口设计要足够通用,命令行菜单小程序的功能保持不变
- 可以将通用的Linktable模块集成到我们的menu程序中
- 接口规范
实验报告:https://www.shiyanlou.com/courses/reports/701963
实验代码:http://git.shiyanlou.com/chaoge282/shiyanlou_cs122/src/master/lab4
五、实验五:用callback增强链表模块来实现命令行菜单小程序
学习利用callback函数参数使Linktable的查询接口更加通用。
当我们向用户提供接口的时候,要学会注意接口信息的隐藏,只提供给对方必要的信息,而不能完全暴露自己的信息,以免被别人攻击,修改自己内部信息而造成不可预估的后果。
有关args的使用有点晕晕的,并没有完全理清楚其中的机制,特别是后来在testlinktable.c程序中遇到了点麻烦,由于多了一个参数,但这个参数并没有使用,所以有点怪怪的。
实验报告:https://www.shiyanlou.com/courses/reports/715603
实验代码:http://git.shiyanlou.com/chaoge282/shiyanlou_cs122/src/master/lab5
六、实验六:小测验(略)
七、实验七:将menu设计为可重用的子系统
将menu设计为可以重用的子系统,利用命令行参数argc/argv来处理命令参数,由于menu函数是提供给用户使用的,它只需要向外提供一个执行命令的方法和一个初始化方法。
Makefile,这个我是新学到的,真的很好用,程序更加有套路,编译程序更方便,相信以后会越来越多的用到,。
大概了解了函数getopt的用法,虽然基本实现了复杂命令参数,但是getopt函数里的定义的几个全局变我并不太清楚其功能,在后续的编码中,应该继续完善
- Makefile工程文件
- make == make all
- make clean 支持带参数的复杂命令的方法
实验报告:https://www.shiyanlou.com/courses/reports/748120
实验代码:http://git.shiyanlou.com/chaoge282/shiyanlou_cs122/src/master/lab7
心得体会:
历经11周,软件工程(c编码实践篇)这门课程终于圆满结束了(此处应该有掌声~)
学习完这门课,我对软件设计开发有了一个新的认识,以前总认为软件就是写程序,开发软件项目就是大家一起写程序,然后拼在一起实现最后的功能,但现在,我才知道我对软件有多么肤浅的认识,软件开发远比单单写程序来的高端,来的复杂。下面就从本实验说起。
实验是从最熟悉的hello word写起,当然,这个实验主要是让我们先了解实验环境,了解代码规范的一些基础内容,为后面的学习打基础。接着一步一步做实验,不知不觉将命令行菜单的一个小程序慢慢地变成了一个命令行的小系统,在这个过程中,尽管老师一直强调我们主要考察代码规范,可是我学到的又岂止是代码规范,还有很多能一直受用的知识,linux命令,markdown的书写,4空格缩进,变量名和函数名各种风格,{和}独占一行,且成对对齐,如何简化代码,如何保持设计与实现一致,如何设计规范的接口,如何让模块通用,如何提供皆空的同时隐藏信息,如何用makefile编译工程文件等等。。。。。这对以前只注重功能实现的我来说无疑是一个很好的学习过程和提高过程。
软件=程序+软件工程!!构建之法如是说,我深表赞同,一个好的程序我觉得不仅代码够规范,可读性够强,还要能可再利用,写程序之前应该先好好设计程序,怎么能让这个程序既实现功能,又美观,可读性强,同时以后遇到相似的问题还能继续用,现在回头想想,我们本次的实验解决的就是这个问题,在做实验的过程中老师提的要求就是在规范我们的程序设计,从一开始只是实现命令行输出功能,中间贯穿实验的代码格式和规范,到最后将menu主程序设计成接口,让其能重用,这整个过程就在改变着我们原有的程序设计思维,让我们认识到软件是高于程序的存在,真的受益匪浅!!
软件工程(C编码实践)学习总结及心得的更多相关文章
- Kafka项目实战-用户日志上报实时统计之编码实践
1.概述 本课程的视频教程地址:<Kafka实战项目之编码实践> 该课程我以用户实时上报日志案例为基础,带着大家去完成各个KPI的编码工作,实现生产模块.消费模块,数据持久化,以及应用调 ...
- ElasticSearch实战-编码实践
1.概述 前面在<ElasticSearch实战-入门>中给大家分享如何搭建这样一个集群,在完成集群的搭建后,今天给大家分享如何实现对应的业务功能模块,下面是今天的分享内容,目录如下所示: ...
- Hadoop项目实战-用户行为分析之编码实践
1.概述 本课程的视频教程地址:<用户行为分析之编码实践> 本课程以用户行为分析案例为基础,带着大家去完成对各个KPI的编码工作,以及应用调度工作,让大家通过本课程掌握Hadoop项目的编 ...
- 20145308 《网络对抗》 MAL_免杀原理及实践 学习总结
20145308 <网络对抗> MAL_免杀原理及实践 学习总结 实践内容 (1)理解免杀技术原理 (2)正确使用msf编码器,veil-evasion,自己利用shellcode编程等免 ...
- 后端开发实践系列之三——事件驱动架构(EDA)编码实践
在本系列的前两篇文章中,笔者分别讲到了后端项目的代码模板和DDD编码实践,在本文中,我将继续以编码实践的方式分享如何落地事件驱动架构. 单纯地讲事件驱动架构(Event Driven Architec ...
- 总结一下这几天学习django的心得
总结一下这几天学习django的心得 http://www.tuicool.com/articles/jMVB3e 时间 2014-01-12 11:40:11 CSDN博客 原文 http:// ...
- 20145308 《网络对抗》Web安全基础实践 学习总结
20145308 <网络对抗> Web安全基础实践 学习总结 实验内容 本实践的目标理解常用网络攻击技术的基本原理.Webgoat实践下相关实验. 基础问题回答 (1)SQL注入攻击原理, ...
- 20145308 《网络对抗》 MAL_后门应用与实践 学习总结
20145308 <网络对抗> MAL_后门应用与实践 学习总结 实践目的 使用nc实现win和Linux间的后门连接 meterpreter的应用 MSF POST的应用 知识点学习总结 ...
- 20145308 《网络对抗》 逆向及BOF基础实践 学习总结
20145308 <网络对抗> 逆向及BOF基础实践 学习总结 实践目的 通过两种方法,实现程序能够运行原本并不会被运行的代码 实践原理 利用foo函数的Bof漏洞,构造一个攻击输入字符串 ...
- 七、Kafka 用户日志上报实时统计之编码实践
一.数据生产实现 1.配置数据生产模块 项目基础配置所包含的内容,如下所示: •项目工程的文件配置 •集群连接信息配置 •开发演示 2.实现 Flume 到 Kafka 模块 实现 Flume 到 K ...
随机推荐
- 浅谈你感兴趣的 C# GC 机制底层
本文内容是学习CLR.via C#的21章后个人整理,有不足之处欢迎指导. 昨天是1024,coder的节日,我为自己coder之路定下一句准则--保持学习,保持自信,保持谦逊,保持分享,越走越远. ...
- cros解决跨域
- MySQL的Incorrect string value错误
用以下SQL语句向表2中插入数据: insert into 表2 select * from 表1 结果出现Incorrect string value错误: 打开表2一看,里面全是问号: 后来才发现 ...
- Adb connection Error:远程主机强迫关闭了一个现有的连接
在用手机调试程序时,有时会出现“Adb connection Error:远程主机强迫关闭了一个现有的连接”的错误. 出现这种错误时,可以按照以下步骤解决: (1)运行cmd.exe,并将目录CD到\ ...
- NOI 2015 荷马史诗【BZOJ 4198】k叉Huffman树
抱歉因为NOIP集训,好长时间没再写题解了. NOI 2015也就只有这道题一看就能懂了-- 4198: [Noi2015]荷马史诗 Time Limit: 10 Sec Memory Limit: ...
- Hibernate(九)__OpenSessionInView解决懒加载问题
什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关 ...
- Spring4学习笔记 - SpEL表达式
- Spring4学习笔记1-HelloWorld与IOC和DI概述
1.安装环境 1.1安装eclipse,jdk 1.1安装Spring tool suite(非必要项) 2.spring HelloWorld 2.1 需要的jar包(spring官网下载:http ...
- JSON.stringify()、JSON.parse()和eval(string)
1.JSON.stringify()用于从一个对象解析出字符串,eg: var obj = {"name":"奔跑的蜗牛","age":&q ...
- <!DOCTYPE>
定义和用法 所有浏览器都支持 <!DOCTYPE> 声明. <!DOCTYPE> 声明必须是 HTML 文档的第一行,位于 <html> 标签之前. <!D ...