本文轉自公眾號CSDN(ID:CSDNnews)
作者:Dechalert
「經驗豐富的後臺開發總是瞧不上前端的技術,尤其是 JavaScript,一直被當作不入流的語言」,雖然在幾十年前,JavaScript 只能開發非常小且功能單一的應用程式,但如今無論是前端還是後端,JavaScript 在規模和複雜性方面都取得了很大的發展。而 JavaScript 中的面向對象則有助於減輕心理負擔,並避免基於函數的編程中固有的紛雜的關係。
是時候做出改變了!
以下為譯文:
經驗豐富的後臺開發總是瞧不上前端的技術,尤其是 JavaScript,一直被當作不入流的語言。主要是因為起初 JavaScript 是基於功能的語言,導致其潛在的發展方式和內容方面不成熟。
我記得早在 90 年代末和 21 世紀初,JavaScript 主要用於製作動態的 HTML 頁面,偶爾用來添加一些視覺上的功能。
如今,整個框架、庫甚至後臺的系統都可以在 JavaScript 上運行。以前使用 JavaScript 開發原生移動和桌面應用程式是駭人聽聞的事兒,可如今這種做法很常見,甚至比 Java 還流行,而且 JavaScript 也完全支持跨平臺。
現在,JavaScript 無處不在。你可以輕鬆搞定 JavaScript,而且也非常實用。但是從長期來看這很可能造成很多問題。許多 JavaScript 程式設計師都沒有接受過面向對象編程方法的培訓。當然,這也不是他們的錯。有時候我們只會學習工作中用得到的東西,還有的時候連我們自己都不清楚我們缺乏哪方面的知識。
面向對象編程的基本思路完全不同。其背後的思想是:你將所需要做的功能抽象成一個「對象」,然後一遍遍地調用這個對象來完成你想要的功能。
每次調用對象時,你必須創建對象,確保對象的存在,然後為了使用對象所帶的功能你需要設置它的屬性,這些功能稱為「方法(methods)」。
例如,客戶訂單的對象可能含有訂單詳細信息的功能(也稱為方法)。
用 JavaScript 編寫的客戶訂單類的示例以及用法
在基於函數的結構中,你需要將向函數傳遞參數才能調用函數。你需要拿到一個訂單號(Order ID)然後傳遞給函數。
用 JavaScript 編寫的函數示例
這裡的問題在於:如果你想擴展上述函數,那麼很快就會變得很混亂。雖然最初將所有的功能都寫成函數,並在需要的時候調用似乎很簡單,但是這種做法缺少範圍定義,很容易引發一連串的問題,影響到許多未知但相互關聯的關係。然而,類可以防止這種情況。
類的概念
上圖中的構造函數(constructor )用來設置變量。Getter 和 Setter 方法是某些操作的入口。這些函數調用了什麼、怎樣調用的都被隱藏了。每次創建新對象時,都會「克隆」整個類及其方法,然後創建者就能訪問該對象了,如此一來變更的範圍就明確了,而且我們知道,任何對於類及其方法的更改都是一致的。
義大利麵條式代碼(spaghetti code)的開端
如果我們使用一堆鬆散的函數寫代碼,那麼通常都不會定義更改範圍。我們需要傳遞參數才能調用函數,而且往往一個函數需要依賴另一個函數。從表面上看,基於函數的編程起初似乎很容易,但從長遠來看,維護起來簡直就是一場噩夢。
使用面向對象編程時,你只需調用 Getter 和Setter 方法即可訪問黑盒功能。作為類的消費者,你不需要知道其中的工作原理,你只需要它的用法。
為什麼我們需要在 JavaScript 中實現 OOP?
當有太多東西交織在一起時,就會出現我們常說的義大利麵條式代碼。基於函數的編程(就像最初的 JavaScript)可以快速編寫代碼,但從長遠來看,這種方法最終會在應用程式中埋下很多風險和 bug。
隨著代碼庫的增長,你需要改變你組織思路的方法,並開始用面向對象的方式思考。與一系列相互糾纏需要通過一系列的參數傳遞才能運行的函數相比,對象的範圍很容易控制和追蹤。
現實生活中義大利麵條式代碼的開端。為了搞清楚如何才能實現你的目標,你需要了解一系列的函數。如果你需要多次重複整個過程,那麼就必須不斷重複理解。
基於函數編程的問題在於,一旦有一個函數出現問題,就會導致整個鏈上的流程失敗。而對於對象而言,一個方法出問題不會(也不應該)影響到其他類。
面向對象最初看起來會有很多代碼,但是你可以重用,而無需為每個實例編寫冗長的函數鏈,如最後的日誌輸出的部分所示。
與一連串的函數相比,面向對象的思考方式可以在發生故障時降低失敗的風險和範圍。這是因為函數間的互相調用都會埋下執行失敗的風險。追蹤一系列函數不僅耗費時間成本,而且同樣的工作重複十幾次的話,時間和心理的壓力都會很大。
我總認為,面向對象編程在決定代碼所涉及的範圍上有主動權。(如果你想用 Angular 實現面向對象,那麼需要全面了解這個框架。)
總的來說,JavaScript 中的面向對象可以減輕心理負擔,並避免基於函數的編程中固有的紛雜的關係。雖然在幾十年前,JavaScript 只能開發非常小且功能單一的應用程式,但如今無論是前端還是後端,JavaScript 在規模和複雜性方面都取得了很大的發展。
歸根結底,所有代碼都一樣——只是組織方式不同罷了。面向對象的範式是對函數編程反思後的解決方案,因為函數編程造成的心理負荷通常比基於類的結構更大。如果代碼結構易於理解和追蹤,那麼就可以減少出錯的可能性,在添加新功能時也不會破壞周圍的其他功能。
本文轉自公眾號CSDN(ID:CSDNnews
原文:https://itnext.io/its-time-we-talk-about-object-oriented-javascript-81b4b9b70981