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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

无效方法为行为黑洞

發(fā)布時間:2023/12/3 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无效方法为行为黑洞 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果“認為有害”的文章本身不被認為是有害的,則本帖標題為“認為有害的作廢方法”。 哦,好了

無效方法在大多數(shù)面向?qū)ο蟮拇a庫中無處不在。 在運行時中某個地方發(fā)生可變狀態(tài)或I / O的直接后果是,您可以包裝功能編程狂熱者稱為impure的任何行為,該行為原則上沒有有意義的返回值。 一個常見的示例是在應(yīng)用程序引導(dǎo)期間,例如在Java中:

@Resource MyClass implements Runnable {// ...@PostConstruct public void init() {if(this.enabled) {this.executorService.scheduleAtFixedRate(this,0,500,TimeOut.MILLISECONDS);} }// ... }

上面的代碼據(jù)說不錯,但是公共無效方法,尤其是它們在給定代碼庫中的擴散,顯然是代碼的味道。 即使以面向?qū)ο髽邮竭M行編碼。

您的

公共方法供您的類合作者使用,它們是類功能的門戶。 因此,它們應(yīng)盡可能簡潔,并提供實現(xiàn)類行為所需的最小表面積。 任何函數(shù)定義的一個主要的自記錄部分自然就是其返回類型。

讓我們從前面的示例開始:

@Resource MyClass implements Runnable {// ...@PostConstruct public void init() {if(this.enabled) {this.executorService.scheduleAtFixedRate(this,0,500,TimeOut.MILLISECONDS);} }// ... }

我們的類可能在構(gòu)造時收到某種executorService實例,該實例可能是從某些依賴項注入粘合代碼獲得的,然后啟動了工作計劃。 客戶代碼需要顯式調(diào)用init()的可能性通常很小。 這表明我們的@PostConstruct方法應(yīng)該具有更嚴格的可見性,可能是private或protected ,而這將是結(jié)束。

但是,真的嗎?

可測性

假設(shè)我們要實際測試工作線程的關(guān)閉行為,這通常是一件棘手的事情。 您想做的事情大致如下:

// changed code from the original MyClass file: @PostConstruct public ScheduledFuture<T> init() {if(this.enabled) {return this.executorService.scheduleAtFixedRate(this,0,500,TimeOut.MILLISECONDS);} }public testExecutorShutdown(){ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();MyClass c = new MyClass(service, true); // executorService, enabledScheduledFuture<T> scheduled = c.init();executorService.shutdown();scheduled.get(1, TimeUnit.SECONDS); // throws exception }

上面的測試代碼測試了計劃的操作在執(zhí)行程序關(guān)閉后的1秒(或兩次計劃的迭代)內(nèi)終止。 這樣的測試依賴于訪問由init方法返回的將來的對象。

自我記錄

人類的知覺被他們當前的意識視野所遮蓋

– 埃利亞·懷斯

我們對init()方法所做的更改啟用了行為測試,但帶來了一個重要的副作用: ScheduledFuture對象現(xiàn)在是MyClass公共接口的一部分,這意味著現(xiàn)在任何客戶端代碼都可以與其進行交互。 這是否是一個理想的屬性,實際上取決于MyClass旨在支持的用例,并且可能您希望將ScheduledFuture封裝在一個更友好的類中,例如,僅公開bool isDone()類的東西。

無論如何,保持上述init方法為空將始終導(dǎo)致您的客戶端代碼(或開發(fā)人員使用他/她的IDE瀏覽init簽名)而無視MyClass.init()的實際作用。 只需看看不同的簽名,然后想想自己針對每個簽名進行編碼:

public void init() public ScheduledFuture<T> init()

后者將在您每次需要使用它時為您節(jié)省大腦周期,因為它清楚地說明了其產(chǎn)生的效果,而無需查看代碼或更深層次的文檔。

一件事做好

當函數(shù)一次執(zhí)行多個操作時,堅持函數(shù)返回一個值以明確聲明其行為的想法顯然是不可能的。 幸運的是,它本身就是一種代碼味道 ,并且通過將返回類型視為函數(shù)的存在目的,可以使違反該原則變得更加奇怪。

結(jié)論

對您自己的未來以及對使用您的代碼的所有開發(fā)人員都是好事,永遠不要再在公共API中隱藏諸如返回值之類的寶貴信息。

擁抱與親吻c。

翻譯自: https://www.javacodegeeks.com/2018/05/void-methods-as-behavior-black-holes.html

總結(jié)

以上是生活随笔為你收集整理的无效方法为行为黑洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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