概要設計思路

概要設計文檔:文檔內的每個結構是對同一事物的不通側重
基本流程:實現的流程
整體框圖:劃分爲多少模塊,模塊間如何協作
時序圖:不通類協作的時機與方法

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. }


<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(748) | 評論(0) | 轉發(0) |
給主人留下些什麼吧!~~
評論熱議
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章