什麼是框架?爲什麼說 Angular 是框架?

先摘錄並翻譯一段 wiki:

In computer programming, a

software framework is an abstraction in which software providing generic functionality can be selectively changed by additional user-written code, thus providing application-specific software. A software framework provides a standard way to build and deploy applications. A software framework is a universal, reusable software environment that provides particular functionality as part of a larger software platform to facilitate development of software applications, products and solutions. Software frameworks may include support programs, compilers, code libraries, tool sets, and application programming interfaces (APIs) that bring together all the different components to enable development of a project or system.

在編程領域,軟件框架是指一種抽象形式,它提供了一個具有通用功能的軟件,這些功能可以由使用者編寫代碼來有選擇的進行更改,從而提供服務於特定應用的軟件。軟件框架提供了一種標準的方式來構建並部署應用。

軟件框架是一種通用的、可複用的軟件環境,它提供特定的功能,作為一個更大的軟件平臺的一部分,用以促進軟件應用、產品和解決方案的開發工作。軟件框架可能會包含支撐程序、編譯器、代碼、庫、工具集以及 API,它把所有這些部件彙集在一起,以支持項目或系統的開發。

Frameworks have key distinguishing features that separate them from normal libraries:

框架和普通的庫在特性上具有一些關鍵性的區別:

inversion of control_: In a framework, unlike in libraries or in standard user applications, the overall program’s flow of control is not dictated by the caller, but by the framework.

控制反轉:與庫或普通的應用不同,在框架中,應用的宏觀控制流程不是由調用者決定的,而是由框架本身。

extensibility_: A user can extend the framework – usually by selective overriding; or programmers can add specialized user code to provide specific functionality.

可擴展性:用戶可以擴展該框架 —— 通常是有選擇的進行改寫(Override)或者由程序員添加專門的用戶代碼來提供特定的功能。

non-modifiable framework code_: The framework code, in general, is not supposed to be modified, while accepting user-implemented extensions. In other words, users can extend the framework, but should not modify its code.

不可修改框架代碼:通常,框架代碼都不打算讓你修改,而是接受由用戶自己實現的某些擴展。換句話說,用戶可以擴展該框架,但是不應該修改它的代碼。

形象點比喻(但不夠嚴謹),框架就是條生產線,這條生產線上有很多工人(代碼)在工作。生產線的管理者(程序員)負責管理這條生產線,比如說有的工序是空的,那麼你就可以安排自己的工人進去,讓他去達成你的目標。有些工序上的工人乾的工作和你預期的不同,你也可以安排自己的工人把他替換掉。

但是無論如何,你的工人除了執行你的意志之外,還要遵守那個工序的強制性要求,他想磨洋工或粗製濫造是不行的,因為這個流水線上的下一個工序可能有超時檢查或質量檢查,出了錯直接就把這個流水線給你停掉,甚至對於一些強制性檢查,你作為管理者都無權忽略它。

可以想見,一條好的生產線的價值有多大。生產線絕不僅僅是一組機器而已,它是很多年的管理經驗的結晶,這些才是最值錢的,否則光靠那些機器能值幾個錢?有了生產線,對工人(代碼)的要求大大降低了,甚至對管理者(程序員)的要求也大大降低了。當然,如果你只想生產個“能穿”的鞋子,那麼這條生產線幾乎沒有附加價值,甚至會提高你的成本。但是如果你想生產一個“高質量”的鞋子,那麼這條生產線是別人的鞋子賣10塊而你的鞋子能賣到1000塊的根本保障。

總體來說,建立生產線的目標就是制定規矩,保障品質,讓高品質可以用較低的代價進行復制。框架也是如此。

從代碼結構上看,框架在宏觀層面使用的都是註冊、回調機制。這種機制有一個形象的名稱,叫做好萊塢法則,為什麼叫好萊塢法則呢?因為好萊塢想要成名的演員太多了,都想去找導演,這樣下去導演的工作效率勢必會受到嚴重的影響。於是導演就立下了“規矩”,不要打給我們(Don’t call us),等我們打給你(We’ll call you!)。由於這個 call 和程序調用的 call 是同一個詞,於是編程界就把這句話搬過來,變成了回調(callback)的形象代言人。

比如在 Java 的 Spring 框架中,你只要給一個類加上 @Service 註解,它就會自動被 Spring 作為服務管理起來,當 Spring 認為需要的時候,就會創建這個類並且把它的實例傳給需求方。在 Angular 中也是一樣,你只要給一個類加上 @Component 註解(裝飾器),它就會自動被 Angular 當做組件管理起來,當 Angular 認為需要的時候,就會創建這個類,並且把它的實例傳給需求方(比如路由器)。

這些註解中還可以帶一些額外信息,被稱為元數據。所謂“元數據”就是 metadata,指的是關於數據的數據,這不是 Angular 自創的名詞,其它編程領域已經使用了幾十年了。當 Angular 準備創建一個組件的時候,它就會找到這些元數據,從中找出這個組件的模板(因為組件本身是純類,沒有攜帶任何模板信息),然後據此對 DOM 進行操縱。

而你寫的這些組件類和模板,其實就是“由程序員添加專門的用戶代碼來提供特定的功能”,因為框架是不會關心你的組件的外觀和邏輯的,它唯一關心的就是你必須遵循它的規範來工作,否則它就會給你報錯(比如,“連模板都沒有還敢說自己是 Angular 組件?”)。

而庫則跟框架相反,宏觀上說,它是等著你調用的,你要什麼功能它就給你什麼函數,然後你調用這個函數,把所需的參數傳進去就行了,而不是讓你遵守它的那麼多規矩。所以你很自由,但是你也要自己為整件事負責。你要自己創建組件、創建服務等,自己來驅動整個流程,自己做必要的檢查,當然也可以不做,反正對十塊錢的鞋子別人可能只希望能穿一個月就行了。

那麼,問題來了,框架一定會比庫高級嗎?顯然不是,甚至連框架的功能都不一定比庫多。它們只是定位不同、設計理念不同而已。對於 Angular 來說,它會更希望你遵守一些規矩,這樣當系統需要長期維護、甚至要經歷很多人員更迭的時候,才不至於腐化。它希望每個開發人員都不必瞭解應用的全貌就能很好地完成工作(因為有當前工序的操作手冊和檢查點)。當然,它也不會干涉那些它不需要關心的事情,比如組件模板中你放 h1 還是放 div 它是不在乎的。這些目標用庫也能達到,不過對人員的架構觀和做事的自律性會有相應的要求,畢竟沒人管了,那你自己就不能放任自流。

然而,在現實中,很多應用的整個生命週期可能都不會超過一年,甚至還有很多生命週期幾天的活動頁,那麼,這些應用和頁面的可維護性其實並不重要,甚至連是否能讓不同的人協作都無所謂。那麼點功能,能出什麼 bug?一次性的需求,管什麼可擴展性?這時候,學習成本就會成為一個很重要的參考因素。

學習 Angular 最難的就是遵守並理解規矩。然而大部分人天生是不願遵守規矩的,特別是有些規矩可能他都無法理解為什麼(雖然這可能是前人根據血的教訓總結出來的)。可是,一旦遵守並理解了這些規矩,那麼一扇新的大門就對你敞開了,你會發現跨上這個臺階之後,無論前端技術還是後端技術還是移動端技術,都遵循著很多相同的理念,即使出現了新的挑戰,你也可以套用這些理念去解決。

規矩即自由。孔子把“從心所欲,不逾矩”當做自己的最佳狀態,其實很多事都是這樣。一旦深刻理解了設計和使用框架的思維模式,你將迎來一個實質性的提升。

在我工作的前五年,編程時很“聰明”,用技巧解決了很多問題,但之後的十五年(恰好在那一年我知道了框架的概念),我愛上了規矩,不但自己給自己(根據血淚教訓)立各種規矩,而且從別人那裡借鑑了很多規矩,無論是宏觀的還是微觀的。可以說,規矩就是固化的好習慣,雖然有時候也會成為阻礙,但是如果你想在編程領域工作到退休,那麼這些規矩就是你表面上最大的資產,而對這些規矩的來龍去脈的理解和領悟,則是你深層次中最大的資產。


文/ThoughtWorks汪志成

原文:https://insights.thoughtworks.cn/what-is-software-framework/


分享到:


相關文章: