通过软件架构来达到易用性-软件策略

来源:互联网 发布:linux系统用户创建 编辑:程序博客网 时间:2024/06/06 03:26

通过软件架构来达到易用性

上一篇翻译了易用性的好处,主要包括:提高用户工作效率、减轻错误的影响、提升用户自信和愉悦感。这章翻译26个场景中需要用到的软件策略。

分割

分割是应对复杂问题最基本的技术。把一个大的复杂问题分割成几个小而简单的问题,分而击之,然后统一起来就把这个大问题给搞定了。这个技术的成功运用起决于统一的难度。如果说分割后的几个小问题,它们都关注不同的方向,互不干扰,那么组合起来就很简单。如果不是,那么它们之间就需要大量的通信配合,这个分割就很失败。耦合性这个词就是用来描述不同部分之间的通信量和配合的必要性的。低耦合表明分割可以达到解决复杂问题的目的,高耦合就表明分割不能很好的解决问题。

分割的精粹在于选择的各个部分它们关注的问题都不一样。下面的一些策略就是用来描述被分割的各个不同部分的。我们首先从功能的封装开始,分割的各种形式其实都是功能的封装,但是我们用它来描述除了数据独立于命令、数据独立于视图、创建独立于执行之外的分割。

功能的封装

封装是软件工程中最基本的方法。它的意思就是把功能封装在一个模块里面,只暴露一些必要的接口来实现这个功能,除了接口之外,所有的东西都被隐藏在模块里面。这就是分割,因为封装的功能和其他功能分开了。封装可以让开发人员在模块内改变算法而不影响系统的其他部分。

数据独立于命令

从命令中把数据分开,可以让多个命令执行在多个数据上面或者让一个命令执行在多个数据上面。当用这个方法的时候,数据从命令中分割开来。当命令或者数据是动态的时候,这个策略最合适。在这种情况下,执行命令所需要的数据可能变化或者用户很可能指定别的命令。

数据独立于视图

数据独立于视图使得同一个数据可以有多个视图表现。数据封装具有读取和修改功能。对于用户怎么表现数据的描述有很多,比如说数据单位、语言、过滤器、组合、样式表等等。数据独立于视图,使得不同的用户可以根据自己的喜好来看数据,并且对于一些用户来说,可以隐藏数据,甚至可以根据不同的平台展现不同的视图。

创建独立于执行

动作的创建独立于执行对于所有的软件开发来说,也是一个基本的方法。这种分割是关注分离的一个例子,因为动作创建和执行所需要的支持是不一样的。对于动作创建,我们可能更关心它的意义。对于动作执行,我们可能更关心它的行为。动作创建可能像点击菜单一样简单,也有可能需要用到脚本语言那样复杂。动作可能需要在系统多个执行之间传来传去,也有可能只在当前执行中,甚至可能在当前执行结束后被分配到其他活动当中。

复制

复制就是在软件系统中对实体创建多个副本或者变体。这个实体可能是数据也可能是功能。一般复制的目的就是提高性能、提高可靠性或者提供可替换的路径来达到特殊的目的。

数据

复制使得系统在不同地方维护着数据。复制的原因有时候是为了提升性能,有时候呢是为了可用性。提升性能的一个例子就是在不同地方里缓存着同样结构的数据。比如说,网页有本地缓存,这样就降低了从网络获取数据的时间。另一个例子就是保存不同结构的数据,比如说,大数据被索引表维护着,用来提高搜索的速度。提高可用性的一个例子就是为了使系统从错误中恢复而保存一些数据。

无论复制的原因是什么,当数据保存在不同的地方的时候,他们需要保持一致。也就说,不管数据是从哪里来的,它们必须是相同的。有很多方法可以用来保证一致性,复制非常重要的一点就是保证数据的一致。

命令

复制命令是为了给不同的用户界面提供相同的功能。这些用户界面可能是远程的也可能是本地的,或者是给终端用户实现一个功能的替代路径。在任何情况下,不复制命令也可以达到同样的目的。

间接

间接就是在数据或者控制访问之间插入中介。不管哪种情况,间接都是降低耦合的另一种途径。

数据

我们用数据生产者和数据消费者来说明数据的间接联系。直接联系就是数据生产者把数据直接提供给数据消费者。这就意味着数据生产者和消费者之间是强耦合,并且消费者的信息被嵌入到生产者当中,反之亦然。也就是说,消费者的增加或者删除都会影响到数据生产者(反之亦然)。注册机制的使用就会使这个耦合关系降低。

怎么注册?提供一个独立的组件来分发数据即可。消费者向分发管理器注册说我对某一类的数据感兴趣,生产者当生产出特定的数据的时候,也向分发管理器注册。这个注册过程可以在创建时间也可以在执行时间进行。消费者和生产者分别直接关联分发管理器,但是彼此之间没有联系。消费者可以添加也可删除,而不影响生产者。

功能

在可完成同一个服务的各种替代方法中插入一个中介。比如说虚拟设备、虚拟工具包、策略模式还有工厂模式都可以看成是这一类。服务的请求者和服务提供者之间的绑定可以发生在执行之前也可以在执行的时候。在任一情况下,服务请求者都会用单一接口和功能管理器交互,功能管理器会把请求信息转发给适当的服务提供者。

录制

这个策略用来定时记录系统的状态以备将来之需。有一些变量是依赖具体系统的:

l 录制的频率

l 录制的具体数据

l 录制的数据用在什么地方

l 数据的持久化。有些程序,需要把数据永久保存;有些程序,易失性存储就可以满足其需求。

l 录制数据的一致性。有些情况,数据是一致的,因为在录制的时候会暂停程序的其他活动。有时候,数据的一致性没那么重要。而有些情况,需要用事务来保证数据的一致性。

抢占式调度

调度是计算机系统中分配资源给活动行为的一种策略。资源可能是物理的比如说内存、CPU、输入输出设备;也有可能是逻辑的,比如堆栈、旗标或者其他实体。

通常情况下,调度以抢占式和非抢占式为基础。一个活动行为有一个资源,它可能把这个资源拿走(抢占式)或者一直等待这个资源直到它自动退出(非抢占式)。由这两大类调度可以派生出很多调度机制。针对某一个资源的调度机制可以从这几方面考虑:资源类型、资源的最大使用率、资源的最小等待时间、任务的优先级。而调度机制的评估包括资源利用率、最差情况下的等待时间、平均等待时间等等。

抢占式调度允许软件系统可以同时有多个活动行为。实际上,以很小的时间尺度(微秒级)来看,活动并不是同步的,但是以较大的时间尺度(10毫秒级)来衡量,他们就是同步的。线程就是一个逻辑的活动序列。在给定的一个时间点,线程要么是活动的(正在消耗处理器资源),要么是阻塞的(等待资源)。拥有多个同时的活动可以说成是有多个线程。抢占式调度,多线程是最常用的策略。

模型

在系统中模型的目的是为了表示各种事物。在开发过程中,清楚地定义模型很重要,它们用来描述事物本身的行为或者用户的意图。

任务

在这种情况下,模型代表的就是任务。它用来决定上下文,这样系统才能知道用户想要系统完成什么并且提供一些辅助。

用户

在这种情况下,模型代表的就是用户。它决定了系统中的用户信息、用户行为和其他用户相关的方面

系统

在这种情况下,模型代表的就是系统。它决定了可以给用户适当反馈的系统行为。系统模型也保存了一些信息如完成当前活动需要的时间等等。