日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

TellDontAsk的扩展

發(fā)布時(shí)間:2023/12/3 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 TellDontAsk的扩展 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

五年多來(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。