OO课程的完结,软件工程学习的开始

UML小结

在大二上学期的时候,就了解到UML语言并心生仰慕,统一的理论统一的方法相信一直是学术界工业界的追求,期待去学习~

期末没太学的深入,这段时间恰好有空(这学期少得的空闲...),也正对软件工程萌生了探索的兴趣,也就在知乎上搜了UML内容,来看书学习一下。

然鹅,,,知乎界面是这样的,

zhihu_UML

  • 有用无用论暂且不论,UML存在而且在一段时间普及过,那就有存在的价值,所以先学习,学习学习~

阅读学习

阅读一本书,是系统学习一个事物的最好的方式。
——比尔盖茨

我个人也非常喜欢看书(相较起看电子屏幕...捂脸.jpg)

根据这些知乎问题学习UML好的书籍,去图书馆找到了三本书,分别快速阅读简要摘录如下:(emmm...但是在阅读中,发现UML博大精深,,快速阅读可能只能完成作业,写完后需要更详细的学习

大象:Thinking in UML

这是一本好书,相见恨晚,“大象希形,大音稀声”,附上简介链接:大象:Thinking in UML(第2版)

  • 为什么需要UML
    • 写程序是面对用户的需求,学习也最好是发掘出了潜在的需求。
    • UML是一门,解决大型软件工程化中的问题,的统一建模语言。下面是它产生的需求和背景:

thinking in UML, demand

emmm...UML对于软件工程来说非常重要,但是,,我们现在学是不是有点“超前”或者说“过分跃进”?毕竟其中涉及到的工作流程,大多数同学是没有体验过的。

  • 建模基础

  • UML核心元素(愈发觉得UML博大精深...

    • 参与者Actor(课堂学习中还没有涉及到这部分,粗看这是在寻找对象

    • 用例Use case(可以理解为“外力”,为互相独立的“孤独”的UML元素,施加“外力”,使之联系起来;实际书中,对用例的描述是精妙的多层次的多角度的)

    • 边界(与封装的概念师出同源,有一点访问权限的意思,但在面向对象的思想中又有更广泛的内涵,"面向对象里,任何一个对象都有一个边界,外界只能通过这个边界来认识对象,与对象打交道,而对象内部则是一个禁区。"也可以理解为每个对象只做自己应该做的事情,给每个对象划定边界,会很好的避免“电梯造人”这种搞笑事情的发生~造人已经远远超出了电梯的能力范畴hhh~)

    • 包(在IDE中,包就像文件系统中的文件夹,不过这种理解太抽象了。分包可分成领域包,子系统包,组织结构包,层) 包

    • 关系(各种在Java编程中已经实现了的关系,关系!

    • 以及业务实体、分析类、组件、节点等元素

  • UML核心视图

    • 发现UML种类很多
    • 就我们非常熟悉的类图来说,也有概念层类图、实现层类图(我们经常用的是这个)、说明层类图
    • 非常困惑,这些图都是干什么的?他们的创立是基于什么需求?
      核心视图

以上是认识UML的基本准备知识,后面更多的是关于在软件工程开发中,运用UML实践的内容。

  • 先列出了一个实践的大框架

    • 准备工作
    • 获取需求
    • 需求分析
    • 系统分析
    • 系统设计
    • 数据库设计
    • 开发
  • 从目录看,文章作者博学而幽默,阅读一定会非常有乐趣的。

    • 比如
      博学而幽默
  • 最后一章是作者对UML或者是面向对象方法的一些思考

    • 测试(文中对测试提出了测试矩阵,但总的测试篇幅较少,测试方面还需要阅读其他的内容)

    • 用例(这个词之前是没有太听说过的,但这章中用三节来分别说明,用例是系统思维,用例与可扩展架构相关,用例驱动还是领域驱动)

    • 抽象层次以及如何实现子系统的划分,来实现“高内聚,低耦合”(这也正是我在第四章UML解析作业中的一个困惑所在,程序越写越长,开始怎么去架构,怎么实现类与类之间、方法与方法之间的“高内聚,低耦合”?

    • 接口是系统的灵魂。接口

    • 系统中的权衡与选择(下图中提到的工作流思想,也是没听说过的,但找到一片博客可扩展的工作流引擎设计,粗看似乎明白了和状态图的区别)
      SWTO

    • 学会使用设计模式(学期中学的实践的设计模式非常有限,记得昂神之前推荐过《Head First 设计模式》一书,假期会拜读一下)

  • 以上就是全书的概要,由于作业的时间原因没能阅读理解之后写出更有思考力的概要

  • 但这本书真的是提升软件的工程能力的一本必读书,假期要做到最基本的全文阅读。

UML精粹

  • 书名叫做“精粹”,书也确实很薄,中文200页不到,想必内容也是遵循了奥卡姆剃刀原理~
  • 看一页目录

精粹目录

  • 相比起楼上的那本,除了基本的UML核心元素、视图之外,我对第二章——开发过程非常感兴趣,简要阅读摘录如下

  • 项目开发过程

    • 瀑布风格(基于活动来分解整个项目)
    • 迭代风格(根据功能子集来分解整个项目)
    • 自动化回归测试(介绍了xUnit测试工具)、重构、持续集成、为项目裁剪UML等

UML和模式应用

  • 这本书翻阅了一下,相比起以上两本,算是一本讲的不错的字典书吧~可以查阅使用。
  • 可能可读性不如上面两本,但是也有很多新鲜的内容,读完上面两本,这一本可以做补充知识使用。

本单元作业的架构设计

  • 先上两次作业的包目录和类图

  • Homework13
    h13_dictory
    h13_diagram

  • Homework14
    h14_dictory
    h14_diagram

  • 架构,作业主要还是完成剩余的模块

  • packge element给出了各个元素,并设立抽象基类

  • 实现UmlInteraction接口,而且为了保持对象各自之间的独立性,将类图、状态图、时序图分对象解析

四个单元中架构设计及OO方法的演进

  • 第一单元:多项式求导

    • 自以为这一单元收获最大的是Java语法,尤其是正则表达式的相关语法(可以写出不爆栈的正则表达式匹配了...)
    • 当然,第一次接受继承重写接口实现等抽象概念,并在第三次作业中实现,收获良多
  • 第二单元:电梯多线程

    • 我感觉这是几次作业中最难的一个单元,也是没有掌握好的一个单元。
    • 这一单元的内容——多线程,几乎可以开一门一学期的课程去讲解,三四周的学习我觉得有些仓促了。
    • 架构设计上,我在认识上实践上,都体会到一句话,"每个对象只管自己要管的事情",明确了对象的边界之后,尝试了对象之间的消息传递,以及一些设计模式,我认为自己在面向对象的思想上还是有很大进步的。
    • 但这一单元最终作业完成的特别不好,我认为是我没有学明白多线程,直到现在我依旧很虚多线程,这也是我暑假要补起来的一部分(似乎数据库可以补吧~
  • 第三单元:图论地铁站 + JML规格

    • 这一单元引入一个新的内容,JML以及规格的概念,这个在软件工程开发时应该比较有用吧。。
    • 不过从实际编程来看,还是大一数据结构的内容。
    • 这一单元,我尝试类与类之间,方法与方法之间的”高内聚,低耦合“,但失败,期待一套软件的工程学方法,而不是有点类形式主义的规格。
  • 第四单元:UML及其相关解析

    • 这一单元再次看到助教霸霸们高超的编程水平~
    • 采用了抽象工厂、分层次等架构设计
    • 在这次总结中,也从UML初窥软件工程

四个单元中测试与实践的演进

  • 测试,总结起来,黑盒测试,针对指导书要求的白盒测试,Junit单元测试
    • 第一二单元,多采用黑盒测试,针对指导书要求的白盒测试,类似于“覆盖性小测试集,压力型随机测试集”的模式
    • 第三单元,接触Junit测试工具,采用之后效果很好
    • 第四单元,由于期末考期时间比较紧张,故未采用Junit测试
  • 但经过三单元的作业之后,我认为单元测试,是未来软件工程测试的必须。

课程收获

  • 收获很多,但也有很多的遗憾和不甘,先说收获。

    1. 熟练应用Java这门面向对象的编程语言
    2. 初步掌握了面向对象的基本概念,继承多态接口等
    3. 大量的代码练习,熟练度架构水平提升
    4. 了解到了Jetbrain这一类强大的IDE
    5. 学习了很多软件工程中的知识,如JML、UML
    6. 听了两位业界工程师的讲座
  • 不甘...或者说没学到的:

    1. 代码量大了,但是我不认为自己的软件工程能力提高了。
    2. 多线程的内容,学的非常不好。
    3. 没有多学习优秀同学的代码,自己的编程能力进步不够。
  • 所以,现在虽是OO课程的结束,但也是新的软件的工程能力培养的开始,假如大家看到这里,有什么学习的书籍和实践平台的建议或推荐,感谢啦🙏

三个具体改进建议

  1. 教好一个方法或者思想就好,内容不要过于的丰富繁杂。
    之前看一个TED说一个演讲之能说一个内容,而且这个内容就是主线内容,我想课程也是这个道理。计组实践课全程教授了一套工程化设计实践方法,配以较多的练习来帮助掌握。但是OO四个单元,型散且神散(假如冒犯,那非常抱歉...我是真的愚钝的不知道主线是啥......)

  2. 建议理论课多与同学们交互(课堂上的相互交互和课下的反馈),可能不少同学反映,理论课对实践课帮助不大,听不听都行。

  3. 可以参考一下国外高校的软件工程授课思路和实践平台,我感觉学完这门课程,我的软件工程能力没有提升太多,是不是需要结构性的改变?(这个我暑假会找相关资料弥补我这学期的缺漏。)

OO不是结束,是暑期软件工程能力提升的开始。
真诚感谢老师和助教一学期的付出,谢谢!

posted @ 2019-06-24 21:45  yzy11235  阅读(346)  评论(5编辑  收藏  举报