软件构造学习笔记-实验3

本次实验要求从五项要求(航班管理、高铁车次管理、操作系统进程管理、大学课表管理、学习日程管理)里完成三项要求,并且尽量实现复用。

面向可复用性和可维护性的设计:PlanningEntry

1.首先设计一个类CommonPlanningEntry来实现共同的操作,比如创建新计划项、启动、取消、完成、获取名字、获取状态。
2.对于各情形的个性化特征

如果各应用在某个维度上的特征值完全相同,则可以将针对处理该共性特征
值的操作在 PlanningEntry和 CommonPlanningEntry中定义和实现,即实现完全的复用。如果在某个维度上的特征取值完全不同,就必须在各个应用的具体子类中分别实现其对不同特征取值的个性化操作。有以下几种方案。
3.方案1:将所有特殊操作均放入顶层的抽象接口
将各应用中出现的所有特殊操作都放入 PlanningEntry 接口中定义并CommonPlanningEntry 中实现它们。对各应用的具体子类,如果接口中的某个操作不适用于自己,则应用开发者不要使用它们。例如,override 后的方法体设置为空实现,或者直接 assert false,或者 throws new Exception。但是,这么做会导致各个应用子类中大量 override 空实现的方法,代码会很不美。另一方面,这种做法会导致违反 LSP 原则,因为子类中空实现的 block 方法不再符合接口中 block方法的 spec,子类型对象无法替代父类型对象。
4.方案 2:将各特殊操作分别放入底层的应用子类
将针对不同特征取值的具体操作分别放在五个应用的子类中加以实现。例如:针对高铁和进程应用的 PlanningEntry 子类中实现 block 方法,其他三个应用的 PlanningEntry 子类不需实现该方法。该方案的缺点是:某些方法的代码可能是重复的、分散在多个类中,可维护性和可复用性差,将来一旦面临变化就需要修改多处代码。
5.方案 3:为不同特征取值分别定义接口并在子类中实现其特殊操作
为每个维度上的不同特征取值分别定义不同的接口,在接口中定义特殊的操作,各应用的具体子类根据自己的需求来实现不同特征的接口。以“位置数量”维度为例:设置一个位置、两个位置、多个位置的接口。这种方案与方案 2 有同样的缺陷:某些局部共性的操作仍然需要在多个子类中分别 override。

6.方案 4:定义接口并实现具体类,通过继承树实现各应用在多维度上的不同特征取值的组合
在方案 3 基础上,除了为每个维度上的每个特征取值定义相应的接口,另外为每个接口分别构造一个实现类,该类一方面继承 CommonPlanningEntry中的全局共性操作,另一方面在该类中完成对局部共性操作的代码。(有种步步为营的感觉)缺点是如果同时考虑五个维度上的特征,将可能组合出非常多的子类数量,形成了庞大的继承树,给软件系统的维护代码极大困难。
7.方案5:CRP,通过接口组合实现局部共性特征的复用(推荐)
针对方案 4,通过 delegation 机制进行改造。每个维度分别定义自己的接口,针对每个维度的不同特征取值,分别实现针对该维度接口的不同实现类,实现其特殊操作逻辑。进而,通过接口组合,将各种局部共性行为复合在一起,形成满足每个应用要求的特殊接口(包含了该应用内的全部特殊功能),从而该应用子类可直接实现该组合接口。在应用子类内,不是直接实现每个特殊操作,而是通过 delegation 到外部每个维度上的各具体实现类的相应特殊操作逻辑。

8.方案 6:使用 decorator 设计模式
将 CommonPlanningEntry 看作是原始的、未被装饰的计划项实体,将这五个维度看作是五种“装饰”(每个维度的不同特征取值可以产生不同的“装饰”效果)。

面向复用的设计:Location
PlanningEntry 的某些子类型的 rep 中不可避免的需要表达“位置”信息。需设计 Location 类,它可以是接口、抽象类或具体类,是 immutable 的。
一个“位置”对象的属性包括:经度、纬度、名称、是否可共享使用。所谓的“是否可共享”是指:该位置是否可同时被多个计划项所使用。应用 3 中的“位置”是“某个 CPU 核”,它无需使用经度和纬度加以描述,只需使用名称区分即可。

面向复用的设计:Timeslot
不可变类。为一个单独的“起止时间对”设计 Timeslot 类,它是一个带有起始时间和结束时间的ADT,应包含日期(年/月/日)和时间(时/分),符合 yyyy-MM-dd HH:mm 的语法规则。例如:(2020-03-01 12:00, 2020-03-01 14:00)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

一:背景 1. 讲故事前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常????????的新结构,让我想到了当年的WCF,它统一了.NET下各种零散的分布式技术&#…

福利 | 全网疯传免费领,一整套算法课程,拿走不谢!

算法对于程序员而言,到底有多重要,这已经是一个老生常谈的话题了。我看过很多有潜力且非常努力的程序员,在进阶高级工程师或架构师的路上,栽在了“算法”上,说实话,我并不意外。如果说得功利和实际一些&…

软件构造学习笔记-第十二周

本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中,而不是通过if-else进行处理,提高了代码整体的简洁性。同时,异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息,对程序健壮性十分有…

C#中LINQ与数据管道

假如有一个集合,里面有数字1-10,现在想实现从这10个数字中取出偶数数字,然后将得到的偶数乘以10,最后输出前三个。代码如下:代码非常的简单,最后会得到20、40、60这三个数字,但结果并不是我们今…

软件构造学习笔记-实验4

磕磕绊绊也算是完成了最后一个实验。记录一下实验中遇到的问题。 IDEA中SpotBugs的安装和使用 从网上找教程,都说IDEA没有使用版权。结果我直接在插件中就找到了。点击安装并重启即可。 使用时,选择需要操作的项目/包/类点击右键,就能看到S…

使用ML.NET模型生成器来完成图片性别识别

什么是ML.NET?ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。借助此功能,可以使用应用程序的可用数据进行自动预测。机器学习应用程序利用数据中的模式来进行预测,而不需要进行显式编程。ML.NET 的核心是机器学习模型…

软件构造学习笔记-第十四周、十五周

课程进入了尾声。本周内容主要是线程安全相关。线程错误比一般的错误更加难以发现和修改,甚至加入一条print语句就能改变时间分片,从而导致错误消失。重点介绍了“锁”的机制,在使用时避免对整个方法进行lock,而是对可能发生线程不…

打爆你的 CPU

通过一段代码打爆你的 CPUIntro这是这个煞笔代码系列的最后一篇——Full CPU,相对来说也比前面三个简单一些,没有那么多的知识点。今天来尝试写一段代码,把 CPU 打满,让所有处理器的 CPU 使用率达到 100%,Lets do it.如…

吴恩达DeepLearningCourse1-神经网络和深度学习

计划在9月4日(截止日期)之前完成DeepLearning的所有课程学习。每个课程对应一篇博客,根据学习进度随时更新。 参考课程文章目录(一)深度学习概论结构化数据和非结构化数据提高效果的方法(二)神经…

吴恩达DeepLearningCourse2-改善深层神经网络:超参数调试、正则化以及优化

文章目录第一周:深度学习的实用层面训练、开发、测试集偏差、方差机器学习基本步骤L2正则化Dropout(随机失活)正则化其它正则化方法正则化输入神经网络的权重初始化梯度检验第二周:优化算法Mini-Batch梯度下降法指数加权平均指数加…

面向监狱编程:一伙人植入木马程序至 559 万部手机,盈利 33 万!

2018 年下半年以来,孙某(上海宏路数据技术股份有限公司副总经理)与苏某(北京亿量科技有限公司法定代表人)商议合作开展锁屏拉起广告业务(通过在用户手机上植入带有木马程序的 SDK,可控制手机在锁…

吴恩达DeepLearningCourse3-结构化机器学习项目

文章目录第一周:机器学习策略1正交化单一数字评估指标满足和优化指标训练/开发/测试集机器学习和人的表现第二周:机器学习策略2进行误差分析修正标注错误的数据使用来自不同分布的数据进行训练和测试数据分布不匹配时的偏差与方差的分析处理数据分布不匹…

程序员过关斩将--搞定秒杀,只需要这几步!!

“灵魂拷问秒杀这种大并发的写场景,直接分库分表开干?应对秒杀活动的流量高峰很难吗?不要拿淘宝级别的秒杀忽悠我秒杀活动特点我敢说凡是做过电商的同学,都会遇到运营展开的秒杀,限时购等“高并发”的活动。市面上也有…

吴恩达DeepLearningCourse4-卷积神经网络

部分内容参考之前的笔记 PyTorch深度学习实践 文章目录第一周:卷积神经网络边缘检测Padding、Stride三维卷积卷积神经网络中的一层池化层第二周:深度卷积网络实例探究残差网络1x1卷积Inception模块和网络卷积神经网络的迁移学习第三周:目标检…

那些鼓吹国内首个.NET 5框架的,该醒醒了!

前两天看过园子里有篇【国内首个 .NET 5 框架 XX 斩获 XXX stars,XXX 发布】,一顿羡慕嫉妒恨啊。我这.net core 3.1才上手没几天,还没用热乎呢,你这.NET 5的框架都出来了。我好难啊!不过难归难咱也得跟上啊。于是一个天高云淡的的…

吴恩达DeepLearningCourse5-序列模型

终于在八月末学完了这门课程,这个月虽然为此不停地忙碌,但每天都在进步也是一种乐趣。 吴恩达教授的课程循序渐进,适合初学者,非常感谢他的辛苦付出。 文章目录第一周:循环序列模型循环神经网络(RNN&#…

IdentityServer4系列 | 客户端凭证模式

一、前言从上一篇关于 快速搭建简易项目中,通过手动或者官方模板的方式简易的实现了我们的IdentityServer授权服务器搭建,并做了相应的配置和UI配置,实现了获取Token方式。而其中我们也注意到了三点就是,有哪些用户(users)可以通过…

数据结构 - 链表

准备重启尘封一年的博客作为学习笔记,看看自己能坚持多久。 最近会记录做过的算法题,语言描述只用于会意,仅供参考。 文章目录0.从尾到头获取链表的值(不是反转链表)1.寻找/删除单链表倒数第k个节点3.寻找单链表的中点…

[读书笔记] 《修炼之道:.NET 开发要点精讲》

《修炼之道:.NET 开发要点精讲》目录《修炼之道:.NET 开发要点精讲》第 1 章 另辟蹊径:解读.NET1.7 本章思考 > 位置 465第 2 章 高屋建瓴:梳理编程约定2.2 方法与线程的关系 > 位置 5192.7 线程安全 > 位置 5952.8 调用与回调 > 位置 6612.…

ASP.NET Core 使用 gRPC 初探

(RPC通讯示意图)为什么突然说到gRPC呢,其实以前就想说一说这个东西,也想尝试使用一下,一直没有机会,一直看我公众号的小伙伴肯定都知道,这几天一直在录制一个《eShopOnContainer微服务架构》系列…