Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1546648
  • 博文数量: 596
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 173
  • 用 户 组: 普通用户
  • 注册时间: 2016-07-06 15:50
个人简介

在线笔记

文章分类

全部博文(596)

文章存档

2016年(1)

2015年(104)

2014年(228)

2013年(226)

2012年(26)

2011年(11)

分类: 架构设计与优化

2013-12-27 12:36:21

概要设计文档:文档内的每个结构是对同一事物的不通侧重
基本流程:实现的流程
整体框图:划分为多少模块,模块间如何协作
时序图:不通类协作的时机与方法

1. 确定要实现哪些功能,一个一个列出;
    有功能点才有目标,不然乱作一通
2. 搜集资料,分析实现这些功能的方法,给出流程,给出方案,分析可行性
    较详细的原理和可行性分析
3. 确定方案对外提供的接口
    接口方便同步开发,多人团队可以有接口可用
    1)完成任务,是否需要外部数据,也就是是否要输入参数
      
  1. void done_work(int num)
    2) 该操作能否保证成功,能保证成功就不用返回值了,搞个void

  1. void done_work(int num)
   3)是否需要返回数据给调用方

  1. void done_work(int num, int *out)
     4)肯定成功,不需要参数,那给函数取个名字就行

  1. void done_work()
 
3.1接口的定义
提供接口给外部使用
内部实现需要的关键函数接口,内部使用

3.2 接口直接的关系
接口需要发送处理后的信息,因此需要提供错误值,入参

  1. void send_result(int result);
 

4. 模块内部的设计
1)设计内部交互的数据格式
2)设计自己用的关键函数
a)C++
完成模块间交互信息的要求,对类的内部进行设计,需要哪些成员函数来实现.
b)C
设计函数接口,或函数指针接口

4)画出序列图,搭好整个框架,以此框架为模板,编码(函数实现放空)
5)实现内部函数
 
  举例:
   完成自动登陆
   1) 如果不知道怎么做,或者思路到一半卡壳了,甚至完全没思路就要做分析了。
   2) 首先,明确要完成的功能——完成用户名密码自动登陆。
   3) 然后,需要用到的资源、数据、信息——用户名,密码
         简单讲,就是完成登陆的函数是否需要输入参数 int done_work(int num, void *data);
  4) 能否在同一个进程或线程内完成操作,如果完成登陆操作不在同一个进程或线程,那就涉及到多进程或多线程。
         单进程或单线程则结束。
   5) 那需要传递数据了,使用共享内存或者管道之类的。
   6) 同步:传递数据的时候是否需要同步,不然接收方都不知道数据来了没,发送方也不知道发送方不知道何时可以发送数据

       
  1. 发送方        接收方
  2. ————          ————
  3. -       <-    准备好了
  4. 发送数据 ->      -
  5. -             处理好了
  6. -       <-    发送结果
   7) 比如需要继承系统给的接口完成类,并做成DLL,那就实现该类。
       a) DLL可能被系统加载,你还是可以跟DLL通信的
      b)实现类的时候,并不是只实现接口函数,完全可以定义私有函数完成诸如a)的功能
   end)

  8) 多程通信
设置事件等同步异步方式, 不能只考虑通信的双方都存在的情况,
要是其中一方不存在,启动后是否会受影响
    A    B
    A    =
    =    B


  =============================================
    TIPS
  =============================================
5.
需求时刻在变!!!你不能够把所有的情况都考虑到,但是你能够考虑到基本的情况,也就是必须提供的
设计的时候,并不能一次性定下所有的策略,比如加密用RC4或RSA等,但是基础的数据大部分是可以确定的。

  1. 1. 加密数据及认证的时候,可以保留字段
  2. struct client_managercenter_datastu {
  3.     int magic;
  4.     int length;
  5.     void *data;
  6.     int reverse[4]; //保留字段,用于认证加密
  7. }
 6. 模块间的设计原则
1)做架构设计时,只关注模块的输入与输出,至于模块内部如何处理,不用理会
2)确定模块间的通信方式,TCP或者IPC


7. 针对IP,端口等默认的消息,
设计成由一个配置中心统一管理且可配置,需要数据则从该配置中心获取

8. 消息的规则

8.1.数据接收方定义信息的内容。
8.2. 消息应是一个问题,或者一个命令,但不能两者皆有。
1)问题类消息:要求对象提供一些信息,所以总是有回应。问题类消息不改变对象的属性。
例子:现在几点?你有几个孩子?
2)命令类消息:告诉对象执行某个操作,不需要回应。命令改变对象的属性
例子:电脑关机
//待讨论
3)通知:消息给对象,对象不返回数据也不执行操作。
4)问题类消息不能是多个问题的集合,或者多个命令的集合,或者问题和命令的集合,或1个命令
5) 合并多余的消息
  认证请求->认证响应(成功或失败)->端口请求->端口响应(port)
  认证请求->认证响应(成功+有效port 或 失败+无效port)
8.3协作过程中(通过socket)传递命令和数据
结构体转为字节流

9. 图表
软件结构体,展现系统或模块内由哪些组件组成
序列图,组件是交互的顺序与操作

10.一个工作无法直接做完,需要分步完成,则引入状态state
比如更新后,需要重启完成更新,最后校验:UPDATE_BEGIN, UPDATE_REBOOT_CHECK,UPDATE_FINISH

11. 设计交互协议时,不能够使用宽字节

  1. struct protocol {
  2. WCHAR magic[32];//error
  3. int major;
  4. int minor;
  5. }


阅读(1886) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~