TellDontAsk的扩展
五年多來(lái),Martin Fowler在他著名的TellDontAsk文章中指出了面向?qū)ο缶幊讨械淖畲髥?wèn)題之一。 在他的著作中,他提醒程序員,他們應(yīng)該信任自己的對(duì)象來(lái)為他們執(zhí)行工作,而不是要求對(duì)象提供以后可以使用的數(shù)據(jù)。
我非常同意這一點(diǎn),但是,當(dāng)然,僅憑此原則并不能保證我們的代碼是面向?qū)ο蟮摹?我認(rèn)為僅僅依靠一個(gè)對(duì)象來(lái)完成工作是不夠的–需要做更多的設(shè)計(jì)工作,以確保該對(duì)象以后不會(huì)引起程序代碼。
湯姆和杰瑞–藍(lán)貓布魯斯,威廉·漢娜和約瑟夫·巴貝拉
讓我們來(lái)看一個(gè)例子:
/*** All employees of a company.* You can hire more, fire some of them, give them a raise etc.\*/ public final class AllEmployees implements Employees {//constructor//other methods from Employees interface (hire, fire, raise etc)@Overridepublic List<Employee> filter(final Map<String, String> skills) {//return the List of those who have the specified skills.}}上面的類將創(chuàng)建一個(gè)尊重福勒先生原則的適當(dāng)對(duì)象:它將照顧員工,甚至?xí)槲覀兒Y選員工,而不會(huì)提出任何問(wèn)題。 但是,這可能會(huì)導(dǎo)致周圍的損壞,原因如下:執(zhí)行過(guò)濾后,我們將剩下一個(gè)可以區(qū)分所有人的List !
那些被篩選的員工永遠(yuǎn)都不會(huì)加薪嗎? 他們將永遠(yuǎn)不會(huì)被解雇,還是我們永遠(yuǎn)不會(huì)雇用具有相同技能的人(相同的過(guò)濾器)? 當(dāng)然,我們?nèi)匀粫?huì)愿意加薪,解雇或雇用類似的人,但是我們現(xiàn)在已經(jīng)不在上下文中了,我們手中只有一個(gè)愚蠢的List :為了使清單上的員工享有相同的權(quán)利,并且其余的義務(wù)一樣,我們將需要編寫過(guò)程代碼(也許很多代碼)。
我認(rèn)為應(yīng)該這樣做:我們應(yīng)該添加一個(gè)新的Employees實(shí)現(xiàn),稱為FilteredEmployees ,該實(shí)現(xiàn)會(huì)將Map放入其構(gòu)造函數(shù)中,并確保它僅處理具有我們所要求技能的員工。 這樣,他們?nèi)匀辉谕患夜竟ぷ?#xff0c;除了現(xiàn)在我們更加了解他們,我們知道他們擁有一些別人沒(méi)有的技能以外,沒(méi)有任何改變。 我們不必編寫代碼來(lái)處理或轉(zhuǎn)換 List ,我們?nèi)詫⒂幸粋€(gè)Employees實(shí)例。 現(xiàn)在我們的班級(jí)看起來(lái)像這樣:
/*** All employees of a company.* You can hire more, fire some of them, give them a raise etc.\*/ public final class AllEmployees implements Employees {//constructor//other methods from Employees interface (hire, fire, raise etc)@Overridepublic Employees filter(final Map<String, String> skills) {return new FilteredEmployees(..., skills);}}我想說(shuō)的是,這種想法本身就是試圖實(shí)現(xiàn)這種情況,而不是告訴一個(gè)對(duì)象將您引向上述情況。 也就是說(shuō),我們實(shí)現(xiàn)了這些已過(guò)濾的員工,因?yàn)樵紝?duì)象在維護(hù)上下文的同時(shí)無(wú)法為我們執(zhí)行過(guò)濾。 簡(jiǎn)單地告訴目標(biāo)對(duì)象去做就會(huì)使我們陷入相同的境地(與具有特定技能的人一起工作),但是這些人不再是雇員 ,而只是列表。
我將所有這些視為對(duì)TellDontAsk原理的擴(kuò)展。 我不確定如何確保您朝正確的方向前進(jìn)。 但是,我認(rèn)為JDK(或您使用的任何開發(fā)套件)的使用是一個(gè)很好的指示: 在面向?qū)ο蟮拇a庫(kù)中,該套件應(yīng)盡可能離散 。 使用開發(fā)套件的次數(shù)越多,您的代碼實(shí)際面向?qū)ο蟮拇螖?shù)就越少,或者您的抽象并不是最好的。 另一方面,僅通過(guò)使用現(xiàn)有對(duì)象(或添加現(xiàn)有接口的新實(shí)現(xiàn))就能添加/修改/刪除功能越多,則應(yīng)用程序的面向?qū)ο笤蕉唷?
PS 這是同一想法的另一個(gè)示例。
翻譯自: https://www.javacodegeeks.com/2018/11/extension-telldontask.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的TellDontAsk的扩展的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 老电脑升级配置方案老电脑如何升级配置
- 下一篇: 五金反引号