何为易用性:
易用性关注的是对用户来说完成某个期望任务的容易程度和系统所提供的用户支持的种类。可以将易用性分为如下几个方面:
-
学习系统的特性
如果用户不熟悉某个特定的系统或该系统的某一特定方面,那么,系统可以如何使学习任务变得更容易? -
有效地使用系统
系统如何能提高用户的操作效率? -
将错误的影响降到最低
系统怎样使用户所犯的错误造成的影响最小? -
使系统适应用户的需要
用户(或系统本身)可以如何使用户的任务变得更轻松? -
提高自信和满意度
系统可如何使用户确信采取了正确的行动? - 易用性战术又分为运行时战术和设计时战术
运行时战术:
一旦系统执行,就可以通过为用户提供关于系统正在做什么的反馈,以及为用户提供发出基于易用性命令的能力来增强易用性。
人机交互的研究人员使用术语“用户主动”、“系统主动”和“混合主动”来描述在执行某些操作时,哪方采取主动以及如何进行交互。
当用户采取主动时,设计师设计一个响应,就如同实现其他功能一样。设计师必须列举出该系统的责任,以对用户命令做响应。
当系统采取主动时,它必须依赖关于用户的某些信息(一个模型),即用户所承担的任务或系统本身的状态。每个模型都要求各种类型的输入以完成其主动。
系统主动性战术就是那些确定系统用来预测其自身行为或用户意图的模型战术。如下:
-
维持任务的一个模型
在这种情况下,所维持的模型是关于任务的信息。任务模型用于确定上下文 ,以使该系统了解用户试图做什么,并提供各种协助。例如,知道句子通常以大写字母开头能够使应用程序纠正该位置的小写字母。维持用户的一个模型
在这种情况下,所维持的模型是关于用户信息。它确定了用户对该系统的了解,用户在期望的响应时间方面的行为,以及特定于某个用户或某类用户的其他方面。
例如,维持用户模型能够使用系统以用户可以阅读页面的速度滚动页面。
- 维持系统的一个模型
在这种情况下,所维持的模型就是关于系统的信息。它确定了期望系统的行为,以便为用户提供适当的反馈。系统模型预测了诸如完成当前活动所需要时间这样的项目。、
设计时战术:
在测试过程中,通常会频繁修改用户接口。也就是说,易用性工程师将为开发人员提供对当前用户接口设计的修改,开发人员将实现这些修改。这导致了对语义一致的可修改性战术的求精:
- 将用户接口与应用的其余部分分离开来
局部化所期望的变更是语义一致的一个基本原理。因为在开发中和部署后,我们预计用户接口会频繁发生变化,因此单独维护用户接口代码将会把变更局部化在某个地方。开发用于实现该战术并支持用户接口修改的软件模式为:- 模型-视图-控制器
- 表示-抽象-控制
- Seeheim
- Arch/Slinky
通过理解易用性我想到了一些实例
(1)在编程调试时候编程软件给的错误提示以及帮助信息。
(2)引用一个有特色能给用提供很好反馈的模板。
http://www.cssmoban.com/tags.asp?n=%E5%90%8E%E5%8F%B0
(3)比如一个软件系统简单明了目的明确的前端、也能给用户带来很好的体验。
(4)word纠正错别字等等。
(5)java树形结构菜单,供用户多级选择给用户带来便利:
/** * 获取无限级的类别资源 */ @Override public List<Object> findTypeTree() throws BusinessException { Map<String,Object> map = new HashMap<>(); map.put("EQ_parentId",0); Map<String, SearchFilter> filters = SearchFilter.parse(map); List<Order> orderList = new ArrayList<>(); Order order = new Order("sortNum"); orderList.add(order); Sort sort = new Sort(orderList); //默认查询出所有的一级类别 List<TypeInfo> typeList = (List<TypeInfo>) typeInfoRepository.findAll(DynamicSpecifications.bySearchFilter(filters.values(), TypeInfo.class),sort); List<Object> list = new ArrayList<>(); for (TypeInfo typeInfo : typeList) { JSONObject treeObject = new JSONObject(true); treeObject.put("id", typeInfo.getTypeId()); treeObject.put("text", typeInfo.getName()); treeObject.put("children", getChildren(typeInfo.getTypeId())); list.add(treeObject); } return list; } public List<Object> getChildren(Long parentId){ List<Object> list = new ArrayList<>(); List<TypeInfo> children = typeInfoRepository.findTypeInfoByParentIdAndSortNum(parentId); for (TypeInfo typeInfo : children) { JSONObject obj = new JSONObject(true); obj.put("id", typeInfo.getTypeId()); obj.put("text", typeInfo.getName()); obj.put("children", getChildren(typeInfo.getTypeId())); list.add(obj); } return list; }
(6)java撤销:
public class ConcreteCommand extends AbstractCommand{ private Adder adder = new Adder(); Stack<Integer> stack = new Stack<Integer>();//创建栈 public int execute(int value) { stack.add(value);//进栈 System.out.println(value+"进栈"); return adder.add(value); } public int undo() { int k=0; if(stack.isEmpty()) {//判断栈是否为空 System.out.println("栈为空,无法撤销!"); } else { System.out.println(stack.peek()+"出栈");//stack.peek()方法输出不删除栈顶元素 k=adder.add(-stack.pop());//stack.pop()方法输出并删除栈顶元素 } return k; } }