From c9fd81f26177700f6c6de608d9e2556ca29c08fe Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 4 Mar 2018 15:18:49 +0800 Subject: [PATCH] auto commit --- notes/重构.md | 26 ++++++++++++------ pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png | Bin 0 -> 11264 bytes pics/9d549816-60b7-4899-9877-23b01503ab13.png | Bin 0 -> 17408 bytes 3 files changed, 17 insertions(+), 9 deletions(-) create mode 100644 pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png create mode 100644 pics/9d549816-60b7-4899-9877-23b01503ab13.png diff --git a/notes/重构.md b/notes/重构.md index 772db892..0e697888 100644 --- a/notes/重构.md +++ b/notes/重构.md @@ -13,7 +13,7 @@ * [1. Duplicated Code(重复代码)](#1-duplicated-code重复代码) * [2. Long Method(过长函数)](#2-long-method过长函数) * [3. Large Class(过大的类)](#3-large-class过大的类) - * [4. Long Parameter List(过长的参数列)](#4-long-parameter-list过长的参数列) + * [4. Long Parameter List(过长的参数列表)](#4-long-parameter-list过长的参数列表) * [5. Divergent Change(发散式变化)](#5-divergent-change发散式变化) * [6. Shotgun Surgery(散弹式修改)](#6-shotgun-surgery散弹式修改) * [7. Feature Envy(依恋情结)](#7-feature-envy依恋情结) @@ -170,9 +170,9 @@ double getTotalCharge() { 重构后整体的类图和时序图如下: -

+

-

+

# 重构原则 @@ -232,6 +232,10 @@ double getTotalCharge() { # 代码的坏味道 +本章主要介绍一些不好的代码,也就是说这些代码应该被重构。 + +文中提到的具体重构原则可以先忽略。 + ## 1. Duplicated Code(重复代码) 同一个类的两个函数有相同表达式,则用 Extract Method 提取出重复代码; @@ -244,21 +248,25 @@ double getTotalCharge() { ## 2. Long Method(过长函数) -间接层的价值:解释能力、共享能力、选择能力; +函数应该尽可能小,因为小函数具有解释能力、共享能力、选择能力。 -分解函数的原则:当需要用注释来说明一段代码时,就需要把这部分代码写入一个独立的函数中。 +分解长函数的原则:当需要用注释来说明一段代码时,就需要把这部分代码写入一个独立的函数中。 Extract Method 会把很多参数和临时变量都当做参数,可以用 Replace Temp with Query 消除临时变量,Introduce Parameter Object 和 Preserve Whole Object 可以将过长的参数列变得更简洁。 -条件和循环往往也需要提取到新的函数中。 +条件和循环语句往往也需要提取到新的函数中。 ## 3. Large Class(过大的类) -过大的类做了过多事情,需要使用 Extract Class 或 Extract Subclass。 +应该尽可能让一个类只做一件事,而过大的类做了过多事情,需要使用 Extract Class 或 Extract Subclass。 -先确定客户端如何使用它们,然后运用 Extract Interface 为每一种使用方式提取出一个接口。 +先确定客户端如何使用该类,然后运用 Extract Interface 为每一种使用方式提取出一个接口。 -## 4. Long Parameter List(过长的参数列) +## 4. Long Parameter List(过长的参数列表) + +太长的参数列表往往会造成前后不一致,不易使用。 + +面向对象程序中,函数所需要的数据通常内在宿主类中找到。 ## 5. Divergent Change(发散式变化) diff --git a/pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png b/pics/2c8a7a87-1bf1-4d66-9ba9-225a1add0a51.png new file mode 100644 index 0000000000000000000000000000000000000000..1659fdaea39947d537811ca3867a66c4234c5a02 GIT binary patch literal 11264 zcmeHtc~p{n+b)%5wzt`~+LczcE2joc&8bwf!FfQ8(FvOzl@p!?Nrx8=alOFkgf_d^@z=Vcl(B&Y|_-ep#&^8kp5GZ?> z>M{`MvXl}CbnRZY6bSVGwx?Z ziu$as{s=w0TBvVY4_v&n?$a9wrdfZmBIEo!;Y$zqqoVQOxR+wXe@hB|a+P>Dw>Q3a zOt-r=g?E!wb3@RvYjS8aXQwL5oE@~usstR;jwndioc<;3k_;!u>_d|#;{>!XVRS@2 z*%iXbqCxe%1~yH7k!P62Ka2P3zMEaStCixhuL|95RQ)KRu}Q~}?PtMF1)EHK z&C;+W7r3Y(BH&nm>{VFJU8@4H(M#id_8L*0_YP`=mHn>{n0bti{`O{*vj%y7rso%p zx@Tzv;mnevv34A+edIo1${3WVXCca$d#a+9Yu33pcuv5?;|C(ytsfh4EktT7!lOkv z^Hv2{9IjTqD`cNwFj}q@N35TH7cDJUYAl&&GcUAJmAcz=XU#482~9X_nqVh8e>^id zaM4kfv!kuciXh9ZqXQ1zXYHYpFcR?>yUDePLQchOEj=&FfhJAFt;c6vvpI{4PRqVL zpgw}KkQ=#ybOif|F(N9)Ca7FRH4|$!k?^1vA$-E%=LKtw%#VTOn;Fm{eD|J=Y zdEkn}we&Ztsy5qBNh!7D)@e-ScVEgge*UDfD>xnu2`#VAw<^E^7wVMGHJ8+UxuEy` zA{Pg?US{Ob2yY3Q1wF_EeJlF%=s}farFU97o`=t8M)tB%<`lW>efh4+Gta{uC3 z6^()(J~Kc0v7(2aFL>o6!_hA97ER@PI)I&y73LSX_Wzzl=z)#$L>)YnJO#a>o?sM? z~8IDn?PBVoNB!Qk0`L6H5N`*OpB~bagq=>0oqqsEGQD}W)LMJy2PXZ6!OGW zJfY$;_Pz6%K!L{2B&e8Hd598yv>-g3F{;+JS}>Y7;2ZG=g~}G`j}0y+;COesUYvca zz4Wt#<~mTCe!Xjhhcd6I5U%*qbC|dlv`adhyFS;IfcWBHWaQ#B)O&?f)9cHF2skuU zk&pKIMq{UZPe}T{5VBk0-L2kFjUAlR;fEb!5JoHqjELJOXcuuW5faaUMKd37WnXRp zj>8|%i9f|rK*c}7IZ!1$jHH?o_b&b^&#+C)iI>yhTYVbUi&UYFk5w^yh8XR+q#F%~ zny4uX#e(AS5-(dAu8`J^+>fJWfH_SC+>`_kZQ$)UC8Gx+eTcD30%dmFo5k|!=uFeI zNzA(_XPtgBr;1Y9dicFC4L-PVy&>R?|GogNxJEGMK_nDgs^`o?S9c&=ZVRZ_^7R zC%5Z|yt^0?=tfrWSDNins%s>aI##p3sW@is%^A2D@dukWWaBG*{6w1ZAxwR#7;WpX znzf#a>((7^eak9xz zW{ySl7JB-{uRygY5yHyRnZs4g-ZC}XhhDr@m<%f99$vGGO7(IRvWTaU-HHfUW&Qi7 z4dYFSc;t^{NlLFaf+i6X2s&RbifowO*9!>!+oim^!cU_wUyDU6+6!SrJ+<|*yHvNe zIq*mi`+VgNBI@H9dqbQl^gMCr3f2`Tie{fD31d|_hG=^fu=cb209HH}89?(grw12G z%;L9~MB93&GVXfZQ|vj+kz~P(LnrMqnTb~8MZpnqDCF@7>klV|N^F|volsE&wdLZc z;LD5Xak-_Hrgz-7e8w#r{^Zb=+18YiE^i%7*Gy`VQMj*MAj{&yEbWe1+JuA#{Q3^> zQyxh|2WV?}jWlFm*0<`PK84v~!SWXzS95SgKv-^=(|9l*P6Xo{pN^Q(+#UxPq#x7A z@_c5sjmRYd5qYfZhB$tYbb^nd;o=z2>v-?mvd6OSJ;zud(gh(C>W}bkEFCT<6~|)n zKNhsPrP8?$-urI}ykK zH@r*vv*5IPTw09pgxcmVMfPt=DL0fyI}5I+Bxglw)@y?Qm88Ai?GB;j+OrSrH(Kcx z?qwV$pZNZ@yMm5fSEu8FJiXC>!{}0OFfR}f!nfz;=AW@fzB7ZKlTS;r${9WD8os7+ zwlVVG(7(h$(LSu{KPWxu1^qFT~RN zC8y#i%Qa?yc)6xEg4FB&2 zrR{Na=O$R>CC&^*16Kd_{y3_W z3d5i{gD;|s+98s8K`L^DNV}0Em5Si~G~G=nz>EdsIh=X1W6nMt)In(6hdq^yd}T?lH!MZW3e(4g z*F>)b?Z-=6WpDhl*l>sNF!&*No;J-NnG|P zWmV3Q6SQ#fnVQS25b8yseNwtMD||1V`-$t-Ga~|yyPvh0NJrxPM<4x^rv~9r#xV<9 z0n;%tJqo&Top#RI99UjIZoJ9=m<4&#oD^9(6z^%5jHsqhxs{|N2z?=@_$?sNhj#mD z2N5Q1&8m$X`kp1M7jut8n1<;2DaIQs{$_ z@&Hn#_eX^a4`X=dzAkcBI0nu)q?7af@!K>gmAK8E=}W^R3L6A^9&k?~>9Oskwv+id znWL^Es(PoY+Fgs%pTNeg*_BS9w&4T2?&0p+3%8)Y-tNm!>*I@N5YRhZQ8PP!yOFB~ zc|xa3h!u)9Z%l@#D*OVN+}aWCfOOn^CTwH!=3?D_gtI=?U^Q{RCL-9wj)ZjcU;zDff zLrn}jo$lVg40MezV_94;7BGw6&rIawJR!kXw(Rw4Kug3NZ4l@H#N>7rcz#eCco&Zm zF$Jlwgp4BmDKGK38Kf4yD*2C)beWV}-{JIj6;Yu>4wP)(|MD+TE^h7l6Aff#AY4kR zcL59MZe_ntTR=Gax+ItNNoT?szyA%Lh*Hzp71xv;s{aOHzhIrmVBi873MRL877)AP z57o@;V2gfibZ9RJ)Jp7)9(;7whIluWSz%{22av zgaiv=Ru+Q^0@d8kzHBO9u-@3oa=h6BE}rf*Zqrd!n)m<3(%_pNNcD7n6h-shwj}vg zVX`+!Qn}^(pDYJu>@k^mH_t+1++cUG6R+eTby*etk5*8WV-)nxj=hMMb_USJ!$u}P zCsAk*?NiaWHUU%y{ryp$sRH0zq_sQbz{c(?3lM8Jx)2P8YYYnQTx!*%DoqNHTB>g; zDzu$lU)MLr)T%GYPCU}v?&kx6i`JNy*+E+fdp~#|&Jj`kN(Y@^C{srGq2f|}SY`bh z%d4M|)fvIiv?AD``;Ru;=AvF-Wc4j5-HIKc<-BWq(5H+^l{&-l*^5IeJ4lg_lUTE7 z|A=Qt?*4VRYWGmWKF3FAE5*hpg|Y`breWKuTzGLBjE024B;o8V!w9Z_2pMKfE66^{ zW`uYTT)?3Swcyhix|lAtM8V3ohu@QL;@ybVHuSfY56v4S5~&p>-Ew)8>u-^mt=c zgsWaVGJG2dl<&{YKB@9HZ^$NHJnGO2ArKq)0})xXszmDA8Z*?_&2P0r)ZA=zOiAdQ z@ixnHWcS;f6wpIOxZ(~mPe^MRXfEfJgy;ac$nEy8bRCQ!jC z+qvqMx#IPy7hjoz4a0K~m0p$13oRma9nez{uEuPhjHM15)whwA?~=nhQ9_+^n?m+! zfUY@?c9OKQl*yT}hkIh{gj1wV!4v(Zz#+|{=9>$B1c9B>@t)+!#&;^Z3)Zc?2UsU( znb5?V`zRi2ig)Ijy~v}}xt!j)jY)92A3rpLDCsZ*mn7ds(}OUJ4rcz|7Wc!!v3#wV z{z>_yoquH4Zzz!kEgropAh~sub@yhLVB<;Mm9h5FJBHK%GS>&2opd#%&||bJe*FXa zS~wpa!4h`fdfRM_2;XL<7uNrh*zuiFWfpRoFX&f>;_iyVzk0+*$#?0G0TrF02PFIM zbt4poJ(0T)u;8W7wWu|@qS+_vdP4yMy8;j>*%W$c7qPNby((fN7kdgjz#4Lh2DG(V zsa);*8W*mNWrp=$--Xfh?b@XK$$Rnpft&t;Hm)_1tzjN;tX*Q3;ng6c3z$Wu*_Tjz z^Dn~qySj;5YsCa|7t3n_nLvQgcLC@#4|_s$hf~)ljdq~FndEW(NP4J^`XEq@l4_Z< z>b6tM?ZDykH{>5Mkn$%Qlu8>=c0e7b#4G^cWfv6GatGs>gB|pc2iBoFaNiG_*gFb; zojVU|20uZ49eg2>CthgJDiK2wikId6;ppVnL&R8hY*!CERsMls@SuZ9VSfPGc009> zTV5ZV(6mtbtrXqI9>zRBVJ;?_x(`ei#mx?&u;#u6$kxPi2<+db$@Z}(Ke-k)nuy|ILNuftfYcjO@+3tUOQfVGkaNqv=wW z{(ZOq(bq1iK|p(s?{+zvGOpocwXTrTBe>sLN?(<*X0J}wi*aDeB$jYy=5x&A1Aeuv zLYFww@Yx$!=<{&iM$n+cYRh67OQA*fIC=1_uV8RxexBSEVs09f5V)qC9AYtLF1dTV z@T3O#91VoEgr2j3_U%*o!{9|B^rVVXe&_>&jqT$;Xi}3X7Zd0&@_C}fNxk2F>)t-c zvpcHuyQBHU`*tCEH=pRAgx;x(&(ZK-HW<3-`1FzC98oK`^Qgng=S9>VyZZ+m7@;zz zCTcw4{qDn6*-5AY0wm^F%LD{CNEq|v#{lzJ7p6O%%|ALw;$Z|oa39=C#Q*MpzDz+@HfQsWV>;17s zu%PZ>R;ZBW6C0js_4ucIfs#vXzpUS2IaO`4Q-!@Tig9Tr79e_B@CelSxRXmk_Wco> zCcB2v5fkrPy=_-}l`!QhjR2!uzzHc+1cV0D5GA-AqR5&d!lv!KNgT{h+NGh2c4Ies zdkJM4l=sI%SuU&Y$a;-64C|tA@uNRG5bbbPv^-xZwcG*KKaP^8S-_Xd)&A*$m&S|+38XC@*^vw#9ax- z8x|?EBoCS}rcDOQ_2Q&Ll9ng;f+O?}8eCy*T;|*4$5W|3ou3Q{k~)*+^`YowB)!5A z_x0h|?f^Yll0C&6+;=94R_sV~m;W&&FLAVIksFUQX38=?@NoXSS9gz`Lmc^Y&2Oj! zPsjXPbS;5SPyz6T1e&WxyULO78Bwi0lX|GiI>3qq$yuk@hXWd2AB)3gzgf#tu}tt0 zUJ8P=_k@eY9Q-fWXumCR#X(ZgPN7&h4XdAN+3U=k>UX0ux*Z9bnp&qC4W$h}+CkxV zU$J>n)=Ag*w)GvQPAZ(^VWi=mJ`j8kW3h{ds}KKE3A|!K&&Jk-|kBsxwVE+hvEx8Poy9 z9Y)4T1Y2sh-dnjONGt%mVA=Bx^7lMZoF1qBqOUQKy6~Cdx10^{$L$9STiCe^k`(%(uv`mkuwHHxxo+34&0!86rl5dx*=nI{LC{~F#FF#422Y`jS< zL@h}!E&zKLfd=oRg*1Ap-y|UL6oIPl5*b0Im(B*j!AlAW(E0!xu3zaM?u`91qKh3x zbrBc$eU%PG#yjNoMA=SDmW5!1=O5QqOY&TdR z!7D{egmjo_2rQ||3f{bBmlrT8%Z@c)ItwU4OX1mi4BeGUE;`BKPLZZ-XV)ro8x@ho z44xfE(8bY?!9GjU)Yi?|)pQdOq?Tr%z>5vT$r~;Pq z9&L05Jv7OD@i}l-HqaITZS?#Q7{B%)42b2z<;t|qH{McHT3010jHFA*Q06w8`_Rh` z-#CzB7opZ^w*sY8!`H5Scw^`yvcH>^Rgno`I1_T+|Y)X#P@I!UP3kS{vanr9Y* zu{=pTwNvka5yuD&n4w~qRjdH)vVhEe1r`T#cw~tvylr+NgNx!J;yH#2g#Q-)jxL%C zqXrLhgS2>Uho_6>_V7s-q^v;>TydeC4m?2Kv^E-;brS4Ht>|*3147%}J)C$ppLxr$ zcXnZnjbB@hO{}TyR>vtT&CyTvjFq+OsK-9R&*%t9+=mUz+HPmR4l~4v=NTd%9d;8d zplygrDQDq;0neE%=mF-p3;ep zE8Ehur844BVvRStwsV7|K8cVA$VPIKX=Y;Tcr#`beMTb4g}JA{lLRWz8eGlw5DOD;SR2scqXJJOM3rg+R@>mJn;15JALNOt2l z?65l{;x-^)KDuq77u-|nc}}K}Y{&ij`4xw*l3s)!QwW3SWG4wx=8Q~NXp1qDhC8+@ zx0xVE6nP!O3Osk3$ecM-x*~DKPOAi~X@*1Hr_oMB6dUoO&}ul#D1uvWrx&yw#;)-1 zeLK(XtPMB5e$H*Y0FZmCVJh){1LNiOX|O*^JQ_x;U+kjv%o{iReAJyhK|*eU;Pk6# zOcSSZ!|(d?`&Ekw}gD%@qYKdYjc_5gB##tw`5=*t_8< z)TngO;YIdQQv_aaTm70}Hf|`7JbZpTRafxUo=NZ;CWeBwkuJv7f;5$;`LI zl?LPhgq10}?XUMjo89-LX|oJG&`pL?O4qIv?dGiWa&0ACq(t|vp50VVW0qTlJZ#1t zRcMmcej8=`)rw>b!QisHZ{0>Pt8i;s*#dLmbJx7g9- zAZ-%Tx@SumO_CUe077tSkF;7!i@T1;P@1(>rn-UZ$ZMlVJ5(le<$jYn%0HN!$?ztR zRzLcZcf`K$>pGPFTLk1h(2QwQ$RchIp&zN?*!Wg}fc6pUHzO)!k5o-wbi3NHjhx{K zJ@in}aC}ie&PXT1T{X&f6KB;i&V`K7QbDHQCr{gMn$?S)Dhxf;<8FmkFrtDQlc}p3 zM@aQqAPyZfRrUL51K^1jEd`hpL2$Krg3^p@j;eA3YC4DAm)av+U+9ufVI*HChUM%HIpbXBg-?Z?^wsmQY1kGl%+Lq7jp46r+GE*I$&abxg$v_wE%DFj5< zRT*Dj@RZio19A@Ykj)u*s}ngmj&v8$5>%^H=B&D;@rZvkc^t(j?41>$zUN2YkD{d% z<#FWm_xuwC2Xc8f%a7WQ?%m+@+@()Nk$*5x_C$_dFu}rn0^Oqb6;x1b=C~88GsRMFnaDYXRGbPT@O%iQ!RUKQtbwfYU088u0K>YWu(=XJm#W>S|Oxh4-Ly1IBz5K1|sPE$I^=( z=P#$aloN%G-iNS-qI4_H)+QCzWxu`)ITLim`|aqIV&a5*o`@@7QhDhG(+f+arKp_-PM}B0 z4GAgix6-Jutew5rwP1_>=V;M{;${j~yN=yADNsxd1>SDt|fwETXiZ^{7VYJJ8!)>e@Bfb252^#Qv?&ib(9yR_oZjZG;a%9_1)L}V+Z-4+~lnY{Pmt5 zz~}%4{^tkRe(V>YYw8dDz4ctCzp5$y-|b=n>FodAGjP*2wF1dAjKkyZlcs>7Adtlg e+vBB2&qV!C{r^w>|4;n`-Twc0lmDNo|NjExqOmFf literal 0 HcmV?d00001 diff --git a/pics/9d549816-60b7-4899-9877-23b01503ab13.png b/pics/9d549816-60b7-4899-9877-23b01503ab13.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4e04cc901dc959c32d2811762d6db69820e56d GIT binary patch literal 17408 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