变色龙功能
在《神秘博士》中,卡梅利恩(Kamelion)角色是可以采取任何形式的機(jī)器人。 據(jù)稱,他們使用的物理道具非常麻煩,只有其創(chuàng)建者才能理解,而該創(chuàng)建者并沒有幫助糾正它。
因此,Chamelion功能...
考慮以下代碼:
public List<Document> getAllDocuments(Request request, int userId, String field) { Query q = createQueryFrom(request); switch (field) { case "title" : q.addCriteria(Criteria.where( "title" ).is(request.getTitle()); break ; case "name" : q.addCriteria(Criteria.where( "name" ).is(request.getName()); break ; ?default : throw new IllegalArgumentException( "Bad field: " + field); } return q; }上面有很多事情。 讓我們來了解它。 出現(xiàn)了某種請(qǐng)求,我們可以從中進(jìn)行基本查詢。 然后,根據(jù)調(diào)用方提供的字段,我們使用該字段向查詢中添加條件,并將操作數(shù)從請(qǐng)求中拉出。
最重要的是,如果調(diào)用者提供了一個(gè)我們不知道如何查詢的字段,我們就必須拋出一個(gè)錯(cuò)誤。
這個(gè)功能怎么了?
我會(huì)告訴你怎么了...
這不是功能。 這是兩個(gè)功能。 另請(qǐng)參閱兩種音樂 。
調(diào)用代碼可能如下所示:
// one call site getAllDocuments(request, id, "title" ); // another getAllDocumetns(request, id, "name" );我們正在使用字符串選擇來控制單個(gè)函數(shù)的一半流程。
比這更糟的是……當(dāng)某些調(diào)用者發(fā)明一個(gè)我們從未聽說過的字符串時(shí),我們需要拋出一個(gè)異常。
讓我們?cè)僦貥?gòu)一下:
public List<Document> getAllDocumentsByTitle(Request request, int userId) { Query q = createQueryFrom(request); q.addCriteria(Criteria.where( "title" ).is(request.getTitle()); return q; } public List<Document> getAllDocumentsByName(Request request, int userId) { Query q = createQueryFrom(request); q.addCriteria(Criteria.where( "name" ).is(request.getName()); return q; }通過將其分為兩個(gè)功能,它可以自我記錄,易于遵循并且不需要處理流氓字符串。 它可能會(huì)稍微快一點(diǎn),但這并不是真正的主要驅(qū)動(dòng)力。
但是重復(fù)呢?
我懷疑變色龍功能的一種驅(qū)動(dòng)程序是減少代碼重復(fù)的錯(cuò)誤嘗試。 請(qǐng)注意,以上示例提供了在兩個(gè)函數(shù)( createQueryFrom)中重用的代碼示例,但每個(gè)函數(shù)中都有獨(dú)立的邏輯。 它不是重復(fù)的代碼。
我從中提取的示例可能最初有多行代碼,現(xiàn)在我們看到createQueryFrom可能引起了對(duì)重復(fù)的恐懼,這反過來又造成了怪物。 堅(jiān)持不懈地重構(gòu)以減少正確的重復(fù),這樣的事情就不會(huì)發(fā)生。
翻譯自: https://www.javacodegeeks.com/2019/08/chameleon-function.html
總結(jié)
- 上一篇: 奇险天下第一山是哪座山 这座山挺拔峻峭
- 下一篇: 5加仑等于多少升 是怎么换算的