OO课程的完结,软件工程学习的开始
UML小结
在大二上学期的时候,就了解到UML语言并心生仰慕,统一的理论统一的方法相信一直是学术界工业界的追求,期待去学习~
期末没太学的深入,这段时间恰好有空(这学期少得的空闲...),也正对软件工程萌生了探索的兴趣,也就在知乎上搜了UML内容,来看书学习一下。
然鹅,,,知乎界面是这样的,
- 有用无用论暂且不论,UML存在而且在一段时间普及过,那就有存在的价值,所以先学习,学习学习~
阅读学习
阅读一本书,是系统学习一个事物的最好的方式。
——比尔盖茨
我个人也非常喜欢看书(相较起看电子屏幕...捂脸.jpg)
根据这些知乎问题学习UML好的书籍,去图书馆找到了三本书,分别快速阅读简要摘录如下:(emmm...但是在阅读中,发现UML博大精深,,快速阅读可能只能完成作业,写完后需要更详细的学习
大象:Thinking in UML
这是一本好书,相见恨晚,“大象希形,大音稀声”,附上简介链接:大象:Thinking in UML(第2版)
- 为什么需要UML
- 写程序是面对用户的需求,学习也最好是发掘出了潜在的需求。
- UML是一门,解决大型软件工程化中的问题,的统一建模语言。下面是它产生的需求和背景:
emmm...UML对于软件工程来说非常重要,但是,,我们现在学是不是有点“超前”或者说“过分跃进”?毕竟其中涉及到的工作流程,大多数同学是没有体验过的。
-
建模基础
- 建模。用面向对象的方法去建。由面向对象的抽象角度确定了的目标是模。
- 用例驱动(这个我还没看太明白,再详细看。
- 抽象层次。这给架构指出了一条明路。
-
UML核心元素(愈发觉得UML博大精深...
-
参与者Actor(课堂学习中还没有涉及到这部分,粗看这是在寻找对象
-
用例Use case(可以理解为“外力”,为互相独立的“孤独”的UML元素,施加“外力”,使之联系起来;实际书中,对用例的描述是精妙的多层次的多角度的)
-
边界(与封装的概念师出同源,有一点访问权限的意思,但在面向对象的思想中又有更广泛的内涵,"面向对象里,任何一个对象都有一个边界,外界只能通过这个边界来认识对象,与对象打交道,而对象内部则是一个禁区。"也可以理解为每个对象只做自己应该做的事情,给每个对象划定边界,会很好的避免“电梯造人”这种搞笑事情的发生~造人已经远远超出了电梯的能力范畴hhh~)
-
包(在IDE中,包就像文件系统中的文件夹,不过这种理解太抽象了。分包可分成领域包,子系统包,组织结构包,层)
-
关系(各种在Java编程中已经实现了的关系,!
-
以及业务实体、分析类、组件、节点等元素
-
-
UML核心视图
- 发现UML种类很多
- 就我们非常熟悉的类图来说,也有概念层类图、实现层类图(我们经常用的是这个)、说明层类图
- 非常困惑,这些图都是干什么的?他们的创立是基于什么需求?
核心视图
以上是认识UML的基本准备知识,后面更多的是关于在软件工程开发中,运用UML实践的内容。
-
先列出了一个实践的大框架
- 准备工作
- 获取需求
- 需求分析
- 系统分析
- 系统设计
- 数据库设计
- 开发
-
从目录看,文章作者博学而幽默,阅读一定会非常有乐趣的。
- 比如
- 比如
-
最后一章是作者对UML或者是面向对象方法的一些思考
-
测试(文中对测试提出了测试矩阵,但总的测试篇幅较少,测试方面还需要阅读其他的内容)
-
用例(这个词之前是没有太听说过的,但这章中用三节来分别说明,用例是系统思维,用例与可扩展架构相关,用例驱动还是领域驱动)
-
抽象层次以及如何实现子系统的划分,来实现“高内聚,低耦合”(这也正是我在第四章UML解析作业中的一个困惑所在,程序越写越长,开始怎么去架构,怎么实现类与类之间、方法与方法之间的“高内聚,低耦合”?
-
接口是系统的灵魂。
-
系统中的权衡与选择(下图中提到的工作流思想,也是没听说过的,但找到一片博客可扩展的工作流引擎设计,粗看似乎明白了和状态图的区别)
-
学会使用设计模式(学期中学的实践的设计模式非常有限,记得昂神之前推荐过《Head First 设计模式》一书,假期会拜读一下)
-
-
以上就是全书的概要,由于作业的时间原因没能阅读理解之后写出更有思考力的概要
-
但这本书真的是提升软件的工程能力的一本必读书,假期要做到最基本的全文阅读。
UML精粹
- 书名叫做“精粹”,书也确实很薄,中文200页不到,想必内容也是遵循了奥卡姆剃刀原理~
- 看一页目录
-
相比起楼上的那本,除了基本的UML核心元素、视图之外,我对第二章——开发过程非常感兴趣,简要阅读摘录如下
-
项目开发过程
- 瀑布风格(基于活动来分解整个项目)
- 迭代风格(根据功能子集来分解整个项目)
- 自动化回归测试(介绍了xUnit测试工具)、重构、持续集成、为项目裁剪UML等
UML和模式应用
- 这本书翻阅了一下,相比起以上两本,算是一本讲的不错的字典书吧~可以查阅使用。
- 可能可读性不如上面两本,但是也有很多新鲜的内容,读完上面两本,这一本可以做补充知识使用。
本单元作业的架构设计
-
先上两次作业的包目录和类图
-
Homework13
-
Homework14
-
架构,作业主要还是完成剩余的模块
-
用
packge element
给出了各个元素,并设立抽象基类 -
实现
UmlInteraction
接口,而且为了保持对象各自之间的独立性,将类图、状态图、时序图分对象解析
四个单元中架构设计及OO方法的演进
-
第一单元:多项式求导
- 自以为这一单元收获最大的是Java语法,尤其是正则表达式的相关语法(可以写出不爆栈的正则表达式匹配了...)
- 当然,第一次接受继承重写接口实现等抽象概念,并在第三次作业中实现,收获良多
-
第二单元:电梯多线程
- 我感觉这是几次作业中最难的一个单元,也是没有掌握好的一个单元。
- 这一单元的内容——多线程,几乎可以开一门一学期的课程去讲解,三四周的学习我觉得有些仓促了。
- 架构设计上,我在认识上实践上,都体会到一句话,"每个对象只管自己要管的事情",明确了对象的边界之后,尝试了对象之间的消息传递,以及一些设计模式,我认为自己在面向对象的思想上还是有很大进步的。
- 但这一单元最终作业完成的特别不好,我认为是我没有学明白多线程,直到现在我依旧很虚多线程,这也是我暑假要补起来的一部分(似乎数据库可以补吧~
-
第三单元:图论地铁站 + JML规格
- 这一单元引入一个新的内容,JML以及规格的概念,这个在软件工程开发时应该比较有用吧。。
- 不过从实际编程来看,还是大一数据结构的内容。
- 这一单元,我尝试类与类之间,方法与方法之间的”高内聚,低耦合“,但失败,期待一套软件的工程学方法,而不是有点类形式主义的规格。
-
第四单元:UML及其相关解析
- 这一单元再次看到助教霸霸们高超的编程水平~
- 采用了抽象工厂、分层次等架构设计
- 在这次总结中,也从UML初窥软件工程
四个单元中测试与实践的演进
- 测试,总结起来,黑盒测试,针对指导书要求的白盒测试,Junit单元测试
- 第一二单元,多采用黑盒测试,针对指导书要求的白盒测试,类似于“覆盖性小测试集,压力型随机测试集”的模式
- 第三单元,接触Junit测试工具,采用之后效果很好
- 第四单元,由于期末考期时间比较紧张,故未采用Junit测试
- 但经过三单元的作业之后,我认为单元测试,是未来软件工程测试的必须。
课程收获
-
收获很多,但也有很多的遗憾和不甘,先说收获。
- 熟练应用Java这门面向对象的编程语言
- 初步掌握了面向对象的基本概念,继承多态接口等
- 大量的代码练习,熟练度架构水平提升
- 了解到了Jetbrain这一类强大的IDE
- 学习了很多软件工程中的知识,如JML、UML
- 听了两位业界工程师的讲座
-
不甘...或者说没学到的:
- 代码量大了,但是我不认为自己的软件工程能力提高了。
- 多线程的内容,学的非常不好。
- 没有多学习优秀同学的代码,自己的编程能力进步不够。
-
所以,现在虽是OO课程的结束,但也是新的软件的工程能力培养的开始,假如大家看到这里,有什么学习的书籍和实践平台的建议或推荐,感谢啦🙏
三个具体改进建议
-
教好一个方法或者思想就好,内容不要过于的丰富繁杂。
之前看一个TED说一个演讲之能说一个内容,而且这个内容就是主线内容,我想课程也是这个道理。计组实践课全程教授了一套工程化设计实践方法,配以较多的练习来帮助掌握。但是OO四个单元,型散且神散(假如冒犯,那非常抱歉...我是真的愚钝的不知道主线是啥......) -
建议理论课多与同学们交互(课堂上的相互交互和课下的反馈),可能不少同学反映,理论课对实践课帮助不大,听不听都行。
-
可以参考一下国外高校的软件工程授课思路和实践平台,我感觉学完这门课程,我的软件工程能力没有提升太多,是不是需要结构性的改变?(这个我暑假会找相关资料弥补我这学期的缺漏。)
OO不是结束,是暑期软件工程能力提升的开始。
真诚感谢老师和助教一学期的付出,谢谢!