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

用代碼來(lái)說(shuō)明,為什么需要面向擴(kuò)展的設(shè)計(jì)

開(kāi)發(fā) 后端
在基本的面向?qū)ο缶幊讨校阒荒苤苯诱{(diào)用一個(gè)類(lèi)的方法,而這些方法是由這個(gè)類(lèi)的作者定義的,這對(duì)于面向用戶(hù)設(shè)計(jì)的類(lèi)來(lái)說(shuō)是沒(méi)有問(wèn)題的。

 [[328143]]

在基本的面向?qū)ο缶幊讨校阒荒苤苯诱{(diào)用一個(gè)類(lèi)的方法,而這些方法是由這個(gè)類(lèi)的作者定義的,這對(duì)于面向用戶(hù)設(shè)計(jì)的類(lèi)來(lái)說(shuō)是沒(méi)有問(wèn)題的。此外,在 20 - 30 年前,在大型標(biāo)準(zhǔn)庫(kù)和開(kāi)源庫(kù)被大量復(fù)用之前,大部分代碼通常是跟自己的代碼中的類(lèi)來(lái)一起工作的 —— 也就是你自己的團(tuán)隊(duì)或公司維護(hù)的代碼。然而,在現(xiàn)代代碼世界中,我們經(jīng)常會(huì)使用其他人編寫(xiě)的類(lèi)。

業(yè)務(wù)邏輯通常大量使用包括字符串和集合等標(biāo)準(zhǔn)庫(kù)功能、以及第三方庫(kù)中的一些類(lèi),我們受到這些類(lèi)提供的操作的限制。例如,當(dāng)我們需要用破折號(hào)替換字符串中的空格時(shí),我們會(huì)這樣編寫(xiě)代碼:

  1. string.replace(' ''-'

但是當(dāng)我們需要將左邊的字符串對(duì)齊到指定的長(zhǎng)度時(shí),我們可能沒(méi)有現(xiàn)成的方法可用,在這些舊的語(yǔ)言(如 Objective-C、C++、Java 或 JS)中,你需要強(qiáng)制寫(xiě)成這種形式:

  1. leftPad(string, ' ', length) 

這個(gè) leftPad 可能來(lái)自一個(gè)單獨(dú)的庫(kù)¹,也可能來(lái)自第三方的工具函數(shù)集合(比如 Apache Commons),或者在你自己的項(xiàng)目中自行編寫(xiě)。總之,它的調(diào)用看起來(lái)和字符串類(lèi)上的內(nèi)置方法是非常不同的。

為什么會(huì)有這樣的問(wèn)題呢?我引用 Java 的作者之一 Guy Steele,他在 1998 年的《成長(zhǎng)的語(yǔ)言》論文²中的一段話(huà)。

在大多數(shù)語(yǔ)言中,用戶(hù)至少可以定義一些新語(yǔ)法來(lái)代表另外一段代碼,然后可以很方便地調(diào)用這些代碼,這種方式可以讓新語(yǔ)法看起來(lái)像原生調(diào)用一樣。通過(guò)這種方式,用戶(hù)可以構(gòu)建一個(gè)更大的語(yǔ)言來(lái)滿(mǎn)足他的需求。

Guy Steele, Growing a Language

他是在批評(píng) APL 缺乏這樣的設(shè)施,但同樣的批評(píng)也適用于現(xiàn)代環(huán)境下的舊的面向?qū)ο笳Z(yǔ)言。你被困在一個(gè)類(lèi)的操作詞匯表上,而這個(gè)詞匯表是原始庫(kù)的設(shè)計(jì)者們所設(shè)想的,它不能由你來(lái)擴(kuò)展。此外,它也沒(méi)法被廣泛使用的庫(kù)的維護(hù)者隨意地?cái)U(kuò)展,再次引用同一篇論文中的內(nèi)容作為原因。

編程詞匯的一部分適合所有程序員使用,但其他部分僅適合少數(shù)幾個(gè)人。 程序員需要了解學(xué)習(xí)其所有詞匯用法,這并不公平。

現(xiàn)代語(yǔ)言(如 C#、Scala、Rust、Kotlin 和 Swift)通過(guò)支持?jǐn)U展方法解決了這個(gè)問(wèn)題。你可以在不是你控制的類(lèi)中添加特定領(lǐng)域的擴(kuò)展方法,這樣,你自己的函數(shù)可以用類(lèi)似于內(nèi)置方法來(lái)調(diào)用,而你的代碼仍然可以像散文一樣,流暢的按從左到右的順序閱讀。

  1. string.padLeft(' ', length) 

這個(gè) padLeft 擴(kuò)展可以在任何地方定義,它是一個(gè)很好的編程語(yǔ)言進(jìn)化的故事。但是,它的意義還不止于此。

一旦一種編程語(yǔ)言支持?jǐn)U展函數(shù),它就改變了經(jīng)典面向?qū)ο蟮?API 設(shè)計(jì)方法。這對(duì)于一個(gè)從 Java 這樣的舊語(yǔ)言,切換到 Kotlin 這樣的現(xiàn)代語(yǔ)言的程序員來(lái)說(shuō),是一個(gè)不小的啟示,因?yàn)閿U(kuò)展函數(shù)通常只是作為方便的語(yǔ)法糖³呈現(xiàn)出來(lái)。我們還是先看一個(gè)帶有一堆屬性(或 getter 方法)的接口。

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

它和你在一個(gè)典型的商業(yè)應(yīng)用程序中找到的接口或類(lèi)并無(wú)大的區(qū)別 —— 有一堆屬性和方法。

你能快速掌握這個(gè)接口代表了一個(gè)什么樣的實(shí)體嗎?它的狀態(tài)空間是由哪些屬性構(gòu)成的?如果沒(méi)有額外的文檔,要弄清楚這一點(diǎn)并不容易。但是,讓我們把這個(gè)接口重構(gòu)成一個(gè)核心實(shí)體和方便的擴(kuò)展函數(shù)。

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

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

這種面向擴(kuò)展的設(shè)計(jì)在 Kotlin 標(biāo)準(zhǔn)庫(kù)和第三方庫(kù)中得到了廣泛的應(yīng)用。它是一種強(qiáng)大的設(shè)計(jì)技術(shù),使用它會(huì)有非常好的效果。

這種設(shè)計(jì)方法有一個(gè)副作用。你可能會(huì)注意到,Kotlin 代碼通常會(huì)使用通配符 import,比如 import com.examplease.*。這在 Kotlin 中很方便,因?yàn)樵?Kotlin 中僅導(dǎo)入一個(gè)類(lèi)是非常少見(jiàn)的。所有有用的、方便的、實(shí)用的函數(shù)通常都定義在同一個(gè)包中,但在類(lèi)外作為擴(kuò)展函數(shù)定義。

文中鏈接:

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

本文轉(zhuǎn)載自微信公眾號(hào)「 高可用架構(gòu)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系 高可用架構(gòu)公眾號(hào)。

 

 

責(zé)任編輯:武曉燕 來(lái)源: 高可用架構(gòu)
相關(guān)推薦

2021-11-12 08:00:00

抽象開(kāi)發(fā)代碼

2015-08-03 10:40:45

動(dòng)效設(shè)計(jì)優(yōu)勢(shì)

2015-10-19 17:57:33

容器OpenStack微服務(wù)

2020-03-25 20:01:16

數(shù)據(jù)中心綜合布線技術(shù)

2020-07-10 15:18:12

微服務(wù)設(shè)計(jì)模型

2020-02-04 14:41:37

微服務(wù)設(shè)計(jì)DDD

2022-05-07 15:40:30

加密貨幣烏克蘭戰(zhàn)爭(zhēng)

2011-02-16 09:42:04

DevOps

2023-10-30 11:13:55

2022-09-22 14:49:37

智能建筑物聯(lián)網(wǎng)

2009-09-07 16:45:54

.NET代碼設(shè)計(jì)

2017-02-14 13:16:50

4G大數(shù)據(jù)M2M

2015-04-16 15:42:21

關(guān)系型數(shù)據(jù)庫(kù)NoSQL

2022-06-28 14:54:26

加密貨幣數(shù)組貨幣安全

2017-10-31 11:06:38

NAS存儲(chǔ)大數(shù)據(jù)

2022-06-07 10:09:20

5GRAN 架構(gòu)移動(dòng)通信

2009-06-15 14:59:31

Java代碼Java

2014-07-02 09:56:33

2020-11-30 10:02:27

云計(jì)算IT運(yùn)營(yíng)工具

2020-04-29 15:30:22

CSP網(wǎng)頁(yè)前端
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 好姑娘高清在线观看电影 | 日韩在线看片 | 国产精品久久久久久久久久99 | 久操亚洲 | 992人人草 | 久久精品一 | 97狠狠干 | 欧美男人天堂 | 岛国av一区二区三区 | 精品久久久久久久久久 | 日日日操| 天天影视色综合 | 日韩av成人在线 | 国产综合一区二区 | 日韩一二区在线 | 精品久久久999 | 国产成年人小视频 | 欧美极品视频 | 精品欧美一区二区在线观看欧美熟 | 精品中文字幕一区 | 国产资源在线视频 | 97国产在线观看 | 亚洲成人精品 | 午夜视频在线观看视频 | 日韩在线免费视频 | av在线免费网站 | 国产一区影院 | 日韩影院在线观看 | 国产在线一区二区三区 | 久久久久亚洲 | 你懂的在线视频播放 | 中文字幕亚洲国产 | av天天澡天天爽天天av | 国产成人免费在线 | 欧美精产国品一二三区 | 成年人在线观看 | 北条麻妃一区二区三区在线视频 | 日韩欧美国产一区二区三区 | 亚洲人成人一区二区在线观看 | 欧美99| 日韩激情在线 |