Chaining Method

第一次接觸Chaining Method概念是在使用jQuery時,jQuery中的Chaining Method,讓代碼變得非常簡潔。Ruby中的Active Record也是基于Chaining Method設(shè)計的。基于Chaining Method機制設(shè)計的API, 可以稱之為Chaining API.

什么是Chaining Method

jQuery中

$("#person").slideDown('slow')
   .addClass('grouped')
   .css('margin-left', '11px');

如果不使用chaining:

var p = $('#person');
p.slideDown('slow');
p.addClass('grouped');
p.css('margin-left', '11px');

Active Record中

User.all.order(created_at: :desc)

如果不使用chain

users = User.all
ordered_users = users.order(created_at: :desc)

最簡單的Chaining Method實現(xiàn)

每次方法調(diào)用都返回當(dāng)前對象本身

class Person
  def name(value)
    @name = value
    self
  end

  def age(value)
    @age = value
    self
  end

  def introduce
    puts "Hello, my name is #{@name} and I am #{@age} years old."
  end
end

person = Person.new
person.name("Peter").age(21).introduce
# => Hello, my name is Peter and I am 21 years old.

使用Chaining API處理數(shù)據(jù)

在Functional Programming世界中嚼摩,數(shù)據(jù)處理一般需要遵循data pipeline的原則,即:

  • 數(shù)據(jù)從右向左流動(Functional Programming Way)
  • 或者數(shù)據(jù)從左向右流動(OOP Way)

從右向左流動

sum(even(plus(1, [1,2,3,4,5])))
# => 12

從左向右流動

Processor.new([1,2,3,4,5]).plus(1).even().sum()
# => 6

OOP中的Chaining API的設(shè)計準則

  1. 使用數(shù)據(jù)構(gòu)建Processor對象, Processor對象保存數(shù)據(jù)狀態(tài)
  2. 調(diào)用Processor對象中的方法改變數(shù)據(jù)狀態(tài), 并且每個方法都返回Processor本身
  3. 最后一次調(diào)用返回處理后的結(jié)果, 此處不在返回Processor對象本身
  4. 由于Processor中的每一次方法調(diào)用都會改變數(shù)據(jù)狀態(tài),所有不要重復(fù)使用Processor對象矿瘦。Processor對象用完立即銷毀
class DataProcessor
  def initialize(datas)
    @datas = datas
  end

  def plus(num)
    @datas.map! { |n| n + num }
    self
  end

  def even
    @datas.select! { |n| n.even? }
    self
  end

  def sum()
    @datas.reduce(:+)
  end
end

DataProcessor.new([1,2,3,4,5]).plus(1).even().sum()
#=> 12

總結(jié)

Chaining Method是一個非常優(yōu)雅的API設(shè)計方式枕面,采用Chaining Method方式設(shè)計API可以使代碼變得非常簡潔。在數(shù)據(jù)處理方面缚去,Chaining Method Way可以讓數(shù)據(jù)保持單項流動潮秘,在OOP中輕松實現(xiàn)Functional Programming中的Data Pipeline 思想。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末易结,一起剝皮案震驚了整個濱河市枕荞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌搞动,老刑警劉巖躏精,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鹦肿,居然都是意外死亡矗烛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門箩溃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瞭吃,“玉大人碌嘀,你說我怎么就攤上這事⊥峒埽” “怎么了股冗?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長和蚪。 經(jīng)常有香客問我止状,道長,這世上最難降的妖魔是什么攒霹? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任怯疤,我火速辦了婚禮,結(jié)果婚禮上剔蹋,老公的妹妹穿的比我還像新娘。我一直安慰自己辅髓,他們只是感情好泣崩,可當(dāng)我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洛口,像睡著了一般矫付。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上第焰,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天买优,我揣著相機與錄音,去河邊找鬼挺举。 笑死杀赢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的湘纵。 我是一名探鬼主播脂崔,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼梧喷!你這毒婦竟也來了砌左?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铺敌,失蹤者是張志新(化名)和其女友劉穎汇歹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體偿凭,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡产弹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了弯囊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片取视。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡硝皂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出作谭,到底是詐尸還是另有隱情稽物,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布折欠,位于F島的核電站贝或,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏锐秦。R本人自食惡果不足惜咪奖,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酱床。 院中可真熱鬧羊赵,春花似錦、人聲如沸扇谣。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罐寨。三九已至靡挥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鸯绿,已是汗流浹背跋破。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瓶蝴,地道東北人毒返。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像舷手,于是被迫代替她去往敵國和親饿悬。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理聚霜,服務(wù)發(fā)現(xiàn)狡恬,斷路器,智...
    卡卡羅2017閱讀 134,704評論 18 139
  • OOA:Object-Oriented Analysis面向?qū)ο蠓治龇椒?是在一個系統(tǒng)的開發(fā)過程中進行了系統(tǒng)業(yè)務(wù)調(diào)...
    楚易楓閱讀 3,673評論 0 5
  • Swift版本點擊這里歡迎加入QQ群交流: 594119878最新更新日期:18-09-17 About A cu...
    ylgwhyh閱讀 25,418評論 7 249
  • (一) 狗是沒有姓的 我叫做狗才兒霍骄,一個正值盛年的男,哦不淡溯,公狗读整。都被你們?nèi)祟惤o洗腦了。 在沒遇到我的主人之前呢咱娶,...
    小云哪閱讀 431評論 4 0
  • 辭別放牛小哥膘侮,山中一行屈糊,我和師兄心懷僥幸,盡往水邊走琼了。巨巖下逻锐,洞穴里,更是挖地三尺不嫌累雕薪。常常是撥開齊膝蓋深的野草...
    Hey東尋閱讀 446評論 5 4