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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

避免使用FOR –反假战役

發布時間:2023/12/3 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 避免使用FOR –反假战役 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

您是否想知道FOR如何影響您的代碼? 他們如何限制您的設計,更重要的是如何將您的代碼轉換為無人為含義的多行代碼?

在這篇文章中,我們將看到如何將for的簡單示例(由Francesco Cirillio提供- 反if活動)轉換為更具可讀性和精心設計的示例。

因此,讓我們從使用FOR的原始代碼開始:

public class Department {private List<Resource> resources = new ArrayList<Resource>();public void addResource(Resource resource) {this.resources.add(resource);}public void printSlips() {for (Resource resource : resources) { if(resource.lastContract().deadline().after(new Date())) { System.out.println(resource.name()); System.out.println(resource.salary());}}}}

請參見printSlips方法。 如此簡單的方法,只有10條線計數白線,但違反了最重要的規則之一,該方法在其內部混合了不同級別的抽象而不只是做一件事。

正如羅伯特·C·馬丁(Robert C. Martin)在他的著作《函數應該做的一件事》中指出的那樣。 他們應該做得很好。 他們應該只做[…]。 如果一個函數僅執行比該函數的指定名稱低一級的步驟,則該函數正在做一件事[…]。 。

因此,根據給定的方法外觀定義,讓我們回顧一下以前的方法,看看有多少事情在做
printSlips方法? 具體四個

public void printSlips() {for (Resource resource : resources) { #Cycleif(resource.lastContract().deadline().after(new Date())) { #Selection#Media System.out.println(resource.name()); #ContentSystem.out.println(resource.salary());}}}

該方法是循環,選擇資源,訪問內容以及訪問媒體。 看到它們每個都屬于不同的抽象級別,打印到控制臺應該處于不同的級別,以檢查資源是否尚未過期。

讓我們看看Francesco提出的解決方案。

首先要做的是將主要功能分為三個類和兩個接口,一個用于迭代資源,另一個用于選擇尚未過期的資源,另一個用于打印資源。 通過這種方法,我們正在創建一個旨在擴展的解決方案,并且還提高了可讀性。

現在是時候編寫代碼了:

如果資源滿足實現條件,則將使用謂詞接口來實現。

public interface Predicate {boolean is(Resource each);}

例如,在我們的例子中,接口的實現如下所示:

public class InForcePredicate implements Predicate {public boolean is(Resource each) {return each.lastContract().deadline().after(new Date());}}

我們將條件轉移到InForcePredicate類。 請注意,如果我們要創建一個檢查合同是否到期的類,我們將創建一個實現Predicate的新類,其內容類似于return each.lastContract()。deadline()。before(new Date()) ;

下一個接口是Block接口,它將實現對媒體的訪問。 在這種情況下,要進行控制臺:

public interface Block {void evaluate(Resource resource);}

及其實現:

public class PrintSlip implements Block {public void evaluate(Resource resource) {System.out.println(resource.name()); System.out.println(resource.salary());}}

再次注意,更改信息的發送位置(控制臺,文件,網絡等),只需實現Block接口即可。

最后一個類是一個包含資源迭代器的類,還提供了調用先前創建的每個接口的方法:

public class ResourceOrderedCollection {private Collection<Resource> resources = new ArrayList<Resource>();public ResourceOrderedCollection() {super();}public ResourceOrderedCollection(Collection<Resource> resources) {this.resources = resources;}public void add(Resource resource) {this.resources.add(resource);}public void forEachDo(Block block) {Iterator<Resource> iterator = resources.iterator();while(iterator.hasNext()) {block.evaluate(iterator.next());}}public ResourceOrderedCollection select(Predicate predicate) {ResourceOrderedCollection resourceOrderedCollection = new ResourceOrderedCollection();Iterator<Resource> iterator = resources.iterator();while(iterator.hasNext()) {Resource resource = iterator.next();if(predicate.is(resource)) {resourceOrderedCollection.add(resource);}}return resourceOrderedCollection;}}

請參閱接下來的三個要點:

  • 第一個是構造函數接收資源列表。
  • 第二個是select方法接收一個謂詞,該謂詞將被執行到迭代器中,以知道是否可以選擇打印資源。 最后,返回帶有資源且沒有到期合同的ResourceOrderedCollection的新實例。
  • 第三個forEachDo方法接收一個Block接口,該接口由資源列表的每個元素調用。

最后使用以前開發的類修改了Department類:

public class Department {private List<Resource> resources = new ArrayList<Resource>();public void addResource(Resource resource) {this.resources.add(resource);}public void printSlips() {new ResourceOrderedCollection(this.resources).select(new InForcePredicate()).forEachDo(new PrintSlip());}}

注意,現在printSlips方法包含具有相同抽象級別的單個可讀行。

請注意,類名和接口名取自Francesco的示例,但是如果我也要這樣做,則應選擇更多具有代表性的名稱。 Cirillo的方法不錯,但需要考慮一些小方面。 例如,它具有“ 垂直問題 ”: Predicate接口中的InForcePredicate實例使用五行源代碼來封裝單個語句。

我們探索了問題的兩種可能解決方案,這是Cirillio提出的最后一種解決方案。 對于此問題,還有許多其他可能且正確的解決方案,例如,使用“ 模板方法模式” ,或混合使用Lambdaj和(或不使用) 閉包( Lambdaj語法可能會有些混亂)。 它們都有優點和缺點,但是它們都使您的代碼更具可讀性,而且更重要,所有功能都只能做一件事情,它們只能做得很好。

作為這篇文章的最后說明, JDK 8將提供對本機關閉的支持,還將提供Lambdaj現在提供的許多功能。 同時, JDK 8不穩定(計劃于2013年中期完成)或您的舊代碼(從JDK 8的角度來看) 不穩定Lambdaj確實是一個很好的同伴。

我們不斷學習。

參考: 避免FORs –我們的JCG合作伙伴 Alex Soto的“ 反若戰役”,來自“ One Jar to Rule Allm All”博客。

翻譯自: https://www.javacodegeeks.com/2012/11/avoiding-fors-anti-if-campaign.html

總結

以上是生活随笔為你收集整理的避免使用FOR –反假战役的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚色影库 | av在线二区| 一级香蕉视频在线观看 | 亚洲无圣光 | 69xxxx国产| 91老肥熟 | 国产免费不卡 | 欧美久久一区 | 激情午夜av | av超碰 | 久操亚洲| 综合成人 | 久草福利资源 | 谁有免费黄色网址 | 伊人自拍| 亚洲欧美激情小说另类 | 婷婷综合网站 | 噜噜噜噜噜色 | 91视频入口 | 全黄性高潮 | 男女午夜爽爽爽 | 电影一区二区三区 | 精品伦精品一区二区三区视频密桃 | 国产精品国产三级国产aⅴ中文 | 潘金莲一级淫片免费放动漫 | 亚洲欧洲精品在线 | www日本视频 | 草逼视频免费看 | 777四色| 国产喷水在线 | 青青草手机视频在线观看 | 亚洲成a人在线观看 | 秋霞欧美一区二区三区视频免费 | 一级黄片毛片 | 久久99热这里只有精品 | 久久精品国产网红主播 | 中文字幕在线观看免费高清 | 黄色成年视频 | 手机在线免费av | 国产精品视频一二三区 | 国产免费一区二区三区视频 | 日本免费色视频 | www.男人的天堂 | 日韩欧美国产电影 | 性xxxx欧美老肥妇牲乱 | 亚洲成人免费在线 | 午夜久久一区 | 黄色小说视频网站 | 本道久久 | 久久潮 | 大胸奶汁乳流奶水出来h | 天堂无乱码| 亚洲国产精品成人av | 男女无遮挡猛进猛出 | 另类小说婷婷 | 欧美毛片在线观看 | 新红楼梦2005锦江版高清在线观看 | 麻豆av网站 | 日韩午夜在线 | 中文字幕在线播 | 日本中文字幕在线看 | 在线看三级 | 久久久久久久久久久久97 | 国产精品女同一区二区 | 午夜极品视频 | 国产熟妇一区二区三区aⅴ网站 | 天天免费视频 | 一区二区三区四区五区在线视频 | 久色婷婷 | 国产日本一区二区 | 国产黄色特级片 | 免费成人深夜小野草 | 欧美三级一区二区 | 黄色大片网站在线观看 | 大陆明星乱淫(高h)小说 | 亚洲色图在线观看视频 | 中文字幕在线观 | 午夜影院在线观看视频 | 亚洲成熟丰满熟妇高潮xxxxx | 无码一区二区 | 一区二区三区在线观看免费 | 在线播放一级片 | 欧洲自拍一区 | 碧蓝之海动漫在线观看免费高清 | 亚洲一区二区精品视频 | 一区二区三区免费在线观看 | 丰满熟女一区二区三区 | av网站网址 | 日韩成人在线免费视频 | 在线日韩免费 | 主播福利在线 | 亚洲人成电影一区二区在线 | 欧美破处女 | 狠狠躁夜夜躁人人爽天天高潮 | 极品色av影院 | 美女一区二区视频 | 亚洲国产精品成人综合 | 久久成人福利 | 成人免费大全 |