HIT 软构 设计模式与异常与lab3

课程接近尾声,也到了最后的两章。感觉这两章内容也挺爆炸的。

首先单听理论最懵逼的decorator。结构如图所示:

图表 1 装饰器

上课听老师这个那个不要太懵逼。如果以课上为例子,也就是那个多种不同功能的stack,本质上就是利用隐式委托和特殊的构造函数相结合,也就是隐式委托的接口stack指向不同的具体实现后,就可以实现所指向的那个类的功能,再配合上重写,加入额外的功能,就可以实现功能的组合。一开始我纳闷怎么就实现了,后来老师的代码里构造函数是不一样的,也就是一步一步将委托和功能传递了过来:

图表 2 PPT代码

习题课代码也证实了这一点:

图表 3 习题课代码

之前提到的Java每个mutable类有对应的immutable类,实际上也是这样实现的,只不过immutable类型在调用mutator时会throw出异常。

另一个我很在意的就是迭代器。因为这其中有双向委托:

图表 4 iterator

之所以说有双向委托,是因为具体实现类需要调用iterator方法返回Iterator<E>,而Iterator<E>的三种方法的实现不能离开具体遍历的类型,比如List。也正是这一层原因,因此遍历时不能调用mutator,也就是不能修改遍历对象。如果一定要修改,要在Iterator中实现。否则实验一二都已经告诉我们这样会出bug。之前PPT有一个典型例子:

图表 5 典型例子

Visitor模式也是双向的,实现类中留有accept,visitor中visit方法调用欲实现类,这里指正PPT里的错误:

图表 6 错误

这里的两个方法应该函数名是一样的,是overload,目的在于可以灵活切换与匹配而不改变ADT的实现。

设计模式我比较在意的就这些。下面讲讲异常。

异常其实蛮简单的,注意一下checked和unchecked。注意这两个并没有明显边界,凡是能处理都是checked,反之unchecked。不过我们一般把error和runtimeexception称为unchecked,其他称为checked。然后error一般是系统层面的问题,unchecked exception就是code层。Checked大多数都是客户端造成。当然数组越界这一类也有可能是客户端的问题,比如a[n]的n为客户传进的参数,那这个时候也可以对之进行处理。Try-catch块的处理顺序注意下是否抛出异常的区别。

此外,assert断言不是默认开启的,需要在命令行中加入参数-ea,并且assert是Java的机制,与Junit的assertEquals等方法有区别,注意不要会混淆。

大概就这些吧。

上面这一些是考试前就写好了,现在是6月26日,临近实验三的ddl,简单说说感受吧。

第三个实验是HIT自己设计的,老实说有些地方自相矛盾,但毕竟lab3是今年新设计的,有瑕疵也在所难免,我相信课程组能看到这个问题并且在之后加以修正。

这次实验主要考察的是复用性,给我最深刻的感受就是一个好的rep设计和ADT设计对于软件开发的作用是多么的大。就比如在实现GeneralPollImpl的时候,事实上给定的rep根本无法完成某些要求,得自行修改或者新增rep。好的rep对于算法的实现至关重要。就比如说合法性检查和统计的部分,要求筛选和过滤合法和非法投票。但是原先的votes集合又没有和投票人联系,因此把votes改为Map,key的选择也很重要,一开始我把它改为voters为value,发现后续有可能有两个投票人选项相同就不好处理,因此改成key。仅仅是这样的改动是远远不够的,还得有非法集合,过滤筛选后的供统计使用的集合,更进一步的子类中统计反对投票的集合,这些rep的巧妙设计为算法的实现提供了巨大便利。

还有呢就是复用性和OCP这俩OOP的特性。我觉得最能体现这一点的就是策略模式,需要对策略作出修改的时候只需要新增加新的策略类传递给父类接口,这样就不必疯狂修改原来已经敲定的统计函数,这一点在任务14中尤其明显,根据反对票数决出谁是胜出者算法比较复杂,并且需要额外的rep,如果改动原有的统计将会牵一发而动全身,因此采用重载和继承可以解决这个问题,将修改的范围限制在了一两个类,避免大规模推翻重做。

然后就是git的使用,对于分支这件事,之前只是在理论上知晓,并没有实践过,一开始还走了弯路,傻乎乎的按照指导书来,后来才想到那github怎么办,TA并看不到我的分支,上网查了一波才发现是要push的,而且会自动创建:

(图片来源:(91条消息) GitHub创建分支两种方式_大道之简的博客-CSDN博客_创建分支

当然也有其他方式,具体链接放在这里:

GitHub创建分支两种方式_大道之简的博客-CSDN博客_创建分支

然后还发现就是,切换不同分支时仓库里的文件版本也会随之变动,确保了各个分支的独立性,经过一番探索GitHub仓库结构为:

Lab3大概就这些,希望软构课程越来越好。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值