哈工大软件构造课后总结与思考——ADP OOP

一、数据类型与数据检验

▪ 静态类型检查:
– 安全免受错误影响。静态检查通过在运行时之前捕获类型错误和其他错误来提高安全性。
– 易于理解。它有助于理解,因为类型在代码中明确声明。
– 方便修改。静态检查使修改代码变得更容易,它能够识别需要同时更改的其他位置。例如,当您更改变量的名称或类型时,编译器会立即显示在所有使用该变量的地方的错误,提醒您同时更新它们。
▪ 可变性对性能和便利性很有用,但也会因为要求使用对象的代码在全局级别上表现良好而增加错误的风险,极大地复杂化了我们必须进行的推理和测试以确保其正确性。
▪ 确保您理解不可变对象(如String)和不可变引用(如final变量)之间的区别。
▪ 快照图可以帮助理解:
– 对象是值,在快照图中以圆圈表示,不可变对象有双边框表示其值不会改变。
– 引用是指向对象的指针,在快照图中以箭头表示,不可变引用则以双线箭头表示,表示箭头不能指向不同的对象。

关键设计原则是不可变性:尽可能使用不可变对象和不可变引用。 – 安全免受错误影响。不可变对象不容易因为别名引起的错误。不可变引用始终指向同一个对象。 – 易于理解。因为不可变对象或引用始终表示相同的内容,代码读者更容易理解和推理 — 他们不必追踪所有可能更改对象或引用的代码位置,因为它们不会改变。 – 方便修改。如果对象或引用在运行时不能更改,那么依赖于该对象或引用的代码在程序更改时不需要进行修订。

二、设计规约

▪ 规范充当了程序实现者和其客户之间至关重要的防火墙。
▪ 它使独立开发成为可能:客户可以自由编写使用该过程的代码,而无需看到其源代码;实现者可以自由编写实现该过程的代码,而不必知道它将如何被使用。
▪ 安全免受错误影响
– 一个良好的规范清晰地记录了客户和实现者依赖的相互假设。错误通常来自接口的分歧,规范的存在减少了这种可能性。
– 在规范中使用机器检查的语言特性,如静态类型和异常处理,而不仅仅是人类可读的注释,可以进一步减少错误。
▪ 易于理解
– 简短而简单的规范比实现本身更容易理解,并节省了其他人阅读代码的时间。
▪ 准备好进行变更
– 规范建立了代码不同部分之间的合约,允许这些部分在满足合约要求的情况下独立变更。
在实践中,声明性规范是最有用的。
▪ 前置条件(这些削弱了规范)使客户的生活更加困难,但如果明智地应用,它们是软件设计师工具箱中的重要工具,允许实现者做出必要的假设。

▪ 安全免受错误影响。
– 没有规范,即使对程序的任何部分进行微小更改,都可能成为引发整个系统崩溃的推倒骨牌。
– 结构良好、条理清晰的规范可以最大程度地减少误解,帮助我们通过静态检查、深思熟虑、测试和代码审查编写正确的代码。
▪ 易于理解。
– 一份写得好的声明性规范意味着客户无需阅读或理解代码。
▪ 准备好进行变更。
– 适当弱化的规范给实现者自由,适当强化的规范给客户自由。
– 我们甚至可以更改规范本身,而无需重新访问每个使用它们的地方,只要我们只是加强它们:弱化前置条件和强化后置条件。

三、抽象数据类型(ADT)

▪ 抽象数据类型以其操作为特征。
▪ 操作可以分为创建者、生成者、观察者和变异者。
▪ ADT(抽象数据类型)的规范是指其操作集合及其规范。
▪ 一个优秀的ADT应该是简单、连贯、足够和与表示无关的。
▪ ADT通过为其每个操作生成测试来进行测试,但在同一测试中同时使用创建者、生成者、变异者和观察者。
▪ 免于错误。一个优秀的ADT为数据类型提供了明确定义的契约,使客户端知道可以从数据类型中期待什么,同时实现者有明确定义的自由度进行变化。
▪ 易于理解。一个优秀的ADT通过一组简单的操作隐藏其实现细节,使得使用该ADT的程序员只需理解操作本身,而不需要了解实现的具体细节。
▪ 准备好变更。表示独立性允许对抽象数据类型的实现进行更改,而无需对其客户端进行更改。
不变量是ADT对象实例的一个在对象生命周期内始终成立的属性。
▪ 一个优秀的ADT保持其自身的不变量。不变量必须由创建者和生成者建立,并由观察者和变异者保持。
▪ 表示不变量指定了表示的合法值,并应在运行时通过checkRep()进行检查。
▪ 抽象函数将具体表示映射到其所表示的抽象值。
▪ 表示暴露威胁到表示独立性和不变量保持的两者。

▪ 安全免于错误。一个优秀的抽象数据类型(ADT)保持其自身的不变量,从而使得这些不变量在ADT的客户端中更不容易受到错误的影响,并且对不变量的违反可以更容易地在ADT本身的实现中隔离出来。显式地陈述表示不变量,并在运行时使用checkRep()进行检查,可以更早地捕捉误解和错误,而不是继续处理一个已经损坏的数据结构。
▪ 易于理解。表示不变量和抽象函数阐明了数据类型表示的含义,以及它如何与其抽象相关联。
▪ 准备好变更。抽象数据类型将抽象与具体表示分离,这使得可以在不需要改变客户端代码的情况下改变表示方式成为可能。

四、面向对象的编程(OOP)

面向对象编程的标准:
▪ 基本概念:对象、类、属性、方法和接口
▪ 面向对象编程的显著特征
封装和信息隐藏
继承和重写
多态性、子类型和重载
静态和动态分派
▪ Java中一些重要的Object方法
▪ 如何编写一个不可变类
▪ 面向对象编程的历史

五、ADP和OOP中的“等价性”

▪ 相等性是实现抽象数据类型(ADT)的重要部分。
– 相等性应当是一个等价关系(自反性、对称性、传递性)。
– 相等性和哈希码必须相互一致,以确保使用哈希表的数据结构(如 HashSet 和 HashMap)正常工作。
– 抽象函数是不可变数据类型中相等性的基础。
– 引用相等性是可变数据类型中相等性的基础;这是确保一致性并避免破坏哈希表表示不变量的唯一方式。
▪ 免于错误
– 正确实现相等性和哈希码对于与集合数据类型(如集合和映射)一起使用是必要的。这也对编写测试非常有帮助。由于Java中的每个对象都继承了Object的实现,不可变类型必须重写它们。
▪ 易于理解
– 客户端和其他程序员阅读我们的规范时,期望我们的类型实现适当的相等操作,如果我们没有实现这些,他们可能会感到惊讶和困惑。
▪ 准备好变更
– 对于不可变类型,正确实现相等性将引用相等性与抽象值相等性分离开来,从而隐藏了客户端关于值是否共享的决策。对于可变类型,选择行为相等性而不是观察相等性有助于避免意外的别名错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值