软构复习(三)

1.可维护性:软件发生变化时,是否可以以很小的代价适应变化。

什么是软件维护?
可维护性如何度量?
实现高可维护性的设计原则?

软件维护:修复错误、改善性能。
运维是软件开发中最困难的工作之一,处理来自用户报告的故障/问题。

纠错性:出现问题了的维护
适应性:部署环境或者软硬件的技术发生了变化的维护
完善性:性能或者功能的增强(主动性的)
预防性:在开发阶段就要考虑到可能发生的问题

软件维护不仅仅是运维工程师的工作,而是从设计和开发阶段就开始了
在设计与发生阶段就要考虑将来的可维护性
设计方案的“easy to change”

面向可维护性设计方法:
模块化:高内聚、低耦合
OO设计原则:SOLID(五个原则的缩写)、GRASP
OO设计模式:~~~
基于状态的构造技术;
表驱动的构造技术;
基于语法的构造技术:这里面主要要求使用正则表达式。

可维护性的度量?
修改起来容不容易,是否适应变化。
设计结构是否足够简单?
模块之间是否松散耦合?
模块内部是否高度聚合?
是够使用了非常深的继承树,是否使用了delegation替代继承?
代码的圈复杂度?
代码的重复度?

Halstead Volume:一个公式,计算可维护性度。
可维护性指数:

如何提高可维护性?
模块化编程:高内聚、低耦合;分离关注点(将某些事分离出去,交给其他来做)、信息隐藏。
评价模块化:
1.可分解性
2.可组合性
3.可理解性
4.可持续性(发生变化时影响范围最小)
5.出现异常之后的保护:出现异常后影响范围最小
做好模块化设计的原则:
直接映射:由现实来映射
尽可能少的接口
尽可能小的接口
显示接口:相对于隐式接口,就是两个模块之间的关系要展现出来。
信息隐藏

	自己的一写理解:首先这里的接口不等同于java中interface,这里的接口更像是模块之间的关系
		,或者说依赖。

开端开发:HTML语法、css、JavaScript。

SOLID:(重点)

单一责任原则(SRP):高内聚
开放-封闭原则(OCP):对已有代码的封闭,对其他代码的开放
liskov替换原则(LSP):
依赖转置原则(DIP):
接口聚合原则(ISP):

单一责任原则:
不应该有多于一个类型的原因使得一个类发生变化,这样的话,比如说两个原因
,现在我要发生变化,如果我符合了单一责任原则,每次的变化都只需要修改某
一个模块。
一个类,一个责任,责任分明。一个发生变化的时候就不会影响其他类了。

开放-封闭原则:
模块的行为应是可拓展的,从而改模块可表现出新的行为以满足变化
有些东西不能够更改的,当发生变化时我们只需要修改其他的东西。因为
有些东西不能改变,比如说被客户端使用了什么的。

里氏替换原则:牺牲了子类型的特性

接口聚合原则:
将大接口分解成多个小接口,因为大接口中的方法之间没有什么关系,可以分开
,来适应不同的客户端。

依赖转置原则:
具体的模块依赖于抽象的模块。也就是(面向接口)编程,这样软件不会受到其他不稳定
的模块的影响。因为接口比较稳定,而实现类可能发生很多变化,要避免和实现类(不稳定)
的直接接触。

2.面向可维护性的设计模式
Factory Method(工厂方法):不能让客户端知道具体的是实现。是为了配合装饰器模式
还有策略模式。
虚拟构造器,在客户端不知道实现的情况下使用具体类。在其中加入工厂方法
,客户端可以通过这个接口的实现类,这些实现类中返回具体的实现
类,注意返回的肯定还是接口,但是具体的实现不同,这样客户端
就不需要知道具体的实现了,就可以降低耦合度。

Abstract Factory(抽象工厂):不能让客户端知道具体实现的搭配。
当客户端需要多个对象时,而且这些对象之间是有联系的,之间有搭配,就可以
抽象工厂的方法。这样的原因是因为我们不能向客户端透露出去具体的实现,因
为表示泄漏,所以我们需要帮他去搭配,只是他不知道而已。

Proxy(代理模式):
某个对象比较“敏感”,不能被客户端知道,所以在他们之间加一个对象,作为
代理人,对那个对象的调用就是调用这个代理人,相当于中间商。两个都是接口
的实现,但是代理人的实现是调用的那个的实现。

Observer(观察者模式):
基于委托,当调用某个实现时,这个实现也会调用那个类的方法,并且有自己的
实现。这样就将同时那个实现是需要注册的,由“偶像”为维护。我的理解是这
样将委托建立起来的一种关系。

Visitor(游客模式):(是为了能够拓展ADT而做的操作)
扩展ADT,这个看起来违反了OCP,但是可以同过visitor,在ADT中有一个方法
,是通过调用visitor对象的方法来实现的,需要外部传入,但是只有一个方法,
但是因为是依赖的委托关系,所以当你需要用到这个ADT的方法时,他先通过工
厂方法创建一个对应方法的visitor对象,传入这个对象,然后就可以使用这个方
法了,这样子就可以适应多种变化,因为是动态的,client可以根据需求使用不
同的功能。

3.面向可维护性的软件构造技术
语法驱动的构造:
有一类应用,从外部读取文办数据,在应用总进一步处理。

概念:
	1.用grammer判断字符串是否合法,并解析成程序里
	使用的数据结构;
	2.正则表达式。

语法的构成:用语法定义一个“字符串”。
	将语法构成一个语法树:
	终止结点、叶子结点;
	产生式结点:产生终止结点或者产生式结点。最特殊的
		就是根结点。
	最基本的三种操作符:
		连接;
		重复;
		选择。
正则语法:
	简化之后可以表达为一个产生式而不包含任何非终止节点。

Parser将输入文本转为parse tree:

巴克斯范式(BNF):以递归形式描述语言的各个成分。

在java中熟练使用正则表达式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值