OO总结

一、测试与正确性论证

测试:从需求出发,构造测试集,给出期望输出,可以证明程序存在bug,但是无法证明程序是正确的

正确性论证:从程序最终实现出发,基于程序逻辑,通过假设、推理、论证,证明程序的正确性。

两相比较下,正确性论证具有更高的严谨性,但是也需要投入更大的时间精力。故两种方法难分高下,有不同的应用场景,需要针对性使用。

二、OCL & JSF

OCL(Object Constraint Language),即对象约束语言,是一种用于施加在指定的模型(UML)元素上约束的语言。

其特点为:

1. OCL是一种精确的,无二义性的语言。

2. OCL是一种规范说明性语言,所有有关实现的问题都不能用OCL来表达。

3. OCL是一种纯表达式语言,它是具有没有任何副作用的申明性语言。

4. OCL是一种类型化语言,即OCL中的每一个表达式都是具有类的。

5. OCL不是一种程序设计语言,不能用OCL编写程序逻辑和控制流程。

OCL表达对模型元素性质的约束时,常使用如下三种形式:不变量、前置与后置条件、let表达式。

与我们在课程中使用的JSF相比,OCL更多将重点放在对象内的数据项,而JSF是围绕方法与类展开的。

同时OCL的约束能力功能强,但是JSF实现起来更为轻便快捷。

两者的关系有些像上面论述的测试与正确性论证,使用的时候需要视情况而定。

三、单电梯系统的相关图

UML类图

顺序图

状态图

四、课程总结

4.1  四个模块知识点之间的关系

第一单元:java与对象

课程:对象与对象化设计(1)、对象与对象化设计(2)、继承多态与抽象

作业:多项式加减、单线程傻瓜电梯、单线程可捎带电梯

第二单元:并发与安全

课程: java对象运行机制与多线程、线程的安全设计、面向对象的需求设计与设计原则

作业:多线程电梯、IFTTT、出租车

第三单元:抽象与规格

课程:过程抽象与异常处理、数据抽象、类型层次规格与迭代

作业:出租车+流量、出租车+红绿灯、出租车+特殊出租车

第四单元:测试与论证

课程:面向对象测试、基于规格的程序正确性论证、如何更好地进行设计

作业:覆盖率测试、正确性论证报告、UML模型

四个单元知识循序渐进,但是又相互关联。

4.2 自己的进步

  从第一次作业的“java从入门到放弃”,到现在轻松写出1k+行代码,拥有了一套电梯系统,随手召唤百辆出租车。OO一路走来,现在的自身的能力和做出的成果是三个月前,想都不敢想的。

  开始两次作业对java的不熟练消耗了大量的时间,不知如何抽象出对象,艰难地从面向过程向面向对象迈进,那个时候,一份在现在看来小case的作业,需要花上我几天的时间,全身心投入地攻克,并且写出来的代码在现在看来,真的有些不忍直视。

  接着进入多线程单元,犹记得自己和同学讨论了两天,脑海中仍旧一片混沌,设计框架理了一遍又一遍,又一次次推翻否决。不得不说,空想是最浪费时间的方法,把思路写出来、理清可以更好地帮助我们思考与解决问题。

  进入了被最多吐槽的规格设计单元,坦白地讲,我是质疑的、不满的,甚至在不知道自己熬夜到底在写着什么的时候,是有些愤懑的。但是渐渐地,我觉得jsf没有我想象中的那么鸡肋,我们写的小程序与大的工程开发就是小巫见大巫,也许jsf在我们的代码里看起来是一种作业的负累,但是在大的工程开发中是团队成员间的桥梁。

  一个学期的课程结束后,自己的进步是巨大的:

盲目测试>>>从代码中找bug

代码行数50+>>>封装、类层次划分

乱用try catch>>>尽量从设计保证程序鲁棒性

  当然抗压能力和处事交流能力也得到了锻炼:从一开始看到被报bug就会暴跳如雷,到理智面对。

4.3 对工程化开发的理解

  说道工程化就想起了学习计组的时候,高老板的工程化设计表格。不得不说,那个表格拯救了我混沌的大脑。

  这个学期的OO课程学习又是一次工程化设计之旅。每次作业,接到指导书,分析需求;进行整个程序的框架层次设计;然后进行细化,完善每个类的属性功能细节;完成了这些准备工作就可以着手码代码了。之后,对编写的代码进行测试;交作业,进行互测。

  从这个作业完成流程中,可以简单地抽象出工程化开发的流程:

    接到项目 --> 需求分析 --> 框架设计 --> 细化设计 --> 代码编写 --> 项目测试 --> 交付使用

  感觉工程化开发的核心就是将一些方法流程抽象成一个模板,进行严谨的、统一的规约,虽然不是十分灵活,但是在大的工程开发中可以保证规范性,有助于团队统一开发。

4.4 对课程的期望与建议

首先在课程体系上,希望在同学们具备了java基础后,先讲授规格设计单元,让同学们养成根据需求撰写代码的好习惯,而不像我们先写代码,然后根据代码实现编写JSF。 

对于互测,希望进行更加严格的审查,避免恶意扣bug,这种行为是非常过分的,应该进行严肃处理的。

另外,历次作业的指导书也需要完善。在这学期,很多次作业的指导书都出现了漏洞和巨大的问题,然后助教组和老师进行商讨后,又多次改动,对同学们做作业造成了很大的困扰。同时,也需要一个统一的、明确地信息发布平台,很多问题最后助教给出的答复可能在不同的群,issue上的答复也可能有改动,但是这些不是所有的同学都能知道,因为这些问题,很多的同学都在互测中被报了bug,然而并不是没有能力实现的问题,而是给出的需求不统一、不明确的问题。希望课程组能重视这个问题,并在下一届有相应的举措解决问题。

记录一下自己OO之路~

一个学期的课程就这样结束啦,撒花庆祝,感谢课程组老师和助教们的辛苦付出~

原文地址:https://www.cnblogs.com/jyqin1117/p/9225523.html

时间: 2024-08-08 17:31:26

OO总结的相关文章

OO (VS) SO

继续上一篇博文<SOA--面向服务的体系架构>,这次主要向大家阐述面向对象和面向服务的关系,请大家多提宝贵意见! OO(ObjectOriented,面向对象),用一张图表示OO进行系统开发的特性: SO(Service-Oriented,面向服务),用一张图表示SO系统开发与运行的特性: 通过这两图的对比,如果抽象一点来说的话,这两张图其实都是一样的,运用同一种思想:通过某种形式,关联颗粒.如果用微观和宏观来说,OO是微观的,SO是宏观的.不追求细节的话,可以说,两者都是抽象出具体形式(对象

hdu 5288 OO’s Sequence(计数)

Problem Description OO has got a array A of size n ,defined a function f(l,r) represent the number of i (l<=i<=r) , that there's no j(l<=j<=r,j<>i) satisfy ai mod aj=0,now OO want to know ∑i=1n∑j=inf(i,j) mod (109+7). Input There are mul

Python之OO 面向对象

Python之面向对象 在C++和Python中,都有面向对象的概念,但是两者有哪些重要的区别呢?用最简单的语言便是,C++把每一个用户(这里当然值的是使用代码的程序员)当做是潜在的可能的犯罪分子,可以提供给你的部分已经规定好了,不可逾越.Python则是个比较柔和的管理方式,它认为所有的用户都具有高度的自觉性,用户可以很自自觉的使用代码.更加生动的比喻见这里 类与对象 在Python中,类由关键字class定义,例如下面的代码: 1 2 3 4 5 6 7 class Student(obje

XX和OO(南阳oj1159)

XX和OO 时间限制:1000 ms  |  内存限制:65535 KB 难度:0 描述 XXOO 给你一个由X和O组成的串长度不超过80,统计得分. 每个O的得分为目前连续出现O的个数X的得分为0 输入 先输入T 代表有T组测试数据T小于1000 接下来T行串 输出 对于每行串输出得分情况(每次输出占一行) 样例输入 1 OOXXOXXOOO 样例输出 1+2+0+0+1+0+0+1+2+3=10 来源 MLFBM 上传者 ACM_杨明鑫 #include<stdio.h> #include

[Java 05 OO] (基础篇) 《Java开发实战经典》

p5OO 第五章 面向对象 (基础篇) Notes (1), Constructor / this / String   String str1 = "hello"; 解释 : 是把一个在堆内存空间的使用权给了 str1 对象.   String str2 = "hello"; str1 == str2 是 true   String 字符串的内容不可改变 (2), Java 常用的内存区域    1), 栈内存空间    2), 堆内存空间    3), 全局数据

《你必须知道的.NET》读书笔记三:体验OO之美

一.依赖也是哲学 (1)本质诠释:"不要调用我们,我们会调用你" (2)依赖和耦合: ①无依赖,无耦合: ②单向依赖,耦合度不高: ③双向依赖,耦合度较高: (3)设计的目标:高内聚,低耦合. ①低耦合:实现最简单的依赖关系,尽可能地减少类与类.模块与模块.层次与层次.系统与系统之间的联系: ②高内聚:一方面代表了职责的统一管理,一方面又代表了关系的有效隔离: (4)控制反转(IoC):代码的控制器交由系统控制而不是在代码内部,消除组件或模块间的直接依赖: (5)依赖注入(DI): ①

OO的片段

摘自C++编程思想: ------------------------------ 继承与组合:接口的重用 ------------------------------- 继承和组合都允许由已存在的类型创建新类型,两者都是在新类型中嵌入已存在的类型的子对象.然而,当我们想重用原类型作为新类型的内部实现的话,我们最好用组合,如果我们不仅想重用这个内部实现而且还想重用原来接口的话那就用继承.如果派生类有基类的接口,它就能向上映射到这个基类,这一点对多态性很重要. 虽然通过组合和继承进行代码重用对于快

OO先导课——建议

就课程内容和教学方式谈谈自己的意见和建议 课程内容:Java简介,java基础语法,继承,接口,存储机制 教学方式:课上讲课训练,下课作业 1.作业环节:交流与总结不够.上课测试仅仅是反应了正确率,有bug没有解决,有代码优化的不够.希望能在课上多和同学交流作业思路与心得,每个人都分享一些经验或者困难,因为仅仅在群里讨论的话不容易抓到重点,也没有一个系统的梳理和汇总.同时希望助教能每次选出一个最佳作业供同学们参考. 2.教学:简单串讲一下系统中主要的类和方法,希望能在一开始就对库有一个肤浅但相对

OO设计基本原则

OO本身就是一种大的设计模式,它是随着软件规模越来越大产生出来帮助人们建模和开发的理念,生来就带着封装.继承.多态等可复用基因.为了充分发挥这些基因的功效,使用者需要遵守一定的原则,就是所谓的面向对象设计原则.然而正确地使用这些运用这些原则并不容易,只有把这些原则吸收成为身体一部分的经验丰富的工程师才能在遇到各种问题时,灵活地使用它们.一些OO大师为了方便新手更好地理解OO原则,就根据经验假象了一些软件设计过程中经常碰到的问题,并给出了遵循OO原则的解决这些问题的设计方案,就产生了设计模式,正如

OO的五大原则:SRP、OCP、LSP、DIP、ISP

OO的五大原则是指SRP.OCP.LSP.DIP.ISP. SRP -- (Single Responsibility Principle 单一职责原则) OCP--开闭原则(Closed for Modification; Open for Extension) 现将近期整理的文档提供给大家,这里对LSP做重点的介绍,望对大家有帮助,在学习和使用OO设计的时候,我们应该明白:OO的出现使得软件工程师们能够用更接近真实世界的方法描述软件系统.然而,软件毕竟是建立在抽象层次上的东西,再怎么接近真实