Shadowice!
home subtitles
设计模式小结
时间: 2022-06-14/ 分类: 开发/ 评论

设计模式听起来有点像加密通话

这是一篇讲解这些“黑话”的博客。

工厂方法模式

又称:虚拟构造器。

用来动态的创建对象,根据情况的不同来创建不同的实例。

实际上是一个创建对象的接口。

适配器模式

用来解决接口与实现不匹配的问题。

做一些中间的转化工作,来处理这些不适配的情况。

装饰器模式

将类再次封装,来为类增加一些新的特性。

比起多态,装饰器的好处是可以叠加。

策略模式

动态的切换算法,用来适配不同的情况。典型的例子是排序算法。

模板模式

通过抽象类实现公共的部分,而通过子类实现差异化的部分。

迭代器模式

基本思路是通过一个叫做迭代器的类型来统一各个容器的遍历操作。

访问器模式

有点类似于迭代器,基本思路是将操作与类型分离,从而可以使用vistor这个特定的类对一类对象注入特定的操作。

阅读全文...
ADT初学
时间: 2022-06-07/ 分类: 开发/ 评论

ADT 是 Abstract Data Type的缩写

ADT的本质是抽象。

关于注释部分

ADT内部的注释包括RI和AF

RI也就是Rep Invariant,表示不变量。

在RI当中我们需要声明关于ADT内部细节(也就是表示)的所有限制。

RI需要非常详细,不能有模棱两可的地方。

同时,我们需要在ADT的每个方法中都去维护RI,以保证我们无论对ADT进行什么操作,操作前后ADT都不会违反RI的约束。

而AF实际上是一个表示到抽象的映射。

本质上是形式化了Rep的语义,这样Rep就是清晰而没有歧义的。

关于表示泄露

表示泄露,顾名思义,就是将ADT内部的表示暴露给外界,这样表示就可能在意想不到的地方被更改。

解决办法是返回值全部使用不可变类型,如果一定要使用可变类型也要返回深拷贝,这样就能阻止表示的泄露。

阅读全文...
浅谈等价性
时间: 2022-05-31/ 分类: 杂谈/ 评论

等价性是软件构造当中一个非常重要的概念。

不过无论两个对象以何种形式等价,等价关系本身必须是对称,传递,非空,而且自反的。

Object类的等价

Object类默认的equals(),hashCode(),以及==运算符,实际上都是基于对象的地址的。

这种等价关系虽然安全,但是很多时候是不符合实用要求的,为此我们需要更多的等价性标准。

不可变类型的等价

实际上只要两个对象的AF映射到同一抽象,就是等价的。

因为如果不采取拆除封装的措施,已经无法区别两个对象。

关于equals()方法

实际上,如果传入的参数不是Object类,那么这是函数重载,而不是重写。

此时虽然可以通过编译,但很可能达不到我们想要的结果。

正确的方式应该是传入Object参数,重写该方法,使用instanceof与强制转换的方式解决这个问题。

关于hashCode()方法

hashCode是用于哈希表的辅助方法,实现时只需要注意一点,就是相等的对象必须拥有相等的哈希值。

当然,如果保证不使用基于哈希表的容器,也是可以不用管这些的。

观察等价性

不改变状态下,两个可变对象是否在自身的观察接口下表现相同。

行为等价性

如果初始状态行为等价,那么无论进行什么操作,结果都应该一致。

关于等价性的feature

哈希表内装载可变对象,一旦对象发生变化,哈希表的行为将不可控。

List类的等价只判定长度和内容是否对应相同,Date也是如此。

但是StringBuilder的等价和Object一致。

阅读全文...
软件质量
时间: 2022-05-24/ 分类: 杂谈/ 评论

这篇博客来讲讲写代码之外发生的故事。

质量评判

实际上一个软件是有许多维度的

可以按照按照是静态的一个时刻(moment)的还是动态的一个过程(Period)区分

也可以按照是编译之前(Build-time)还是编译之后(Run-time)区分。

还可以按照是源代码层级(Code-level)还是组件层级(Componet-level)来区分。

外部质量与内部质量

评判软件的好坏有许多不那么客观的指标

不过粗略的分,可以分为是外部的(影响客户体验)和内部的(影响开发者体验)

而内部质量决定了外部质量,这其中的确有一些哲学趣味。

外部质量

包括正确性,健壮性,可拓展性可复用性,兼容性,同构性,高效性,可移植性,易用性,及时性,可验证性

内部质量

包括可读性,代码行数,代码复杂性,代码可读性,整洁性,耦合性,等等。

阅读全文...
java 初学
时间: 2022-05-11/ 分类: 开发/ 评论

为了写实验粗略的学了一点java。

java特点

万物皆对象。

没有纯过程,只有方法,必须使用纯过程只能用static方法替代。

没有指针,因为所有对象都是引用。

java的哲学

其实java里很多规则都是为了防止某个人犯蠢把整个项目炸掉。

还有就是可移植性,可拓展可维修这些工业指标。

完成这些要求是要付出代价的,java特别僵硬,即使是很简单的功能你也要调超长的封装好的方法。

但也正因为僵硬,java的可靠性很好,一旦你付出了把简单问题复杂化的代价,你的代码会更好维护,更可读,相较于c++这类自由语言来讲更难出bug(java类型卡的死,没指针,而且异常机制做的很完善)

如何快速从c++转到java?

可以直接用的部分

循环,if,变量定义,方法声明,也就是代码的底层语法基本没有变。

稍微有点变化的部分

真的需要纯过程需要声明static方法。

方法前要加public这些访问权限关键字。

Map,set这些stl可以接着用,只是方法名和c++命名风格有所区别。

此外这些在java里都是功能的抽象(接口,ADT),真正创建的时候需要指明实现方式,如HashSet,TreeSet之类的。

对象都是new出来的。

java特色

java里所有的库都是以类的方式呈现的,一份java代码一般实现一个类,类和类之间互相引用靠import。

所以头文件就不存在了,直接调你需要的类即可。

String类的封装很好,有些操作建议用String类处理。

IO是靠一些繁琐的类实现的,做IO之前想好你要读什么,可以先读进来然后靠String的强大功能处理。

阅读全文...