官术网_书友最值得收藏!

1.1 元編程的需求背景

我們在編寫程序時經常會遇到一個問題—重復,而工程師最不能忍受的就是重復。重復意味著低效,也意味著低級。我們造的每一個“輪子”在某種意義上都是為了解決重復的問題。業內也有一句名言:“不要重復你自己(Don't repeat yourself)。”

然而在實際的業務場景中,我們經常會見到大量重復或者相似的模板代碼,這些代碼很多時候難以使用編程語言的基本特性進行抽象,因此我們不得不忍受它們的存在。

Java的Getter方法和Setter方法就是很典型的例子,如代碼清單1-1所示。

代碼清單1-1 Java的Getter方法和Setter方法

幸運的是,Kotlin把屬性作為正式的特性提供給開發者,使得開發者終于不用忍受充斥著Getter和Setter的模板代碼了,如代碼清單1-2所示。

代碼清單1-2 Kotlin的屬性

不過,不是所有模板代碼問題都能通過添加語法特性解決。

業務代碼中最常見的網絡請求就是高度模板化的代碼。不同的業務接口雖然各不相同,但網絡請求本身的代碼極為相似。以OkHttp為例,如代碼清單1-3所示。

代碼清單1-3 使用OkHttp發送網絡請求

我們定義了兩個函數getUser和getRepository,分別用于請求GitHub的API以獲取用戶和倉庫的相關信息。這兩個函數除了參數、返回值和請求的URL不同以外,剩下的代碼完全相同,而這部分相同的代碼才是這兩個函數的主體內容。如果調用者希望接口同時提供異步回調和協程的版本,情況只會更糟糕。異步回調和協程版本的接口函數如代碼清單1-4所示。

代碼清單1-4 異步回調和協程版本的接口函數

在實際的業務場景中,請求幾十甚至上百個接口是非常常見的事情。可以想象,重復的接口代碼實現將會給項目帶來巨大的維護成本。

解決此類問題最常用的手段就是元編程。Kotlin提供了非常豐富的元編程手段,包括運行時反射(Kotlin JVM)、編譯時符號處理等。

Retrofit就是一個充分運用運行時反射能力來簡化HTTP接口代碼的框架。它可以以非常優雅的方式解決代碼清單1-3和代碼清單1-4中存在的問題,如代碼清單1-5所示。

代碼清單1-5 使用Retrofit定義HTTP接口函數

3.3節將對Retrofit的工作機制進行剖析。

主站蜘蛛池模板: 喜德县| 莱芜市| 铜陵市| 尚义县| 伊川县| 丰宁| 修水县| 梅州市| 峨眉山市| 纳雍县| 盐边县| 白玉县| 汕尾市| 平和县| 高密市| 富顺县| 桃江县| 察雅县| 梓潼县| 金秀| 定陶县| 新巴尔虎左旗| 汉寿县| 阿勒泰市| 定日县| 子洲县| 澎湖县| 会宁县| 安陆市| 乌拉特中旗| 巴林左旗| 始兴县| 土默特右旗| 陇川县| 巴南区| 武川县| 西城区| 乌拉特后旗| 东平县| 本溪市| 寿宁县|