![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
软件构造
文章平均质量分 53
HIT-1190201210-陈则睿
这个作者很懒,什么都没留下…
展开
-
软件构造第三次实验感想
实验过程中收获的经验和教训经验:设计模式真的很重要!好的设计模式能够节省我们很多时间,比如所本次实验的“变化”,正是因为我使用了装饰器模式的设计模式,因此我能够很快地适应变化。假如我使用了一个糟糕的设计模式,那么在变化那一节,我可能需要花几倍的时间去完成。教训:设计模式虽好,可不要深陷其中。我在做实验之前,花了整整一天的时间去设计设计模式,并且查了相当多的资料。可是,当我在实践的时候,我才发现理论和实践的脱节。虽然学到了很多有关设计模式的理论,但是如果不实践,那些只是终究不是你的。正是我在实践中不断原创 2021-07-08 00:43:00 · 158 阅读 · 0 评论 -
软件构造第二次实验感想
实验过程中收获的经验和教训经验:①通过实验,我对于如何设计ADT有了一个初步的理解。②通过实验,我掌握了Java的泛型相关语法以及泛型设计思想。③通过实验,我掌握了EclEmma等工具的使用。教训:①在完成实验时,一定要提前做好规划,不要把任务放到最后一刻。②要善用Git等版本管理工具,以便自己能够较好地管理自己的代码。③在设计ADT时,一定要进行CheckRep,以防止违背RI.针对以下方面的感受(1) 面向ADT的编程和直接面向应用场景编程,你体会到二者有何差异?答:面向ADT比原创 2021-07-08 00:40:49 · 177 阅读 · 0 评论 -
软件构造第一次实验感想总结
计算机系统大作业题 目 程序人生-Hello’s P2P 专 业 计算机类学 号 1190201210班 级 1903007学 生 陈则睿 指 导 教 师 吴锐计算机科学与技术学院2021年5月摘 要一花一世界,一叶一菩提。小小的hello中潜藏着大大的奥秘。本文将从计算机系统的角度,分析hello从诞生到消亡的原创 2021-07-08 00:38:56 · 293 阅读 · 0 评论 -
软件构造第十二章总结——正确性与健壮性
健壮性与正确性健壮性:不正确输入仍有正常的表现正确性:完全按照SPEC执行,不一致就直接报错。衡量健壮性MTBF:平均失效间隔时间。而正确性:MTTF,到失败时的时间。ThrowableThrowable包括Error以及Exception。Exception包括RuntimeException以及NonRuntimeExceptionRuntimeException此异常是程序员出错了。自己写的源代码问题。非运行时异常,是不可控因素导致的,在代码中验证也难以避免。Un原创 2021-07-08 00:37:02 · 203 阅读 · 0 评论 -
软件构造第十一章总结——设计模式
创造型模式工厂方法所谓工厂方法,就是用户想要获取一个抽象产品,但是我们不能暴露给他具体实现细节(比如说,我们不能直接让他调用实现类的构造函数)取而代之,我们为此抽象类专门做一个工厂方法,此工厂方法内选用不同的构造方法。即:把创建对象这个函数专门拎出来,变成一个抽象类,然后用户委托他去构造新对象。比如说,我们有一个抽象类Trace,有两个具体实现FileTrace以及SystemTrace,当用户创建一个Trace时,他必然要选择这二者之一的构造器进行构造。但是这就暴露了我们的内部实现。因此,我们不原创 2021-07-07 22:11:09 · 104 阅读 · 0 评论 -
软件构造第十章总结——面向可维护性的构造技术
可维护性的相关指标圈复杂度代码行数霍尔斯特德容积可维护性置属(MI)继承的层次数类之间的耦合度单元测试的覆盖度模块化编程高内聚低耦合分离关注点信息隐藏模块设计五原则直接映射少接口小接口显式接口信息隐藏内聚所谓内聚,就是一个模块里的所有内容,是否是为了一个单一的目标而存在的?如果不是,请把他们分开。OO设计五大原则单一责任原则SRP开放-封闭原则OCPL式替换原则LSP依赖转置原则(即基于接口而不是实现编程)DIP接口聚合原则ISP单一责任原创 2021-07-07 21:59:41 · 102 阅读 · 0 评论 -
软件构造第九章总结——面向复用的软件构造技术
复用的层级划分代码层面:方法,语句模块层面:类,接口库层面:API架构层面:框架复用的分类白盒复用:源代码可见,进而可以修改。黑盒复用:不可以修改,只能通过API来调用。常见的是委托形式,委托用户写的实现抽象类的具体类。框架的分类白盒框架:代码层面的继承,重写完成框架的拓展。黑盒框架:实现接口,通过delegation完成框架拓展。LSP子类型多态:客户端用同一方式处理不同对象。比如所,我的客户端用的都是Animal,我用的都是Animal规定的API进行操作。当我传进原创 2021-07-07 21:06:48 · 116 阅读 · 0 评论 -
软件构造第八章总结——等价性
等价性的定义自反对称传递定义等价性AF:AF映射相同结果,一样观察法:外部观察者对两个对象调用任何操作,结果一样,则相同。==以及equals基本类型判等要用==对象判等,使用==相当于使用object的equals,比较二者遥控器似乎是否相等,即是否指向同一片内存区域。设计ADT时,一定要重写equals,根据你的RI,根据rep之间的取值判断是否相等。HashCode当我们重写equals时,一定要写一波HashCode方法,否则HashCode默认是object里原创 2021-07-07 18:40:07 · 111 阅读 · 0 评论 -
软件构造第七章总结——OOP
静态方法以及实例化方法静态方法直接使用类名调用方法,实例化方法需要实例化对象进行调用。静态方法在内存中只有一份,所有对象共享(联系内存映射!)而实例化方法每一个对象都有一份拷贝。接口接口:确定ADT及方法内的SPEC。类则是具体实现ADT。使用接口,可以让我们有多个实现方式。使用静态工厂方法,隔离各个实现方式,使得客户端自由选择某种具体构造方法。default:接口中共性的方法,实现它的类不必再实现此方法了。信息隐藏通过权限控制符号来控制信息隐藏。使用接口声明变量。客户端仅仅原创 2021-07-07 18:30:57 · 124 阅读 · 0 评论 -
软件构造第六章复习——ADT
抽象数据关注抽象数据关注操作,而不关注数据本身。ADT是由操作定义的。ADT方法分类构造器 输入参数不可能是本类型对象。其他类型可选。生产器 输入参数必须有本类型,其他类型可选。观察器 输入对象必须有本类型,其他类型可选修改器 输入对象必须有本类型,其他类型可选总结:判断这四个,首先看输入有没有本类型,没有,一定是构造器;其次,看一下输出,输出如果没有本对象,则为观察期器。接下来看有没有改变本类型,如果改变了,则为修改器。表示独立性(并非表示不变量RI!)这是一个概念,内部rep不应该原创 2021-07-07 18:16:33 · 87 阅读 · 0 评论 -
软件构造第五章复习——设计规约
规约的作用设计规约,可以隔离客户端以及类实现者之间,进而达到防火墙的作用。规约应该有什么输入参数(Precondition)输出参数(Postcondition)异常(Exception)规约不应该有什么方法的局部变量以及rep默认绝不能改变输入参数规约的替换强规约替换弱规约,其中强代表:更弱的前置条件以及更强的后置条件。更强的规约,在图上也表示为更小的面积...原创 2021-07-07 18:01:35 · 79 阅读 · 0 评论 -
软件构造第四章复习——数据类型以及类型检验
Java数据类型基本数据类型:immutable。对象数据类型:遥控器。动态检查以及静态检查静态检查:类型的检查,通常发生在运行之前。动态检查:与值相关的检查,比如除零错误,发生在运行时。(int和double!)可变以及不可变可变:值可变。所有的基本数据类型都是不可变的,在内存中创建之后,不可能再被指向别的了。可变对象指的是存储在内存空间的内容可变以及不可变,并非遥控器。遥控器只能说是能不能被重新赋值(final)不可变:当改变时,重新构造一个新对象。...原创 2021-07-06 23:43:01 · 95 阅读 · 0 评论 -
软件构造第三章总结——软件构造过程与配置管理
软件生命周期SDLC:0~1;1~n软件开发过程模型瀑布——线性非迭代增量——瀑布+增量,更好应对需求变化V模型——验证与确认原型设计——迭代螺旋——迭代+瀑布敏捷开发敏捷开发就是增量+迭代,每次迭代处理小增量。比如极限编程、配对编程以及任务版SCM以及VCSSCM:软件配置管理,跟踪软件的变化GIT:版本控制系统...原创 2021-07-06 23:37:12 · 99 阅读 · 0 评论 -
软件构造第二章总结——软件测试以及测试优先编程
测试用例测试用例就是输入+执行条件+期望结果测试优先编程先写SPEC再写符合SPEC的测试用例写代码,执行测试单元测试以软件的最小单元模型展开测试,隔离各个模块,定位错误,进行调试黑盒测试检查代码功能,根据SPEC写出测试,不关心内部实现细节等价类划分:边界划分,笛卡尔积VS.覆盖测试白盒测试考虑内部实现细节,尽可能提高测试覆盖度路径覆盖>分支覆盖>语句覆盖自动测试自动测试非自动生成测试样例,而是借助JUNIT进行测试回归测试当程序被修改之后,执行之原创 2021-07-06 23:31:11 · 88 阅读 · 0 评论 -
软件结构第一章学习总结
软件的多纬度视角按阶段划分:BuildTime以及RunTime按动态性划分:Moment以及Period按构造对象的层次划分:Code以及Component软件设计就是不同维度的转换外部因素以及内部因素外部因素重要,和客户相关但是内部因素决定外部因素要学会折中...原创 2021-07-05 23:59:31 · 352 阅读 · 0 评论 -
关于TestFirstPrograming的思考
问题描述在写第三次软件构造实验的时候,在写完api中的计算重叠率的函数之后,当我在client类中使用的时候,却得到了错误的结果。尝试解决在一开始,我认为是client函数出了问题,于是花了很多的时间去排查client里的错误。但是最终无功而返。最后,当我检查计算重叠率的函数之后,才发现是我的计算重叠率函数写错了。反思这次实验时间很紧,因此我并没有遵循测试优先的原则。最终导致我花了很多的时间去排除错误,表面上不写测试,节省了时间,但是这位后来调用此函数埋下了很大的隐患。因此,我们必须遵循测试优先原创 2021-07-03 10:35:30 · 60 阅读 · 0 评论 -
关于封装的思考
问题描述当我在软件构造课上听到封装的方法的概念时,对此并没很深入的理解,仅仅只是了解了这个概念。但是,在第三次实验中,随着实践的深入,我对于封装有了更深入的思考 。封装使你做好准备去改变在软件构造实验三中,有一个步骤是变化,也就是说需要改变你的代码,以满足新## 标题要求。当我分析代码时候,我发现我只需要改变ADT实现接口的方法即可,也就是说我只需要改变ADT,客户端并不需改变任何代码即可。之所以不需要改变客户端,是因为我并没有将ADT的内部方法实现暴露给客观端,因此我只需要改变ADT实现接口。封装原创 2021-07-03 11:17:33 · 64 阅读 · 0 评论 -
关于异常的思考
问题描述在写软件构造实验三的时候,我自定义了两个异常:时间段重叠异常以及时间段空白异常。一开始,我并不知道何时该抛出异常,何时该throws异常,导致一开始我们异常处理十分混乱。抛出异常代表着推脱责任抛出异常,也就是在方法名旁边写上throws语句,后面加上可能抛出的异常。但是,我们并不能把异常抛到底。在客户端一定要接受异常如果客户端不接受异常,而是抛出异常,那么他要把异常抛给谁呢?客户端必须利用try和catch语句,解决异常。异常处理程序这个和OS的异常处理程序一样,只不过JAVA的Try原创 2021-07-03 16:51:58 · 65 阅读 · 0 评论 -
关于装饰器模式的思考
今天在完成软件构造实验的时候,突然遇到了一个问题。问题描述:我通过装饰器模式构造了一个实例CourseIntervalSetMultiIntervalSet<L> CourseIntervalSet = new BlankMultiIntervalSet<L>(new NonOverlapMultiIntervalSet<L>(new PeriodicMultiIntervalSet<L>(new MultiIntervalSet<L>(.原创 2021-07-02 22:05:09 · 64 阅读 · 0 评论 -
对接口和ADT的理解
在做软件构造的时候,我一开始并不理解这两者之间的区别,后来随着实验的深入,我对于这二者之间的区别和联系有了一定的理解。首先,接口代表着一种约定。在接口中,定义了相应的函数,一方面,使得接口实现者知道自己将实现的函数的功能;另一方面,使得接口使用者知道自己能够使用哪些函数,以及这些函数的功能是什么。其次,ADT是一种抽象数据型,通常使用泛型实现。在数据结构课上,我们知道了ADT=数据+操作,为ADT使用者提供了他所需要的功能。最后,抽象和具体之间的关系:利用抽象,比如实现抽象类,能够让我们的类具有更大原创 2021-07-01 16:48:29 · 468 阅读 · 0 评论