Atitit Atitit.軟體相容性原理----------API相容 Qa7

来源:http://www.cnblogs.com/attilax/archive/2016/10/10/5944346.html
-Advertisement-
Play Games

Atitit Atitit.軟體相容性原理 API相容 Qa7 1. 相容性的重要性與反面教材1 2. 提升相容性的原則2 2.1. What 與how 分離2 2.2. 老人老辦法,新人新辦法,只新增,少修改,莫刪除3 2.3. 計劃趕不上變化,永遠api修改也不可能整齊劃一,反而帶來不相容的風險 ...


 

Atitit Atitit.軟體相容性原理----------API相容 Qa7

 

1. 相容性的重要性與反面教材1

2. 提升相容性的原則2

2.1. What how 分離2

2.2. 老人老辦法,新人新辦法,只新增,少修改,莫刪除3

2.3. 計劃趕不上變化,永遠api修改也不可能整齊劃一,反而帶來不相容的風險3

3. 把握API的生命周期andAPI分級3

4. 對相容性保持友好的api設計方法3

4.1. 細粒度的方法3

4.2. Ioc容器動態配置3

4.3. 把你的method()視為全局global的,確保每一個方法都不重名儘可能。。不要幻想有模塊命名空間等,這也是為了方便用戶查詢。。3

4.4. Api版本管理與 細粒度的方法Api版本管理4

4.5. 使用ioc方法。 容器正是個好東西啊4

5. 保持api相容性的新版本升級方法4

5.1. 不要重構以前的api內部具體實現,以達到無縫升級的效果4

5.2. 不要向已經發佈的介面里添加成員;創建新的介面來避免版本問題4

5.3. 創建新的api應該使用什麼標準???4

5.4. 增加功能 增加新api  而不是  修改舊的api5

5.5. 修改api (那就是儘可能不要修改api,使用增加來代替)5

5.6. 增加參數 (可以通過可變參數json來擴充參數)5

5.7. 增加返回值而原來apivoid。。可以直接增加返回值,或者返回在某個成員變數上5

5.8. Threadlocal5

5.9. 避免極端的意見在設計API的時候,一定要避免任何極端的意見,6

6. 如何廢棄api (使用depre標識,千萬不要刪除6

7. 我們的app現在使用v1.0api,如何慢慢切換到2.07

 

 

1. 相容性的重要性與反面教材

Java c#的相容性走很好,win也很關註相容性...

反面教材啊,也有啊..python3, cocos2d-js  v3.x的問題

 

 

一旦上述提到的5個API中的任何一個發生變化,可能會給他們帶來巨大的代價,用戶需要排查所有調用的代碼,需要更改一些協議,需要調整所有與之相關的部分,這些工作對他們來說都是額外的,在預期之外的。如果辛辛苦苦完成這些以後,還在測試過程中發現了相關的bug,那對用戶的打擊就更大了。如果API經常發生變化,用戶就會失去對這段程式的信任,他們會更傾向自己獲得源代碼以後,按照自己的需求進行修改,自行維護一個內部的API比調用一個不斷發生變化的外部API要容易接受的多,雖然這樣做和我們協同開發、模塊化開發的初衷是完全相悖的

保護用戶在API上的已有工作
用戶過去在調用API、基於API開發所做的工作,這樣才能給用戶帶來價值的同時,不破壞他們過去的勞動成果

2. 提升相容性的原則

2.1. What how 分離

例如,ui ,使用dsl  html5 css來定義 ui ,不要使用native winform式的3gl語言

後端, 數據操作使用linq,sql  ,不要自己寫一瓦代碼,麻煩的.

 別的例如游戲,使用介面模式..定義一些apidsl ,,使用實現來不同的實現..

 

例如cocos的定義場景,很麻煩的

// add bg

// var size = cc.director.getWinSize();

     this.bgSprite = new cc.Sprite(res.BackGround_png);

     this.bgSprite.attr({

         x: size.width / 2,

         y: size.height / 2,

     });

     this.addChild(this.bgSprite, 0);

 

使用dsl  html5 走容易的,還有標準的dw ide支持..可視化的ui設計.很方便的實現後端重構,不影響用戶..

<div style=background:url(xxxxx.jpg); x:0; y:0 >  </div>

後端解析這個html dsl 定義,生成canvas對象走ok...

2.2. 老人老辦法,新人新辦法,只新增,少修改,莫刪除

2.3. 計劃趕不上變化,永遠api修改也不可能整齊劃一,反而帶來不相容的風險

 

 

3. 把握API的生命周期andAPI分級

· API分級:內部使用;二次開發使用;開發或試用中;穩定;棄用API。避免API被濫用的同時,我們可以通過調整API的級別,來擴大其影響力,也能更優雅的結束一個API的生命周期。

 

4. 對相容性保持友好的api設計方法

4.1. 細粒度的方法

方法api功能越細,越任意單獨升級方法版本

4.2. Ioc容器動態配置

相容性的神器。。

4.3. 把你的method()視為全局global的,確保每一個方法都不重名儘可能。。不要幻想有模塊命名空間等,這也是為了方便用戶查詢。。

一般使用事件做uuid尾碼,基本可以確保不同。

 

4.4. Api版本管理與 細粒度的方法Api版本管理

可以直接在方法簽名增加  xxx_v2()這樣的實現版本方法即可。

粗粒度的api版本管理使用ioc組合不同的細粒度api

4.5. 使用ioc方法。 容器正是個好東西啊

 

5. 保持api相容性的新版本升級方法

5.1. 不要重構以前的api內部具體實現,以達到無縫升級的效果

除非絕對必要,不要重構以前的api具體實現,而是新增一個。。。重構以前的api難免增加bug,帶來不穩定。。 當然api介面的話,可以保留。。

就像java,很多升級都是重構以前的實現,可以帶來更高的性能等,但風險較大,對能力要求較高。。。普通公司,還是新增為主。。這樣新版本app可以使用新api,就版本app任然使用舊api即可。。

 

介面函數一旦發佈就不能改了,要保持相容性,拼寫錯誤也不能改了,所以要仔細檢查拼寫,否則會被同行嘲笑很多年。
著名悲劇:unix 的 creat

5.2. 不要向已經發佈的介面里添加成員;創建新的介面來避免版本問題

5.3. 創建新的api應該使用什麼標準???

簡單的,使用世界流行的,標準化的標準走ok..

例如ui方面,使用h5標準,不足了補充使用wpf,,優點是資料多啊,你都可以不需要寫api文檔了,直接使用這個標準的資料走ok,資料足夠..

後端語言api ??? 使用流行的java ,js  ,可以補充c#風格拉..  C++ ,obj-c不推薦..

5.4. 增加功能 增加新api  而不是  修改舊的api

最好是增加新的api。。這樣不用調整老的api..添加測試工作...

當然一些很小的的調整可以直接調整老的api

一些必須修改老api的,可以變成api0模式,在新的api裡面調用即可。修改bug模式。。

api的命名可以採用 xxxV2 的模式這樣就可以相容老api。。

 

5.5. 修改api (那就是儘可能不要修改api,使用增加來代替)

5.6. 增加參數 (可以通過可變參數json來擴充參數)

增加參數也可以通過threadlocal方式來實現,這樣就不用改動原來的方法簽名

5.7. 增加返回值而原來apivoid。。可以直接增加返回值,或者返回在某個成員變數上

5.8. Threadlocal

 

它還有一些類似的方式用來使用,就是在框架級別有很多動態調用,調用過程中需要滿足一些協議,雖然協議我們會儘量的通用,而很多擴展的參數在定義協 議時是不容易考慮完全的以及版本也是隨時在升級的,但是在框架擴展時也需要滿足介面的通用性和向下相容,而一些擴展的內容我們就需要 ThreadLocal來做方便簡單的支持。

簡單來說,ThreadLocal是將一些複雜的系統擴展變成了簡單定義,使得相關參數牽連的部分變得非常容易,以下是我們例子說明:

5.9. 避免極端的意見在設計API的時候,一定要避免任何極端的意見,

尤其是以下幾點:必須漂亮(API一定要漂亮嗎?前文已經說過了) API必須被正確地使用(用戶很難理解如何正確的使用API,API的設計者要充分考慮API被誤用的情況:如果一個API可能會被誤用,那麼它一定會被誤用) 必須簡單(我們總會面臨複雜的需求,能兩者兼顧的API是更好的API) 必須高性能(性能可以通過其他手段優化,不應該影響API的設計) 必須絕對相容(儘管本文一直提到如何保證相容,但是我們仍然要意識到,一些極少情況下會遇到的不相容是可以容忍的) 一些具體的實施方案在一個API不可避免要消亡或者改變的時候,我們應該接受並且面對這個事實,下麵列舉了幾種保證相容性的前提下,對API進行調整的辦法:將API標記為棄用,重新建立一個新的API。如果一個API不可避免要被消亡,這是唯一的辦法。 為其添加額外的參數或者參數選項來實現功能添加 將現有API拆成兩部分,提供一個精簡的核心API,過去的API通過封裝核心API上實現。這通常用於解決用戶需要一個代碼精簡的版本時。

 

6. 如何廢棄api (使用depre標識,千萬不要刪除

 

在一個API不可避免要消亡或者改變的時候,我們應該接受並且面對這個事實,下麵列舉了幾種保證相容性的前提下,對API進行調整的辦法:

· API標記為棄用,重新建立一個新的API。如果一個API不可避免要被消亡,這是唯一的辦法。

· 為其添加額外的參數或者參數選項來實現功能添加

· 將現有API拆成兩部分,提供一個精簡的核心API,過去的API通過封裝核心API上實現。這通常用於解決用戶需要一個代碼精簡的版本時。

· 在現有的API基礎上進行封裝,提供一個功能更豐富的包或者類

7. 我們的app現在使用v1.0api,如何慢慢切換到2.0

每一個api下麵有許多方法。。比如m1 m2

使用ioc方法。 先搞個api2.0 ,預設載入全部1.0的方法。。然後針對需要新加或者修改的方法,做2.0版本,然後在ioc裡面配置,讓api2.0使用那幾個新版本方法。其他的方法任然可以使用就版本,即是可以任意組合細粒度的方法啦。。

 

 

Ref參考資料

如何做到API相容 - 百度技術博客 - 51CTO技術博客.html

如何保持API的相容 - 永遠即等待的專欄 - 博客頻道 - CSDN.NET.html

atitit 軟體相容性原理與實踐 v6  qa3.docx

 

作者:: 綽號:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿爾 拉帕努伊 ) 

漢字名:艾提拉(艾龍)   EMAIL:[email protected]

轉載請註明來源: http://www.cnblogs.com/attilax/

Atiend

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、 Preparable介面 1.有prepare()方法,實現該介面的action在執行時,首先執行該方法,用於進行一些預處理。2.創建prepareXXX方法,則在執行XXX方法前,將先執行prepareXXX方法. 二、ModelDriven介面 1.該介面實現將T類中的屬性展現到actio... ...
  • 說明:TSelection 控制項,當在屬性 Proportional = True 為等比縮放時,拉動左下角,右上角會跟著移動。 適用:Berlin 10.1.1 (或之前版本) Firemonkey 修正方法: 請將源碼 FMX.Objects.pas 複製到自己的工程目錄里,再進行修改。 修正前 ...
  • keditor時一個免費的開源編輯器,很多公司在使用(百度編輯器也不錯)。最近為了做一個客戶信息管理系統,在發送郵件模塊用到這個編輯器,也算學習一下新的東西。 第一步:下載編輯器 到它的官網下載:http://kindeditor.net/down.php 第二步:選擇編輯器的樣式 根據需要,選擇合 ...
  • Atitit。木馬病毒原理機密與概論以及防禦 1. 定時截屏木馬1 1.1. QQ聊天與微信聊天木馬1 2. 文檔木馬1 3. 病毒木馬的觸發方式2 4. 遠程木馬2 5. 漏洞木馬2 6. 病毒木馬的隱藏機制2 7. 自我複製技術3 8. 木馬病毒的免殺3 9. 其他木馬病毒3 9.1. Gui接 ...
  • ''' list ''''''name=[1,2,3,4]print(name[0])#第一個print(name[:]) #全部#print(name[1:3]) #切片#print(name[-3:-1])#倒取值print(name[-2:-1])#[頭:尾] 顧頭不顧尾print(name[ ...
  • 又是在學數據結構的時候,發現了之前學習的知識遺忘很多,在發現對C/C++中關鍵字typedef的理解還是沒有到位後,我翻閱了學C++用到的課本,又問了度娘,也看了不少關於typedef用法的博客。於是我就想把我理解的東西整理下來。 一.基本解釋 typedef為C語言的關鍵字,作用是為一種數據類型定 ...
  • 這段時間看的部分感覺沒啥需要記錄下來的,個人也沒什麼想法,不過以後還是要多記,多寫 這個main方法是永遠不停的,其餘兩個從兩個不同的角度給出了同步的方法 總之:當多個線程共用可變數據的時候,每個讀或者寫數據的線程都必須執行同步。 ...
  • 每天一個設計模式-1 簡單工廠 1.簡單工廠的定義 提供一個創建對象實例的功能,而無須關心其具體實現(核心)。 雖然不能讓模塊外部知道模塊內部的具體實現,但模塊內部是可以知道具體實現類的。乾脆在模塊內部建一個類,用這個類來創建介面,然後把創建號的介面返回給客戶端;這樣,外部應用就只需要根據這個類來獲 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...