软件构造课程期末总结

        通过近半学期的课堂知识讲解和实验,我最终完成了对软件构造这门课程的学习。本课程以JAVA语言为基础,较为全面的讲解了软件构造过程涉及的多方面内容。下面,我会对学习的各个单元内容进行总结,谈谈收获。

        软件构造基础

        此单元主要讲述了依据软件构造的不同视角对开发过程进行划分和分析,宏观的介绍了评定软件设计的技术指标;介绍了软件开发过程的基本过程和开发模式,并介绍了相应的软件配置管理工具。

        而本单元中给人留下最深刻印象的就是以上的按照不同视角对软件构成的划分。一方面,先前对于程序设计等相关课程的学习,重点主要集中在语言特性,代码编写的相关内容(可以看到,这只包含在了Bulid-time,Code-level,Moment的一小块区域)。对于其他部分的了解(例如文件组织,运行测试等),也是粗浅的且不系统的。通过这样的基于不同视角的划分,更为清晰的认识了软件设计构成的各个方面,这种视角切换的思路可以很好的应用到今后的软件设计开发过程中,从多个角度对软件进行全面分析评价。另一方面,通过该部分内容的学习,还获得了许多有用的开发技巧。例如使用Code Snapshot,可以对程序当前运行时所处的状态进行简单的图表概括,加以分析;使用Code Churn,可以很直观的对比设计过程中发生的代码变化(在Git等中进行版本控制时这样的对比也尤为重要),便于对开发过程中的设计过程进行周期性的分析等。这个模型很好的概括了多视图下程序设计过程涉及的问题,并给出了相应的设计方法和工具。

        此外,本单元中还介绍了强大的软件控制管理Software Configuration Management(SCM)工具。以本学期我们一直在使用的Git为例,通过课程的三次实验,能很容易的体会到Git在软件开发过程中的强大能力。其包含的文件管理,版本控制,分布式系统等多方面的内容极好的契合了软件开发的需求。通过版本控制(正如我们在实验三中体验到的),可以更好的对软件的更新过程进行管理,便于代码的维护,扩展和应用。使用分布式系统,我们可以利用Github进行异地的软件设计开发,其对开源技术等方面的支持也尤为重要。通过对SCM工具的学习,能更好的了解中型,大型软件的开发环境,为今后的设计实践积累知识。

        ADT,OOP

        本单元为课程的核心重点部分。我们以JAVA语言为切入点,较为系统全面的介绍了OOP设计思路,以及各种相关技术。此前的涉及程序语言的课程学习中(程序设计,计算机系统)都以C语言为基础。可以看到,面向过程的编程过程能比较直观的反应问题的处理过程,其语言的部分特性也很好的与计算机底层实现相符合。但是,在现代软件开发环境下,其并不能很好的实现维护,扩展与复用。而面向对象的编程的出现,以ADT为基本构成单元,使用(数据+支持的操作方法)的组合思路进行程序设计,很好的解决了构成过程的封装,模块化复用等问题,也能更好的适应现代大型团队开发所需的低耦合模块的开发需求。

        在语言的学习基础上,我们首先学习了接口,类设计的文档设计。包括了类的specification,abstruct function,represent invariant等等。此部分的内容与2单元测试优先的软件设计过程思路非常贴近,都反应了重要的设计原则与思路:首先关注Client的需求以及其能够获取的信息,再对内部的具体实现进行设计。通过测试(往往指黑箱测试),可以确保用户需求的正常实现与满足;通过spec,划清用户与程序的契约关系,并封装类的功能;通过AF和RI;明确内部实现与外部抽象需求的映射关系;通过确保safe from rep leak,实现模块化设计并避免意外错误。在实现了以上的多种要求之下,完成的implementation才有意义。

        在此之后,又进一步的学习了JAVA作为OOP语言具有的相关特性。抽象类与接口,重写与重载,继承,泛型,等价性,等等。这些内容进一步体现了OOP语言相较POP语言具有的优势,在接下来的两个单元的学习中,我们也将看到这些强大特性如何支持了丰富的软件构造需求与设计模式。例如,JAVA多个方面的多态技术,极大的提升了类的可复用性。使用接口技术,将对具体对象的数据交流进一步抽象为面向接口的数据交流,等等。在实验过程中,更是能深刻体会到这些特性为软件开发过程提供的便利(例如第三次实验中的ADT抽象,以及基于委托,装饰器模式等方面的复用对节约实现成本的帮助)。

        面向可复用性与可维护性的软件构造

        本单元的内容,着重介绍了在OOP语言特性基础上实现复用性与维护性的设计开发过程,并通过最后一次实验对该部分内容进行更加直观深入的理解实践。

        首先,也是本单元最印象深刻的内容,是面向对象设计的SOLID原则:

        单一责任原则:当需要修改某个类的时候原因有且只有一个。

        开放封闭原则:软件实体应该是可扩展,而不可修改的。

        里氏替换原则:当一个子类的实例应该能够替换任何其超类的实例时,它们之间才应该有继承关系。

        依赖倒置原则: 高层模块不应该依赖于低层模块,二者都应该依赖于抽象;抽象不应该依赖于细节,细节应该依赖于抽象。

        接口分离原则:不能强迫用户去依赖那些他们不使用的接口。

        可以说,SOLID原则高度概括了面向对象编程的核心要求,而这些要求,也正是实现软件复用性与维护性的根本。以OCP原则为例,其后介绍的各类设计模式均在此基础上完成,简单的扩展而非大规模修改原类内部代码,将对已完成的封装类的扩展支持放到外部,通过委托,继承等多种方式实现,一方面实现对原类的复用性封装的要求,另一方面也实现对额外功能扩展的维护性要求。以最重点介绍的LSP原则为例,与面向接口编程的思路相似的,对给定方法(无论是接口方法还是继承方法)要求的一致实现,以及对该实现的上层抽象(接口和父类本身),使得实现过程能不依赖具体类,以此抽象概括实现程序的复用过程,而对抽象的具体实现的多样性,又同时为可维护性保证了空间。

        在此基础上,又进一步学习了几类设计模式实例。通过学习多代软件开发工作者总结的面对软件设计中一般问题的最佳实践,也从更高的设计角度对复用性,维护性实现有了了解。这些设计模式更为全面的涉及了OOP设计的多个方面,从语言特性到设计原则的众多内容。可以看到,通过对接口,委托,继承,重写等等方面的综合利用,能在满足以上原则的前提下解决复杂问题,从更高层次完成可复用性与可维护性需求(如模板模式实现的框架级复用等)。

        面向正确性与健壮性的软件构造

        本单元的内容,则主要讲解了JAVA的异常机制和测试机制,在此基础上实现软件正确性与健壮性。

        对于正确性与健壮性的理解,在学习内容中个人觉得最重要的思路在两点:1)外部Client,倾向于实现健壮性,对内部实现,倾向于实现正确性。 2)fail-fast。这两点要求基本覆盖了实现健壮性与正确性要求的大部分方面,例如:实现好的spec,划分契约职责;内部应时刻保证RI,不应该抛出本应能够处理或避免的异常;异常应在条件允许情况下尽早捕获处理,避免扩散,等等。

        而对于异常及测试机制,通过实验的实践体验,也深刻体会到这些机制带来的强大功能。三次实验中,依靠等价类划分,边界值等方法设计测试用例,依靠测试类进行代码测试,以至于使用EclEmma等工具进行测试覆盖度分析等等,这些丰富的测试用工具很好的保证了调试过程以及正确性检测,这是在之前的代码编写过程中不曾体会过的。同时,JAVA的异常机制显式的实现了部分计算机底层机制,使得开发过程中能够更加自由的处理各类正确性问题,在条件范围内使用try-catch等自行完成异常处理,保证健壮性;对无法处理的异常进行自定义化的消息提示和现场保护,终止退出,保证正确性的同时为纠错和维护留下空间,这也为软件开发设计工作带来便利。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值