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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...