边界接口设计

用户交互设计原则、模板

分离具体业务,基于认知规律,抽象出通用指导原则。

 

总体原则

l  心智模型:感知;理解;目标、计划、执行、解惑、总结;

l  一致性:习惯、操作系统、品牌识别、关联软件、软件内部

 

感知体验

原则:简洁、对比、流畅

视觉:配色、布局、排版、动画

媒体:文字、图像、音视频

交互:键鼠、触摸、手势

 

理解内容

原则:降低复杂度

主次:重要(基本)、次要(详细)

分组:同类信息

分层:面向用户、面向设备

联想:运用比喻、类比辅助理解

 

任务处理

原则:站在用户角度(使用用户语言、工作流、交互流),简单(步骤少、有向导),智能

 

目标(做什么)

被动任务通知:紧急信息、重要信息、普通信息

主动任务导航:常用功能、所有功能(功能分组、子功能)

 

计划(怎么做)

分解流程,预计花费时间,分析使用者情绪

 

执行(做得好)

输入:模板、向导、默认值

提交:动作、响应、历史

处理故障:预防避免、提示改正、恢复、提交故障反馈

寻求帮助:提示、帮助文档、咨询反馈、远程协助

 

典型场景

安装:硬件连接向导、一键安装环境,程序安装向导

 

调试:部署人员工具箱

 

培训:演示、试用、多媒体帮助文档、宣传材料

 

日常使用-主界面

l  待处理任务:区别重要性、复杂任务向导

l  常用任务:快捷访问,复杂任务向导

l  功能导航:提供所有功能的入口

 

日常使用-功能界面

l  多模块:划分子功能、划分功能步骤(向导)

l  数据显示:基本信息(列表)、详细信息;信息分组

l  表单提交:提供模板、提供默认值、隐藏高级参数;模糊查询、高级查询;

l  提交响应:主动(即时、长时)、被动(系统通知)、及时紧急通知

 

日常使用-处理故障

l  提示:输入错误实时提示、业务逻辑提示、提交后提示

l  恢复:向导

l  反馈:环境与日志输出向导

 

软件升级:自动升级、新功能使用向导

 

风格指南

LOG、配色、功能模板、语言词典

 

 

跨平台接口设计原则、模板

设计原则

职责独立:上层决定下层,下层提供可行性验证,上下层依赖抽象

通信类型:请求响应(即时、长时)、通知

 

模板-PINVOKE

会话类型

同步请求DLL

类似于System.IO. Stream类的方法

int Read(byte[] buffer, int offset, int count)

 

异步请求DLL

类似于System.IO. Stream类的方法

IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state)

int EndRead(IAsyncResult asyncResult)

 

DLL主动通知

例如告警信息上报

 

基本概念

参数寻址方式

DoWork(MyStruct x);          要求零级间接寻址。     允许

DoWork(MyStruct* x);         要求一级间接寻址。     允许

DoWork(MyStruct** x);       要求二级间接寻址。     禁止

 

结构类型字节对齐

单字节

 

状态模板

启动

初始化开始-》各项设置-》初始化结束

 

正常运行

基本状态:连接、断开;接口:注册,注销,连接、断开事件通知

 

关闭

释放

 

 

函数模板

请求

Int  模块名方法名( [const] 类型1  _参数1 [const] 类型n  _参数n)

 

类型分类

简单类型:charchar*

结构体:Json

 

输入输出

参数可以作为输入或输出使用,默认为输入,如果是用于输出需要注明

 

回调

XXXCallback(int业务标识, 枚举类型  事件类型,  object 事件参数)

XXXCallback(int业务标识, object 参数)

 

同步请求DLL

重构:去除超时参数(由实现方决定是否超时,然后通过返回值体现)、不加Sync

 

异步请求DLL

 

DLL主动通知

代码模板


 

模板-SOCKET私有协议

会话类型

请求:例如链路建立与链路响应,支持一次请求中包含多条关联报文

通知:例如心跳报文、GPS信息上报

 

基本概念

报文格式

报文 = 报文头 + 报文内容

报文头格式如下

字段

类型

长度(字节)

说明

起始标识

Int16

2

固定为0xAAAA,用于识别报文开始

报文内容长度

Int32

4

后面所有字段总长度

功能标识

Int16

2

用于识别报文类型

注册标识

Int32

4

类似于动态密码,客户端注册成功后获得

发送方事务标识

Int32

4

由发送方指定。当会话类型为请求型时,用于区别发送方的不同请求;当会话类型为通知型时,固定为0

接收方事务标识

Int32

4

由接收方指定。当会话类型为请求型时,用于区别接收方的不同请求,特别的,会话开始的第一条报文,发送方的该字段填0;当会话类型为通知型时,固定为0

 

事务标识

以链路建立为例,正常流程是客户端发送“链路建立”,服务器端发送“链路建立回复”。客户端发送时,在报文头填写“发送方事务标识”为XX不为0,可以用递增的方式区别不同请求过程),“接收方事务标识”为0;服务器发送时,在报文头填写“发送事务标识”为YY不为0),“接收方事务标识”为X

如果客户端发起对同一号码的两次跟踪,那么两次跟踪的“发方事务标识”应该是不同的。

一个报文如果发方事务标识和收方事务标识都为0,表示是通知型会话;如果发方事务标识不为0,收方事务标识为0,表示请求型会话的第一条报文;如果发方事务标识和收方事务标识都不为0,表示请求型会话,但不是请求过程中的第一条报文。

 

注册标识

逻辑上用于鉴权,类似于动态密码。服务器端和客户端通信的第一组报文就是注册与注册响应(链路建立与链路建立响应),注册成功后,客户端获得注册标识,之后服务器和客户端通信的所有报文的报文头中,都包含该注册标识。客户端重新注册后会获得新的注册标识。

 

变长报文

有些报文中的部分字段是可选的或者是变长的,都可能导致报文的长度是可变的。这就要求,解码报文时需要逐字段解码。定义报文的字段时,用(*)表示该字段是可选的或是变长的。

 

解码规则

接收到的所有字节存放在接收字节队列中,先依据起始标识(0x55AA)寻找到可能的报文头,解码报文头,获得功能标识、报文内容长度、注册标识,验证功能标识合法性、验证报文内容长度小于等于1000、验证注册标识的合法性,如果验证不成功,继续寻找可能的报文头,如果验证成功后,读取报文内容字节,依据具体功能的报文结构逐字段解码报文内容,如果解码成功,则在队列中截掉该报文对应的字节(如果报文头之前还有字节,也截掉),如果解码不成功,继续寻找可能的报文头。

 

字节序

short(int16)int(int32)、long(int64)ushort(uint16)uint(uint32)、ulong(uint64)采用网络字节序编码,关于网络字节序的具体概念,请参见MSDN或是百度。

 

单字节对齐

因为服务器与客户端都是X86/X64平台,对字节对齐没有特殊要求,所以采用最简单的单字节对齐。

 

代码模板

 

模板-桌面应用程序与网页

会话类型

桌面应用程序发起请求

例如:桌面应用程序使用定位功能,发起在网页中显示地图位置的请求

 

网页发起请求

例如:在地图中已定位的图标(对应一个人)上,发起在桌面程序中对该用户的呼叫

 

基本概念

桌面应用程序

对象: System.Windows.Forms.WebBrowserHtmlDocument

成员:GetElementByIdInvokeScriptAttachEventHandler

 

复杂参数传递:JSON方式

对象:JavaScriptSerializer

 

状态模板

桌面应用程序和WEB客户端的状态同步

桌面应用程序:属性(简单类型、各种集合类)

WEB客户端:JS全局变量(简单类型、Array对象)

 

代码模板

 

 





posted @ 2016-08-03 09:10  K.NET  阅读(1486)  评论(0编辑  收藏  举报