变色龙功能
在《神秘博士》中,卡梅利恩(Kamelion)角色是可以采取任何形式的機器人。 據稱,他們使用的物理道具非常麻煩,只有其創建者才能理解,而該創建者并沒有幫助糾正它。
因此,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; }上面有很多事情。 讓我們來了解它。 出現了某種請求,我們可以從中進行基本查詢。 然后,根據調用方提供的字段,我們使用該字段向查詢中添加條件,并將操作數從請求中拉出。
最重要的是,如果調用者提供了一個我們不知道如何查詢的字段,我們就必須拋出一個錯誤。
這個功能怎么了?
我會告訴你怎么了...
這不是功能。 這是兩個功能。 另請參閱兩種音樂 。
調用代碼可能如下所示:
// one call site getAllDocuments(request, id, "title" ); // another getAllDocumetns(request, id, "name" );我們正在使用字符串選擇來控制單個函數的一半流程。
比這更糟的是……當某些調用者發明一個我們從未聽說過的字符串時,我們需要拋出一個異常。
讓我們再重構一下:
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; }通過將其分為兩個功能,它可以自我記錄,易于遵循并且不需要處理流氓字符串。 它可能會稍微快一點,但這并不是真正的主要驅動力。
但是重復呢?
我懷疑變色龍功能的一種驅動程序是減少代碼重復的錯誤嘗試。 請注意,以上示例提供了在兩個函數( createQueryFrom)中重用的代碼示例,但每個函數中都有獨立的邏輯。 它不是重復的代碼。
我從中提取的示例可能最初有多行代碼,現在我們看到createQueryFrom可能引起了對重復的恐懼,這反過來又造成了怪物。 堅持不懈地重構以減少正確的重復,這樣的事情就不會發生。
翻譯自: https://www.javacodegeeks.com/2019/08/chameleon-function.html
總結
- 上一篇: 奇险天下第一山是哪座山 这座山挺拔峻峭
- 下一篇: jibx_Jibx Jersey2集成