基本介紹
- 中文名:遠隔作用
- 外文名:Action at a distance
- 領域:計算機編程
- 定義:程式設計中的反模式
- 方法:使用全局變數
- 來源:物理學中的遠距作用
定義,反模式,避免方法,
定義
遠隔作用是指計算機代碼執行時會受其他程式代碼影響,在程式調試過程,很難找到影響其他代碼的代碼,甚至無從下手。避免遠隔作用的方法是避免使用全域變數,利用可控制的區域變數來調整數據,或是使用有參照透明度的純函式編程或函式式程式語言。
遠隔作用造成的程式錯誤常是因為程式模組的特定功能在錯誤的時間動作,或是影響了不應當影響的變數。不過很難找出是哪一個模組造成的影響。一些看似沒有問題的動作的副作用使得程式在一個未知的狀態中,因此局部的資料也可能不是局部的,有可能受到其他模組的影響。改善遠隔作用的方式是定義一個模組可以影響模組的範圍。若在軟體設計時準確的定義各模組之間的界面,避免使用共享的數據或是全域變數,可以大幅減少遠隔作用造成的問題。有些面向對象程式設計設計原則也可以避免遠隔作用。得墨忒耳定律提到一個物件只能影響它鄰近的物件。若物體之間有必要有遠隔作用,必需用訊息傳遞的方式進行。適當的設計可以大幅限制遠隔作用的發生,因此也使系統比較容易維護。不良的界面設計會造成不羈的對象,上帝對象或是其他不依照得墨忒耳定律的物件。函式程式語言的好處是減少遠隔作用出現的可能性,若是使用純函式程式語言,甚至根本不會出現遠隔作用。
反模式
在軟體工程中,一個反面模式(anti-pattern或antipattern)指的是在實踐中明顯出現但又低效或是有待最佳化的設計模式,是用來解決問題的帶有共同性的不良方法。它們已經經過研究並分類,以防止日後重蹈覆轍,並能在研發尚未投產的系統時辨認出來。Andrew Koenig在1995年造了anti-pattern這個詞,靈感來自於GoF的《設計模式》一書。而這本書則在軟體領域引入了“設計模式”(design pattern)的概念。三年後antipattern因《AntiPatterns》這本書而獲得普及,而它的使用也從軟體設計領域擴展到了日常的社會互動中。按《AntiPatterns》作者的說法,可以用至少兩個關鍵因素來把反面模式和不良習慣、錯誤的實踐或糟糕的想法區分開來:
- 行動、過程和結構中的一些重複出現的乍一看是有益的,但最終得不償失的模式
- 在實踐中證明且可重複的清晰記錄的重構方案
很多反面模式只相當於是錯誤、咆哮、不可解的問題、或是可能可以避免的糟糕的實踐,它們的名字通常都是一些用反話構成的詞語。有些時候陷阱(pitfalls)或黑色模式(dark patterns)這些不正式的說法會被用來指代各類反覆出現的糟糕的解決方法。因此,一些有爭議的候選的反面模式不會被正式承認。這個概念很容易推廣到工程學以及工程以外需要人們付出努力去爭取的領域。儘管在工程學以外很少用到這個術語,但其概念是通用的。
避免方法
使用純函式
在程式設計中,若一個函式符合以下要求,則它可能被認為是純函式:
此函式在相同的輸入值時,需產生相同的輸出。函式的輸出和輸入值以外的其他隱藏信息或狀態無關,也和由I/O設備產生的外部輸出無關。該函式不能有語義上可觀察的函式副作用,諸如“觸發事件”,使輸出設備輸出,或更改輸出值以外物件的內容等。
純函式的輸出可以不用和所有的輸入值有關,甚至可以和所有的輸入值都無關。但純函式的輸出不能和輸入值以外的任何資訊有關。純函式可以傳回多個輸出值,但上述的原則需針對所有輸出值都要成立。若引數是傳引用調用,若有對參數物件的更改,就會影響函式以外物件的內容,因此就不是純函式。
使用函式式編程
函式式編程(functional programming)或稱函式程式設計,又稱泛函編程,是一種編程典範,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變對象。函式程式語言最重要的基礎是λ演算(lambda calculus)。而且λ演算的函式可以接受函式當作輸入(引數)和輸出(傳出值)。比起指令式編程,函式式編程更加強調程式執行的結果而非執行的過程,倡導利用若干簡單的執行單元讓計算結果不斷漸進,逐層推導複雜的運算,而不是設計一個複雜的執行過程。
全局變數代替局部變數
在程式設計中,全局變數是在所有作用域都可訪問的變數,與之對應的是局部變數。局部變數是擁有局部作用域的變數。通常,使用不必要的全局變數被認為是壞習慣,這正是由於全局變數的非局部性:全局變數可能被從任何地方修改(除非位於保護記憶體中),也可能被任何地方所依賴。於是全局變數便擁有了建立相互依存關係的無限可能,而互相依存關係的建立會使得複雜度增加,參見遠隔作用(Action at distance)。然而,在少數情況下是適合使用全局變數的。例如,可以通過全局變數的使用來避免常用變數在一系列函式間的頻繁傳遞。
面向對象設計
面向對象的設計方法與傳統的面向數據過程的方法有本質不同。面向對象的程式設計方法注重需求分析和設計反覆,回答的是“用何做、為何做”的問題,它使程式設計師擺脫了具體的數據格式和過程的束縛,可以集中精力研究和設計所要處理的對象。新的對象類可以通過繼承已存在的對象類的性質而產生,因此,這樣實現的可重用性是自然的和準確的。採用面向對象的方法表示知識,不僅表達的能力強,可以表示相當廣泛的知識,能夠描述非常複雜的客觀事物,而且具有模組性強、結構化程度高、便於分層實現,有利於設計、復用、擴充、修改等一系列優點。
對象是對象式系統中運行時刻的基本成分,它是屬性和行為的封裝體,其中還包括和其他對象進行通信的設施。對象有三種不同含義:實在對象、問題對象和計算機對象。實在對象是現實世界中存在的實體;問題對象是實在對象在問題域中的抽象,用以根據需要,完成某些行為;計算機對象是問題對象在計算機系統中的表示,它是數據和操作的封裝通信單位。因此,對象式語言中的對象是指計算機對象。
類是對一組具有相同數據和相同操作的對象的描述,也就是說類是一組對象的抽象概括。其作用有:一是作為對象的描述機制,刻劃一組對象的公共屬性和行為;二是作為程式的基本單位,它是支持模組化設計的設施,並且,類上的分類關係是模組劃分的規範標準。類有三部分組成:數據、操作和接口。數據刻劃對象的狀態,操作刻劃對象的行為,類中所有數據均為私有,接口使操作對外可見。
訊息是對象與對象之間可以傳遞信息,所傳遞的信息即為訊息。它要求某個對象執行類中所定義的某個操作的規格說明,由三部分組成:接受訊息的對象、訊息選擇子(又稱為訊息名)、零個或多個變元(實參)。