成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

用代碼來說明,為什么需要面向擴展的設計

開發 后端
在基本的面向對象編程中,你只能直接調用一個類的方法,而這些方法是由這個類的作者定義的,這對于面向用戶設計的類來說是沒有問題的。

 [[328143]]

在基本的面向對象編程中,你只能直接調用一個類的方法,而這些方法是由這個類的作者定義的,這對于面向用戶設計的類來說是沒有問題的。此外,在 20 - 30 年前,在大型標準庫和開源庫被大量復用之前,大部分代碼通常是跟自己的代碼中的類來一起工作的 —— 也就是你自己的團隊或公司維護的代碼。然而,在現代代碼世界中,我們經常會使用其他人編寫的類。

業務邏輯通常大量使用包括字符串和集合等標準庫功能、以及第三方庫中的一些類,我們受到這些類提供的操作的限制。例如,當我們需要用破折號替換字符串中的空格時,我們會這樣編寫代碼:

  1. string.replace(' ''-'

但是當我們需要將左邊的字符串對齊到指定的長度時,我們可能沒有現成的方法可用,在這些舊的語言(如 Objective-C、C++、Java 或 JS)中,你需要強制寫成這種形式:

  1. leftPad(string, ' ', length) 

這個 leftPad 可能來自一個單獨的庫¹,也可能來自第三方的工具函數集合(比如 Apache Commons),或者在你自己的項目中自行編寫。總之,它的調用看起來和字符串類上的內置方法是非常不同的。

為什么會有這樣的問題呢?我引用 Java 的作者之一 Guy Steele,他在 1998 年的《成長的語言》論文²中的一段話。

在大多數語言中,用戶至少可以定義一些新語法來代表另外一段代碼,然后可以很方便地調用這些代碼,這種方式可以讓新語法看起來像原生調用一樣。通過這種方式,用戶可以構建一個更大的語言來滿足他的需求。

Guy Steele, Growing a Language

他是在批評 APL 缺乏這樣的設施,但同樣的批評也適用于現代環境下的舊的面向對象語言。你被困在一個類的操作詞匯表上,而這個詞匯表是原始庫的設計者們所設想的,它不能由你來擴展。此外,它也沒法被廣泛使用的庫的維護者隨意地擴展,再次引用同一篇論文中的內容作為原因。

編程詞匯的一部分適合所有程序員使用,但其他部分僅適合少數幾個人。 程序員需要了解學習其所有詞匯用法,這并不公平。

現代語言(如 C#、Scala、Rust、Kotlin 和 Swift)通過支持擴展方法解決了這個問題。你可以在不是你控制的類中添加特定領域的擴展方法,這樣,你自己的函數可以用類似于內置方法來調用,而你的代碼仍然可以像散文一樣,流暢的按從左到右的順序閱讀。

  1. string.padLeft(' ', length) 

這個 padLeft 擴展可以在任何地方定義,它是一個很好的編程語言進化的故事。但是,它的意義還不止于此。

一旦一種編程語言支持擴展函數,它就改變了經典面向對象的 API 設計方法。這對于一個從 Java 這樣的舊語言,切換到 Kotlin 這樣的現代語言的程序員來說,是一個不小的啟示,因為擴展函數通常只是作為方便的語法糖³呈現出來。我們還是先看一個帶有一堆屬性(或 getter 方法)的接口。

interface Obscure { val foo: Int val bar: Int val sum: Int val max: Int val min: Int}

它和你在一個典型的商業應用程序中找到的接口或類并無大的區別 —— 有一堆屬性和方法。

你能快速掌握這個接口代表了一個什么樣的實體嗎?它的狀態空間是由哪些屬性構成的?如果沒有額外的文檔,要弄清楚這一點并不容易。但是,讓我們把這個接口重構成一個核心實體和方便的擴展函數。

  1. interface NotObscure { 
  2.     val foo: Int 
  3.     val bar: Int 
  4.  
  5. val NotObscure.sumInt 
  6. val NotObscure.maxInt 
  7. val NotObscure.minInt 

現在,很明顯,這個接口的核心功能是由兩個整數屬性 foo 和 bar 組成的,而其余的 sum、max 和 min 屬性只是為了方便起見而提供的,并在這些核心屬性的基礎上進行計算。不需要再明確地寫文檔描述這種區別了 —— 從代碼的結構中就可以直接看出。

這種面向擴展的設計在 Kotlin 標準庫和第三方庫中得到了廣泛的應用。它是一種強大的設計技術,使用它會有非常好的效果。

這種設計方法有一個副作用。你可能會注意到,Kotlin 代碼通常會使用通配符 import,比如 import com.examplease.*。這在 Kotlin 中很方便,因為在 Kotlin 中僅導入一個類是非常少見的。所有有用的、方便的、實用的函數通常都定義在同一個包中,但在類外作為擴展函數定義。

文中鏈接:

https://www.theregister.co.uk/2016/03/23/npm_left_pad_chaos/ How one developer just broke Node, Babel and thousands of projects in 11 lines of JavaScript, Chris Williams, 2016

https://www.cs.virginia.edu/~evans/cs655/readings/steele.pdf Growing a Language, Guy Steele, 1998

https://kotlinlang.org/docs/reference/extensions.html Extensions in Kotlin Programming Language

英文原文:

https://medium.com/@elizarov/extension-oriented-design-13f4f27deaee

本文轉載自微信公眾號「 高可用架構」,可以通過以下二維碼關注。轉載本文請聯系 高可用架構公眾號。

 

 

責任編輯:武曉燕 來源: 高可用架構
相關推薦

2021-11-12 08:00:00

抽象開發代碼

2015-08-03 10:40:45

動效設計優勢

2015-10-19 17:57:33

容器OpenStack微服務

2020-03-25 20:01:16

數據中心綜合布線技術

2020-07-10 15:18:12

微服務設計模型

2020-02-04 14:41:37

微服務設計DDD

2022-05-07 15:40:30

加密貨幣烏克蘭戰爭

2022-09-22 14:49:37

智能建筑物聯網

2011-02-16 09:42:04

DevOps

2023-10-30 11:13:55

2017-02-14 13:16:50

4G大數據M2M

2009-09-07 16:45:54

.NET代碼設計

2017-10-31 11:06:38

NAS存儲大數據

2015-04-16 15:42:21

關系型數據庫NoSQL

2022-06-28 14:54:26

加密貨幣數組貨幣安全

2014-07-02 09:56:33

2020-11-30 10:02:27

云計算IT運營工具

2020-04-29 15:30:22

CSP網頁前端

2022-06-07 10:09:20

5GRAN 架構移動通信

2009-06-15 14:59:31

Java代碼Java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 一区二区在线免费观看 | 羞羞视频免费在线 | 99综合网 | 尹人av| 亚洲精品在线播放 | 久干网| 成年人免费网站 | 精品综合| 亚洲视频在线看 | 99pao成人国产永久免费视频 | 日韩中文字幕 | 国产精品永久免费视频 | 一级片av| av网站在线免费观看 | 看片一区 | 色综合99| 欧美aaaaa| 欧美亚洲在线 | 天天干视频网 | 亚洲高清电影 | 一级大黄色片 | 欧美日韩在线一区二区三区 | 日韩精品久久 | 伊人超碰 | 国产黄色精品在线观看 | 中文字幕精品一区久久久久 | 国产一区二区三区高清 | 色爱区综合 | 欧美国产视频 | 一区二区三区精品 | 久草新在线 | 国产一区二区三区 | 国内精品久久精品 | 国产精品污www一区二区三区 | 久久久久一区二区三区四区 | 国产精品久久久久无码av | a级在线免费观看 | 欧美日韩成人影院 | 成人国产网站 | 国产综合久久 | 成年人在线|