自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

如何寫(xiě)一個(gè)清晰明了的Bug

開(kāi)發(fā) 前端
本文一開(kāi)始介紹了if else泛濫后的問(wèn)題。然后為你介紹了“一提二抽三組四模式”法則。我們的項(xiàng)目也是萬(wàn)事萬(wàn)物中的一部分,套用《規(guī)?!芬粫?shū)中的一段話:耗散力一直在持續(xù)且不可避免地做著功,這使得所有系統(tǒng)都將退化。

Bug是不可避免。但如何讓自己的Bug寫(xiě)得清新脫俗,結(jié)構(gòu)清楚則是需要我們不斷努力的。

如何寫(xiě)一個(gè)清晰明了的Bug

在開(kāi)始今天的話題之前,先拋出一個(gè)問(wèn)題,代碼結(jié)構(gòu)好是好事嗎?

代碼結(jié)構(gòu)好事好事嗎?

 

如何寫(xiě)一個(gè)清晰明了的Bug

該圖是我的票圈里一位兄弟轉(zhuǎn)發(fā)的。代碼結(jié)構(gòu)好了,別人接手容易,反倒是寫(xiě)得爛了,卻可以成為焦點(diǎn)。你咋一聽(tīng)覺(jué)得這是什么神邏輯,雖然聽(tīng)著有道理,但總感覺(jué)有點(diǎn)政治不正確。

這個(gè)是一個(gè)問(wèn)題,很值得思考的問(wèn)題。

寫(xiě)程序,就是寫(xiě)邏輯,邏輯最初的樣子,就是用if else來(lái)表達(dá),事實(shí)上這就是我們描述這個(gè)世界的基本方式,if else。這兩個(gè)分支可以覆蓋一切情況。你能告訴我們還有if else之外的場(chǎng)景嗎?!

 

如何寫(xiě)一個(gè)清晰明了的Bug

可以這么說(shuō),if else可以描述這個(gè)世界上所有的邏輯。

if else就是整個(gè)世界

你手握if else 兩個(gè)單詞,心想,產(chǎn)品你盡管提需求吧,這個(gè)世界上還有我if else解決不了的問(wèn)題嗎。而且久而久之,你會(huì)發(fā)現(xiàn)寫(xiě)代碼就是if else,整天就在if else兩個(gè)代碼塊里盤(pán)旋。

 

[[272489]]

慢慢的,你開(kāi)始彷徨,開(kāi)始思考人生,甚至懷疑人生,難道程序這么無(wú)聊嗎?if else 外加crud就可以解決一切?

編程屆兩大流派

這個(gè)還是要從理論說(shuō)起,其實(shí)描述這個(gè)世界有兩種方式。一種是函數(shù)算法派,一種面向?qū)ο笈伞?/p>

 

如何寫(xiě)一個(gè)清晰明了的Bug

而函數(shù)算法派其實(shí)就是if else派,這一派是一個(gè)古老的門(mén)派,他們圍繞著一個(gè)方法體(或者叫函數(shù))就可以一直寫(xiě)下去并且能解決問(wèn)題。

而面向?qū)ο笈蓜t主張通過(guò)結(jié)構(gòu)和組合的方式來(lái)解決問(wèn)題,而不是圍繞著if else來(lái)搞事情。

可以毫不夸張的說(shuō),我們現(xiàn)如今絕大多數(shù)人也包括我本人在內(nèi),我們都還處于函數(shù)算法派,也就是if else派。至于面向?qū)ο筮@些東西,充其量注入的時(shí)候體會(huì)一下,或者在new的時(shí)候體會(huì)一下。其余時(shí)候我們都是在安靜的寫(xiě)著if else。

然而if else最終讓我們走向不歸路。

前面我們說(shuō)過(guò)if else可以覆蓋整個(gè)世界。但覆蓋范圍廣并不等于它明了。

 

如何寫(xiě)一個(gè)清晰明了的Bug

開(kāi)始的時(shí)候,你發(fā)現(xiàn)自己的if else異常明了和清晰。

 

如何寫(xiě)一個(gè)清晰明了的Bug

直到后來(lái),一步步,就變成下面這樣了:

 

如何寫(xiě)一個(gè)清晰明了的Bug

直到后來(lái),你開(kāi)始懷疑人生,于是你決定去看一些技術(shù)書(shū)籍,讓自己的心靈重新洗滌一下,這樣第二天才能稍微平靜的面對(duì)昨日遺留的if else。

避免if else泛濫的四法則:一提二抽三組四模式

那么我們?nèi)绾伪苊鈏f else的過(guò)渡泛濫呢?我總結(jié)了一個(gè)法則:一提二抽三組四模式。

 

如何寫(xiě)一個(gè)清晰明了的Bug

1、一提

以下的代碼我是從真實(shí)的項(xiàng)目代碼中摘取的。

bad case:

 

如何寫(xiě)一個(gè)清晰明了的Bug

good case:

 

如何寫(xiě)一個(gè)清晰明了的Bug

上面兩段代碼執(zhí)行了相同的邏輯,但第一種層次更多,可讀性也差,這還是剛開(kāi)始的代碼,隨著需求的不斷變化,這段代碼的層次結(jié)構(gòu)最后就會(huì)變成一堆亂麻。這里其實(shí)并沒(méi)有用什么技術(shù),就是簡(jiǎn)單的對(duì)代碼邏輯路徑進(jìn)行重新的編排,從而實(shí)現(xiàn)了代碼的整潔和更好的可讀性。

在if else的優(yōu)化中,一個(gè)核心的思路就是:更少的縮進(jìn)、更少的else。

上面重構(gòu)后的代碼,你可以看到縮進(jìn)線由三條變成了兩條,同時(shí)通過(guò)把異常場(chǎng)景的邏輯前提的方式去掉了else塊。異常場(chǎng)景邏輯一般指負(fù)向的條件,比如==null,notExist,XxxException等。理想的代碼,總是應(yīng)該把這些異常情況,提前排除掉,然后才安心的去寫(xiě)主業(yè)務(wù)邏輯。這樣你的代碼就會(huì)顯得層次分明。

 

如何寫(xiě)一個(gè)清晰明了的Bug

理想的代碼應(yīng)該有的樣子:

 

如何寫(xiě)一個(gè)清晰明了的Bug

二抽

在有限代碼行數(shù)內(nèi)通過(guò)第一個(gè)法則可以讓結(jié)構(gòu)更加的清晰。當(dāng)if中的代碼行數(shù)過(guò)多時(shí),這會(huì)就需要把可以獨(dú)立成為方法的邏輯抽取成一個(gè)private的方法(也可以是public等),代碼過(guò)長(zhǎng)時(shí),我們總是需要這樣去做,這樣可以讓你的主方法就像一篇文章一樣具有可讀性。

 

如何寫(xiě)一個(gè)清晰明了的Bug

依然是上面的forYes方法。我們把exist的邏輯單獨(dú)抽取了一個(gè)方法,同時(shí)又把主邏輯代碼也抽了一個(gè)方法,你會(huì)發(fā)現(xiàn)forYes1方法的代碼長(zhǎng)度并沒(méi)有增加多少,依然保持的良好的可讀性。

三組

上面的第二法則是抽取一個(gè)private方法,還沒(méi)有出類(lèi)。當(dāng)我們抽取到一定地步,會(huì)發(fā)現(xiàn)適合單獨(dú)成類(lèi)的時(shí)候,應(yīng)該把之前的這些private方法移動(dòng)到一個(gè)新的類(lèi)中。這個(gè)就是第三法則:組合,通過(guò)組合的方式來(lái)構(gòu)建你的邏輯。

 

如何寫(xiě)一個(gè)清晰明了的Bug

 

如何寫(xiě)一個(gè)清晰明了的Bug

 

如何寫(xiě)一個(gè)清晰明了的Bug

四模式

在用完組合后,我們的代碼其實(shí)已經(jīng)基本上比較清楚了。但為了讓我們的代碼更加的優(yōu)雅,更上一個(gè)層次。有的場(chǎng)景下你需要使用到設(shè)計(jì)模式,設(shè)計(jì)模式被總結(jié)成為最佳實(shí)踐,不是僅僅用來(lái)寫(xiě)框架用的,寫(xiě)日常紛繁復(fù)雜的業(yè)務(wù)邏輯代碼也是需要設(shè)計(jì)模式的。

接下來(lái)我就以自己正在開(kāi)發(fā)的項(xiàng)目中的場(chǎng)景為例,來(lái)說(shuō)說(shuō)如何使用設(shè)計(jì)模式改善你的既有代碼。

在項(xiàng)目中我們需要為審批工作流提供一個(gè)回調(diào)(callback)接口。審批流有不同的狀態(tài),不同的狀態(tài)回調(diào)會(huì)執(zhí)行不同的邏輯。在重構(gòu)前的代碼大體是這樣的:

 

如何寫(xiě)一個(gè)清晰明了的Bug

我們希望最終的樣子是這樣的:

 

如何寫(xiě)一個(gè)清晰明了的Bug

首先新建一個(gè)State接口類(lèi):

 

如何寫(xiě)一個(gè)清晰明了的Bug

然后新建三個(gè)實(shí)現(xiàn)狀態(tài),分別是Yes,No和Cancel:

 

如何寫(xiě)一個(gè)清晰明了的Bug

然后新建一個(gè)Context類(lèi):

 

如何寫(xiě)一個(gè)清晰明了的Bug

然后,新建一個(gè)State工廠類(lèi):

 

如何寫(xiě)一個(gè)清晰明了的Bug

改造完畢。通過(guò)上面的重構(gòu),我們使用了狀態(tài)模式和一點(diǎn)點(diǎn)工廠模式。最終callback方法就只需通過(guò)newInstance就可以找到具體狀態(tài)的回調(diào)邏輯,而以后即使?fàn)顟B(tài)在不斷的增加的,你也只需新建一個(gè)新的實(shí)現(xiàn)狀態(tài),然后注入工廠類(lèi)中,做到了可插拔。值得注意的是,這里我們的state其實(shí)并沒(méi)有很好的被傳遞和持有,這很不“狀態(tài)”,這通過(guò)這樣的方式我們實(shí)現(xiàn)了對(duì)callback的重構(gòu),結(jié)構(gòu)也更加的清晰了??傊?,當(dāng)你遇到業(yè)務(wù)需求的不斷變化,你需要找到一種合適的設(shè)計(jì)模式來(lái)hold住它,即使GOLF不能滿足你的需求,你也可以自己創(chuàng)造一個(gè)設(shè)計(jì)模式來(lái)讓你的代碼清晰易懂。

總結(jié)

本文一開(kāi)始介紹了if else泛濫后的問(wèn)題。然后為你介紹了“一提二抽三組四模式”法則。我們的項(xiàng)目也是萬(wàn)事萬(wàn)物中的一部分,套用《規(guī)?!芬粫?shū)中的一段話:耗散力一直在持續(xù)且不可避免地做著功,這使得所有系統(tǒng)都將退化。設(shè)計(jì)最為精巧的機(jī)器、最具創(chuàng)新組織力的公司、進(jìn)化得最完美的生物都無(wú)法逃脫這一最為嚴(yán)酷的死神。耗散力就是一個(gè)系統(tǒng)運(yùn)轉(zhuǎn)所產(chǎn)生的摩擦力,系統(tǒng)復(fù)雜性所帶來(lái)的無(wú)序熱量,你的代碼也一樣,也需要通過(guò)不斷的改進(jìn)和重構(gòu)來(lái)盡量的延緩和降低熵的增長(zhǎng)。

最終我們都將屈服于各種形式的磨損和衰竭,熵能殺人,你需要吃飯!

責(zé)任編輯:未麗燕 來(lái)源: 今日頭條
相關(guān)推薦

2018-01-29 21:56:28

Bug程序程序員

2022-10-08 00:06:00

JS運(yùn)行V8

2012-07-11 23:26:10

bug測(cè)試

2015-04-29 10:02:45

框架如何寫(xiě)框架框架步驟

2017-08-21 16:36:12

語(yǔ)法樹(shù)AST解析器HTML5

2020-05-19 15:00:26

Bug代碼語(yǔ)言

2011-05-26 09:39:53

程序

2019-10-22 14:06:13

Docker軟件Linux

2017-08-10 14:55:33

前端JavaScript 函數(shù)

2019-10-23 05:08:55

docker網(wǎng)絡(luò)模式網(wǎng)絡(luò)協(xié)議

2009-09-14 17:08:02

WebFormView

2025-02-13 07:00:00

Dubbo-goJava服務(wù)端

2013-12-10 09:50:03

技術(shù)技術(shù)博客

2021-10-08 07:50:57

軟件設(shè)計(jì)程序

2017-10-10 15:14:23

BUGiOS 11蘋(píng)果

2022-03-18 08:37:12

二分查找算法元素

2018-12-19 17:20:17

2022-07-14 14:18:59

Kubernetes架構(gòu)

2022-02-28 08:07:17

Java類(lèi)開(kāi)發(fā)

2024-04-22 00:00:01

Redis集群
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)