接口和面向接口編程
1,抽象類
例如,Duck對象和Chicken對象的類型都隱藏在Animal類型的身後,向上轉型。建立契約,抽象類裏面的abstract方法,各個子命令類繼承或者覆寫。
面向接口編程,接口是個抽象的概念,可以理解為:面向超類型編程,當對象的具體類型被隱藏在超類型的身後,這些對象就可以相互替換使用,而我們的關註點就會從對象類型轉移到對象的行為上。也可以看成面向抽象編程,即針對超類型中的abstract方法編程。
Javscript是一門動態類型語言,類型本身比較模糊,除了number,string,boolean等,其他對象天生被向上轉型成Object類型。動態類型語言中,對象的多態性與生俱來。
因為javascript是動態語言,所以我們在業務代碼中經常插入一些跟業務無關的防禦性代碼。
TypeScript是微軟開發的一種編程語言,是JavaScript的一個超集,與CoffeeScript類似,TypeScript最終會被編譯成Javascript代碼執行,通過TypeScript我們可以使用靜態語言的方式來編寫JavaScript程序。
代碼重構技巧:
(1)提煉函數
(2)合並重復的條件片段
(3)將條件分支語句提煉成函數,語義化條件後更加容易理解
(4)合理使用循環,舉例如下:
var createXHR = function(){ var xhr; try{ xhr= new ActiveXObject( ‘MSXML2.XMLHttp.6.0‘ ); }catch(e){ try{ xhr = new ActiveXObject( ‘MSXML2.XMLHttp.3.0‘ ); }catch(e){ xhr = new ActiveXObject( ‘MSXML2.XMLHttp‘ ); } } return xhr; }; var xhr = createXHR();
上面是創建XHR對象的代碼,可以使用循環更加簡練:
var createXHR = function(){ var versions= [ ‘MSXML2.XMLHttp.6.0ddd‘, ‘MSXML2.XMLHttp.3.0‘, ‘MSXML2.XMLHttp‘ ];for ( var i = 0, version; version = versions[ i++ ]; ){ try{ return new ActiveXObject( version ); }catch(e){ } } }; var xhr = createXHR();
(5)提前讓函數退出,代替嵌套條件分支
每個函數只能有一個入口和一個出口,關於函數只有一個出口,嵌套的條件分支往往深信這個,但是實際上,如果對函數的剩余部分不感興趣,就應該提前退出。
(6)對於過長的參數列表,可以用對象參數代替,不用再關心參數的數量和順序,只要保證參數對應的key值即可。
(7)盡量減少參數數量
(8)少用三目運算符
程序員喜歡大規模使用三目運算符來代替傳統的if,else,理由是性能高,代碼量少。但是有時候會得不償失,如果條件復雜還是乖乖使用if,else吧
(9)合理使用鏈式調用
JavaScript中實現鏈式調用很簡單,讓方法調用結束後返回對象本身即可。但是鏈式調用的調試和維護比較困難。
(10)分解大類型
(12)用return退出多重循環
var print = function( i ){ console.log( i ); }; var func = function(){ for ( var i = 0; i < 10; i++ ){ for ( var j = 0; j < 10; j++ ){ if ( i * j >30 ){ return print( i ); } } } }; func();
針對return後面要執行的代碼,可以提煉成一個單獨的函數,然後執行。
【完】
接口和面向接口編程