分离具体业务,基于认知规律,抽象出通用指导原则。
整体原则
l 心智模型:感知;理解;目标、计划、执行、解惑、总结;
l 一致性:习惯、操做系统、品牌识别、关联软件、软件内部
原则:简洁、对比、流畅
视觉:配色、布局、排版、动画
媒体:文字、图像、音视频
交互:键鼠、触摸、手势
原则:下降复杂度
主次:重要(基本)、次要(详细)
分组:同类信息
分层:面向用户、面向设备
联想:运用比喻、类比辅助理解
原则:站在用户角度(使用用户语言、工做流、交互流),简单(步骤少、有向导),智能
目标(作什么)
被动任务通知:紧急信息、重要信息、普通讯息
主动任务导航:经常使用功能、全部功能(功能分组、子功能)
计划(怎么作)
分解流程,预计花费时间,分析使用者情绪
执行(作得好)
输入:模板、向导、默认值
提交:动做、响应、历史
处理故障:预防避免、提示改正、恢复、提交故障反馈
寻求帮助:提示、帮助文档、咨询反馈、远程协助
安装:硬件链接向导、一键安装环境,程序安装向导
调试:部署人员工具箱
培训:演示、试用、多媒体帮助文档、宣传材料
平常使用-主界面
l 待处理任务:区别重要性、复杂任务向导
l 经常使用任务:快捷访问,复杂任务向导
l 功能导航:提供全部功能的入口
平常使用-功能界面
l 多模块:划分子功能、划分功能步骤(向导)
l 数据显示:基本信息(列表)、详细信息;信息分组
l 表单提交:提供模板、提供默认值、隐藏高级参数;模糊查询、高级查询;
l 提交响应:主动(即时、长时)、被动(系统通知)、及时紧急通知
平常使用-处理故障
l 提示:输入错误实时提示、业务逻辑提示、提交后提示
l 恢复:向导
l 反馈:环境与日志输出向导
软件升级:自动升级、新功能使用向导
LOG、配色、功能模板、语言词典
职责独立:上层决定下层,下层提供可行性验证,上下层依赖抽象
通讯类型:请求响应(即时、长时)、通知
同步请求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)
类型分类
简单类型:char、char*等
结构体:Json
输入输出
参数能够做为输入或输出使用,默认为输入,若是是用于输出须要注明
回调
XXXCallback(int业务标识, 枚举类型 事件类型, object 事件参数)
XXXCallback(int业务标识, object 参数)
重构:去除超时参数(由实现方决定是否超时,而后经过返回值体现)、不加Sync
DLL主动通知
请求:例如链路创建与链路响应,支持一次请求中包含多条关联报文
通知:例如心跳报文、GPS信息上报
报文格式
报文 = 报文头 + 报文内容
报文头格式以下
字段
|
类型
|
长度(字节)
|
说明
|
起始标识
|
Int16
|
2
|
固定为0xAAAA,用于识别报文开始
|
报文内容长度
|
Int32
|
4
|
后面全部字段总长度
|
功能标识
|
Int16
|
2
|
用于识别报文类型
|
注册标识
|
Int32
|
4
|
相似于动态密码,客户端注册成功后得到
|
发送方事务标识
|
Int32
|
4
|
由发送方指定。当会话类型为请求型时,用于区别发送方的不一样请求;当会话类型为通知型时,固定为0。
|
接收方事务标识
|
Int32
|
4
|
由接收方指定。当会话类型为请求型时,用于区别接收方的不一样请求,特别的,会话开始的第一条报文,发送方的该字段填0;当会话类型为通知型时,固定为0。
|
事务标识
以链路创建为例,正常流程是客户端发送“链路创建”,服务器端发送“链路创建回复”。客户端发送时,在报文头填写“发送方事务标识”为X(X不为0,能够用递增的方式区别不一样请求过程),“接收方事务标识”为0;服务器发送时,在报文头填写“发送事务标识”为Y(Y不为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.WebBrowser、HtmlDocument
成员:GetElementById、InvokeScript、AttachEventHandler
复杂参数传递:JSON方式
对象:JavaScriptSerializer
桌面应用程序和WEB客户端的状态同步
桌面应用程序:属性(简单类型、各类集合类)
WEB客户端:JS全局变量(简单类型、Array对象)