電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 35|回復(fù): 0
收起左側(cè)

嵌入式 C 語(yǔ)言,高內(nèi)聚低耦合是咋回事?

[復(fù)制鏈接]

448

主題

448

帖子

539

積分

二級(jí)會(huì)員

Rank: 2

積分
539
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-9-27 17:50:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |正序?yàn)g覽 |閱讀模式
我是老溫,一名熱愛(ài)學(xué)習(xí)的嵌入式工程師6 K7 \# {- E; s9 @; u9 L0 i2 }
關(guān)注我,一起變得更加優(yōu)秀!
& z* d8 _& |4 q- L) A, p0 p一、原理篇9 H5 u! h: D0 c7 |. }9 v" n  e
在軟件工程中,模塊的內(nèi)聚和耦合是度量模塊化質(zhì)量的標(biāo)準(zhǔn)之一。內(nèi)聚是指模塊的功能強(qiáng)度的度量,即一個(gè)模塊內(nèi)部各個(gè)元素彼此結(jié)合的緊密程度的度量。若一個(gè)模塊內(nèi)各元素(語(yǔ)名之間、程序段之間)聯(lián)系的越緊密,則它的內(nèi)聚性就越高。, z. o9 U5 n6 P/ v  j+ k- R
耦合是程序中各模塊之間相互聯(lián)系緊密程度的一種度量。各模塊之間聯(lián)系越緊密,其耦合性就越強(qiáng)。模塊間耦合高低取決于模塊間接口的復(fù)雜性、調(diào)用的方式及傳遞的信息。1 A) E* g" v; h  x' I
在程序設(shè)計(jì)中提倡的是高內(nèi)聚低耦合。所謂高內(nèi)聚,是指模塊是由相關(guān)性很強(qiáng)的代碼組成,只負(fù)責(zé)一項(xiàng)任務(wù),也就是常說(shuō)的單一責(zé)任原則,這樣的模塊,無(wú)論從設(shè)計(jì)、實(shí)現(xiàn)還是閱讀,都能體現(xiàn)出其保持專一性帶來(lái)的好處。
* H# J7 K  D  ]而低耦合,是指模塊之間盡可能的使其獨(dú)立存在,模塊之間不產(chǎn)生聯(lián)系不可能,但模塊與模塊之間的接口應(yīng)該盡量少而簡(jiǎn)單。這樣,高內(nèi)聚從整個(gè)程序中每一個(gè)模塊的內(nèi)部特征角度,低耦合從程序中各個(gè)模塊之間的關(guān)聯(lián)關(guān)系角度,對(duì)我們的設(shè)計(jì)提出了要求。7 ]- ^+ D" O0 D  O
程序設(shè)計(jì)和軟件工程發(fā)展過(guò)程中產(chǎn)生的很多技術(shù)、設(shè)計(jì)原則,都可以從內(nèi)聚和耦合的角度進(jìn)行解讀。作為C語(yǔ)言程序設(shè)計(jì)的初學(xué)者,結(jié)合當(dāng)前對(duì)于函數(shù)的理解可達(dá)到的程度,我們探討一下如何做到高內(nèi)聚低耦合。, r  y! u' O* S7 p, m, y* v# ~
針對(duì)低耦合。耦合程度最低的是非直接耦合,指兩個(gè)函數(shù)之間的聯(lián)系完全是通過(guò)共同的調(diào)用函數(shù)的控制和調(diào)用來(lái)實(shí)現(xiàn)的,耦合度最弱,函數(shù)的獨(dú)立性最強(qiáng)。& ?) j5 k- i3 D! k+ B: a0 i
但一組函數(shù)之間沒(méi)有數(shù)據(jù)傳遞顯然不現(xiàn)實(shí),次之追求數(shù)據(jù)耦合,調(diào)用函數(shù)和被調(diào)用函數(shù)之間只傳遞簡(jiǎn)單的數(shù)據(jù)參數(shù),例如采用值傳遞方式的函數(shù)。3 O0 Q% t4 m0 J4 Z" E
有些函數(shù)數(shù)在調(diào)用時(shí),利用形式參數(shù)傳地址的方式,在函數(shù)體內(nèi)通過(guò)指針可以修改其指向的作用域以外的存儲(chǔ)單元,這構(gòu)成了更強(qiáng)的耦合,稱為特征耦合,在這里,使函數(shù)之間產(chǎn)生聯(lián)系的是地址這樣的特征標(biāo)識(shí)。另外,有兩個(gè)函數(shù)可能會(huì)打開(kāi)同一個(gè)文件進(jìn)行操作,這也構(gòu)成了特征耦合的一種形式。
  Z8 c1 O1 b2 v! A2 b* @& n( U" J' }更強(qiáng)的耦合是外部耦合,這里,一組模塊都訪問(wèn)同一全局變量,而且不通過(guò)參數(shù)表傳遞該全局變量的信息,當(dāng)發(fā)現(xiàn)程序執(zhí)行結(jié)果異常時(shí),很難定位到是在哪個(gè)函數(shù)中出了差錯(cuò)。不少初學(xué)者覺(jué)得參數(shù)傳遞麻煩,將要處理的數(shù)據(jù)盡可能地定義為全局變量,這樣,函數(shù)之間的接口簡(jiǎn)單了,但形成的是耦合性很強(qiáng)的結(jié)構(gòu)。
4 X) i' Z0 T) u$ E在C語(yǔ)言中,還可以通過(guò)靜態(tài)局部變量,在同一個(gè)程序的兩次調(diào)用之間共享數(shù)據(jù),這也可以視為是一種外部耦合,只不過(guò)靜態(tài)局部變量的作用域限于函數(shù)內(nèi)部,其影響也只在函數(shù)內(nèi)部,耦合程度比使全局變量也還是弱很多。由此,我們可以理解前述在使用全局變量、靜態(tài)局部變量時(shí)提出的“用在合適的時(shí)候,不濫用”的原則。
. F( F0 R! n( @, |  h# T針對(duì)高內(nèi)聚。內(nèi)聚程度最高的是功能內(nèi)聚,模塊內(nèi)所有元素的各個(gè)組成部分全部都為完成同一個(gè)功能而存在,共同完成一個(gè)單一的功能,模塊已不可再分。這樣的函數(shù)功能非常清晰、明確,一般出現(xiàn)在程序結(jié)構(gòu)圖的較低被調(diào)用的層次上。
% y" @0 @! ^/ L- C6 Y% g次之的是順序內(nèi)聚,一個(gè)函數(shù)中各個(gè)處理元素和同一個(gè)功能密切相關(guān),通常前一個(gè)處理元素的輸出是后一個(gè)處理元素的輸入。對(duì)于這樣的函數(shù),如果不致于產(chǎn)生高耦合的話,可以分開(kāi)兩個(gè)函數(shù)實(shí)現(xiàn)。
9 k7 Y7 p+ t2 l9 r/ L% c1 y; c有的函數(shù),其中的不同處理功能僅僅是由于都訪問(wèn)某一個(gè)公用數(shù)據(jù)而發(fā)生關(guān)聯(lián),這稱為通信內(nèi)聚和信息內(nèi)聚,內(nèi)聚程度進(jìn)一步下降。內(nèi)聚程度再低的情況就不再一一列舉,最差的偶然內(nèi)聚中,一個(gè)函數(shù)內(nèi)的各處理元素之間沒(méi)有任何聯(lián)系,只是偶然地被湊到一起。5 J; o$ i8 X1 y' d8 c1 P3 p
可以想像這樣的模塊東一榔頭西一錘子,類似一個(gè)毫無(wú)凝聚力的團(tuán)伙,對(duì)應(yīng)的是低質(zhì)量?傊,在解決問(wèn)題劃分函數(shù)時(shí),要遵循“一個(gè)函數(shù),一個(gè)功能”的原則,盡可能使模塊達(dá)到功能內(nèi)聚。
0 O* ?1 F) C* ^& H, F9 a要做到高內(nèi)聚低耦合,重點(diǎn)是要在寫代碼之前花些時(shí)間做好設(shè)計(jì)。在下面的例子中,將討論結(jié)合具體的問(wèn)題,如何將以上的因素考慮進(jìn)去。5 ]7 o  Q- v2 g7 m
二、示例篇本例受裘宗燕老師《從問(wèn)題到程序——程序設(shè)計(jì)與C語(yǔ)言引論啟發(fā)》。! y% J$ a/ ]: m3 J/ |% r
任務(wù). r- B% a+ P7 U! A' S$ `
輸出200以內(nèi)的完全平方數(shù)(一個(gè)數(shù)如果是另一個(gè)整數(shù)的完全平方,那么我們就稱這個(gè)數(shù)為完全平方數(shù),也叫做平方數(shù)),要求每隔5個(gè)數(shù)據(jù)要輸出一個(gè)換行。+ _  H4 V4 _: ?$ A- E3 H
解決方案及點(diǎn)評(píng)
: B7 c2 c8 h3 {, p0 F8 F: }對(duì)于這個(gè)簡(jiǎn)單任務(wù),我們?cè)谝粋(gè)main函數(shù)中完成了任務(wù)。程序如方案1:
. @. i2 N' v3 Q9 A8 o//方案1:內(nèi)聚性較高的單模塊實(shí)現(xiàn)方案. _9 O" f2 W- }7 r( f
#include 4 R. M" k6 a! N( T$ I
int main()
/ o3 X2 _. v  y( S) w) \" ^{
. X# |! y; H% `0 v8 O8 j    int m, num=0;
  d1 ]. O% u) o, X    for (m = 1; m * m 200; m++)& a, r* K3 F! ], |  a0 b
    {
% W4 `# E0 v5 k        printf("%d ", m * m);9 ^1 a" O4 M4 S+ D. q3 K
        num++;6 c( Y5 R3 g0 F  k
        if (num%5==0)! n# d& g, y3 c  j( U5 @  r1 y
            printf("3 {4 T% I& T0 W2 \# s' {0 Q- D
");. q+ N) `/ u6 R4 U
    }1 |5 x6 B5 c% Z; ]8 w
    return 0;  `& U5 g2 f2 ~. y8 Y
}1 z+ F$ I6 V- k& f9 k
由于任務(wù)本身簡(jiǎn)單,將之在一個(gè)main函數(shù)中實(shí)現(xiàn)后,這個(gè)函數(shù)的內(nèi)聚程度接近功能內(nèi)聚,已經(jīng)相當(dāng)高了,就任務(wù)本身,不需再進(jìn)行分解。為使讀者能深入理解模塊質(zhì)量方面的技術(shù),我們將試圖將內(nèi)聚程序再提高一些,然后考察耦合程度不同的各種解決方案。
9 D: c+ m7 [* e7 K! }% ]要提高上面解決方案中函數(shù)(僅main一個(gè)函數(shù))的內(nèi)聚程度,我們考察程度的功能“找出完全平方數(shù)并輸出”——“找出完全平方數(shù)”和“輸出”這本身就是兩個(gè)功能,再細(xì)分輸出時(shí)還有“要求5個(gè)數(shù)據(jù)在一行”的要求,這些功能的實(shí)現(xiàn)細(xì)節(jié)都在一個(gè)函數(shù)當(dāng)中,可見(jiàn)是有余地再提高內(nèi)聚程度的。% F" {& G" ?. \
在實(shí)現(xiàn)的應(yīng)用中,幾乎所有的處理都可以分解為“輸入-計(jì)算-輸出”的模式,優(yōu)秀的解決方案往往至少要將這三個(gè)模塊都獨(dú)立出來(lái),對(duì)于“計(jì)算”模塊而言,其內(nèi)部不再包括輸入輸出,專門接受輸入的數(shù)據(jù),計(jì)算完成后返回結(jié)果即可。當(dāng)然,對(duì)于復(fù)雜的問(wèn)題,在各個(gè)環(huán)節(jié)上可能還需要再做分解。
+ b& R" U9 F. ~) x# W4 p$ ^下面,我們探討將“找出完全平方數(shù)輸出”和“每5個(gè)數(shù)據(jù)后換行”分開(kāi)實(shí)現(xiàn)的方案。這樣的分解有助于提高內(nèi)聚性,與此同時(shí),分解后的兩個(gè)模塊間的耦合程度,成為我們要關(guān)注的焦點(diǎn)。
+ p4 S. n1 @6 x; n: M現(xiàn)在將“找出完全平方數(shù)并輸出”的功能仍放在main函數(shù)中(獨(dú)立成為單獨(dú)的函數(shù)也可以,但不必要了),而“每5個(gè)數(shù)據(jù)后換行”的功能,設(shè)計(jì)一個(gè)名稱為format的函數(shù),它每調(diào)用一次就輸出一個(gè)空格作為兩個(gè)完全平方數(shù)間的分隔,而每調(diào)用到第5次時(shí),輸出的是一個(gè)換行。
5 d( q5 Y, b  ^1 X' w' [' ~這兩個(gè)模塊之間,需要有一個(gè)“現(xiàn)在是第幾次調(diào)用”的信息需要傳遞,不可能用耦合程度最松散的非直接耦合.我們考慮數(shù)據(jù)耦合,用簡(jiǎn)單形式參數(shù)傳值,得到方案2。# l+ p, q; V3 H9 y  p7 y& w
//方案2:一個(gè)耦合度低,但不能完成功能要求的解決方案
. T5 d- z: j* R#include 3 _/ a" _& ?. L" W- L
void format(int);  [8 O5 B" l5 D% v. l% v
int main()
+ }7 A" g: E4 [) ?{
) V- @8 k, }- M! x    int m, num=0;
2 b% {6 u- ?7 D; F8 a- k; O    for (m = 1; m * m 200; m++)
6 |5 v1 ]8 f$ m2 D    {
  t$ i- k! y% e7 B  n- T        printf("%d", m * m);% ^5 f1 h8 g9 a" W0 C/ N5 X
        format(num);
" i1 f  a* a' o; q1 l    }
$ {' v7 k" R$ V* }- g0 D% R    return 0;! ~1 N; s( w  Q( k6 \% K; B& _
}
8 J% B- ?; V0 ovoid format(int n)
- N# ~  \9 A. \; {% c& Y{+ C) M$ b6 ~) ?5 U/ _5 e* I1 N
    n++;! b2 v5 F3 a4 }0 \: ?; n% }5 p
    if (n%5==0)# J, a, A" l. _0 a5 \
        printf("
; M/ H9 G$ ~! m( D, l4 a");
: s- r1 ^5 K$ K: z6 F    else7 P" c; X& t& H' a& g
        printf(" ");* f, ^( J  q3 ?+ Z
    return;
7 m( `8 N2 T9 P; i}: C6 o+ i" C, s& p
在這個(gè)程序結(jié)構(gòu)中,format與main函數(shù)的耦合程度為數(shù)據(jù)耦合。在main中定義了局部變量num,在一次都未輸出時(shí),置初值為0是合理的。在調(diào)用format時(shí),將num傳遞來(lái)的表示第幾次輸出(第幾個(gè)完全平方數(shù))的形式參數(shù)n,n自增1,然后再控制輸出空格或換行。
: W  ]$ T; X% K0 ?% ?8 [然而分析和運(yùn)行程序發(fā)現(xiàn),“每隔5個(gè)數(shù)據(jù)輸出一個(gè)換行”的功能并未實(shí)現(xiàn)。因?yàn)樾问絽?shù)n在函數(shù)format內(nèi)的改變對(duì)應(yīng)的實(shí)在參數(shù)num占不同的內(nèi)存空間,n++修改的結(jié)果,對(duì)num無(wú)任何的影響,導(dǎo)致了在下一次調(diào)用時(shí),丟失了“輸出的是第幾個(gè)”的重要信息。一個(gè)補(bǔ)救的方法,是由format將變化后的n值作為返回值,再傳回給main函數(shù),得到如下方案3的程序:" {! u, ]( z/ Y
//方案3:利用了返回值使耦合度增大,但功能得以實(shí)現(xiàn)的方案- X: o3 O3 `) F; p( s5 \& G" |
#include
4 n. @8 Q$ l: o! k0 P: Tint format(int);4 a, `, U3 N8 ?% C9 S& P
int main()
6 G4 L" G! k, e{
) _/ {  P- C, T    int m, num=0;8 s) b  E, U3 @; }8 D
    for (m = 1; m * m 200; m++)& I* \6 V$ N5 h( O6 f- x
    {/ ^' E" H; J* B4 s8 H
        printf("%d", m * m);: b. G. j3 L0 X; z* f. m5 U
        num = format(num);# M8 r* F! v7 Q3 J, e: W, ?0 W
    }
! }3 Z" |- _2 O2 |) N) w9 ]    return 0;% t& Y3 ]2 j# X8 I: ~* o: r
}
" Y; {. M2 L9 N4 Y- Hint format(int n)" h. w! S' m* q; ]2 K, ^
{
7 [1 d, _( h1 `# |! P- L5 F    n++;
/ F+ _" E* N: g9 Y* x    if (n%5==0)
4 e9 Q( d# C: ~3 Q  L4 B        printf("
" z/ w2 u$ e/ c+ V5 j0 a( o");
( D! h# N) z5 F% {/ c) B( D' N3 u    else
) w' w$ [0 t% z1 L# a  x        printf(" ");
4 D$ _+ Z  n2 t3 J! n1 Z! y( w    return n;
' |8 U8 I8 \3 h}
8 E) G4 |" G  D) {7 X8 K5 r維持原函數(shù)返回值為void,而將參數(shù)改為傳地址,得到下面的方案4。這個(gè)方案的耦合度更高一些,但功能還是能夠?qū)崿F(xiàn)的。, V: a- o2 p4 c# D1 D
//方案4:傳地址實(shí)現(xiàn)功能的方案,耦合度更大
* j5 H4 @. X% q9 D9 s! K. [, f" Z$ N: W#include + K5 ^. i6 \. y* `& Z, Y
void format(int*);7 E7 Q* D1 e' J( L- D1 y* l* I
int main()+ Z, ~2 i  ], T4 R
{
7 \' c" N. \$ B! T/ v" ~  P    int m, num=0;
) D# z, {0 l! k3 m6 [  d: O    for (m = 1; m * m 200; m++)& |7 ?) N2 k" g4 V& `4 ~
    {$ B5 Z7 s0 Q8 O5 W$ I
        printf("%d", m * m);  `5 K% M% g" T. b" \2 C+ k7 s% \
        format(&num);0 G9 J+ z& ?4 O1 m1 P: J& q9 l1 ~
    }
) L, K: B+ [( ~. b5 c+ }$ L3 m    return 0;
) p4 `) B2 q* X, o! j  C6 T3 o}, L. |; c7 t" s
void format(int *p)
" |/ _4 s, Q3 P{0 w  m6 b8 C5 M6 W9 W$ L* r+ u
    (*p)++;
1 Q% _$ e6 X8 i    if ((*p)%5==0)
: w* _) z: T4 o# P) F4 U% _        printf("
% m# q& K  f! ^+ J- o");9 B' t3 G+ X; p, b4 m) r; i
    else1 ^6 N3 u6 J' _" ?7 G
        printf(" ");7 f0 L( w$ C0 C; B; H5 z" w
    return;
/ m) ~5 T; `! x, f) ~}& \' t0 s/ c3 j3 z$ h
一定有人想到了用全局變量的解決方案。這樣,可以將num定義為全局變量,num的生存周期不再依賴于函數(shù)調(diào)用,其值也能在函數(shù)的調(diào)用之間保持不變(只要其間沒(méi)有另外給它賦值),從而可以完成傳遞信息的任務(wù)。這時(shí),format因?yàn)闊o(wú)需參數(shù)傳遞,可以設(shè)計(jì)為無(wú)參函數(shù),得到如下方案5的程序:% }" j2 e1 h$ D6 p
//方案5:耦合度最高的全局變量方案; F0 b9 F% T* O. w; j; e* [% R0 H
#include " }! j% ^* J7 P$ t4 {5 ^8 S( u
void format();
% A2 k) e7 q5 S4 o8 Z/ z) }# Z3 l% h& pint num=0;" w! F( @" f3 j4 o
int main()
( M2 y& O5 Q# ~3 a  _! g6 o( ?{
0 Z, W5 P0 r  R    int m ;* E. A* b1 Y6 s: y
    for (m = 1; m * m 200; m++)
1 y) }' \5 w- M: l) ^) _    {9 i5 F# u( L7 D8 n1 z1 ~0 V
        printf("%d", m * m);" z3 {: Y0 F, Z6 i: B( g; t
        format();: p/ c- i6 H3 B
    }
: v) q7 ^( Y3 `    return 0;
& N" z' b4 o' \6 h}
+ o$ l+ F3 K9 P, ]: X- |void format()  C; e( r: C& U
{- [' g8 T" E4 L4 n1 H
    num++;
% J, ?) a' L' Z' d% e/ S    if (num%5==0)
$ B. Y1 e: u$ r1 V1 o. p& Z        printf("
) J* l4 d, ?' f) I/ }  T");
( a0 D; K3 `( y0 K    else
. o/ D6 V8 x* A3 D' [9 f        printf(" ");) Y2 m4 v0 W- H0 ?* H+ K! B
    return;! ^# F, \4 f3 L
}( q: h& F& b6 N/ |3 ?
這是解決這個(gè)問(wèn)題的耦合程度最高的一個(gè)方案。將num定義為外部變量,意味著如果還有其他函數(shù),num是可以被任何函數(shù)修改的,當(dāng)發(fā) format 計(jì)數(shù)錯(cuò)誤時(shí),尋找錯(cuò)誤困難,而修改后又可能會(huì)帶來(lái)其他地方的錯(cuò)誤。3 a3 a3 H. F6 s- D* B' w0 E
在這么一個(gè)短小的程序中,這種方案可能尚可接受,當(dāng)程度的規(guī)模稍變大,可能帶來(lái)的問(wèn)題必須高度重視。因此,在實(shí)際應(yīng)用中,強(qiáng)調(diào)全局變量要慎用(不是不用)。
' d, T( G! R9 ~. u7 p考慮到num是在format中應(yīng)用的私用數(shù)據(jù)——只有format才關(guān)心這到底是第幾個(gè)數(shù)據(jù),main本來(lái)都不用關(guān)心的。這樣,可以考慮將num定義為format中的局部靜態(tài)變量,得到方案6的程序:: s; B% o8 J" _: N1 r; b1 |  j; t& D# `
//方案6:用靜態(tài)局部變量,耦合度偏高但封裝性最好的方案2 r$ L/ `' @3 w+ X& W
#include
& b# m8 A# \4 w4 T5 ~" wvoid format();
# M5 ~( c! X5 E  Nint main()
' r, @, y3 x+ G+ V" B: \( E{
* V6 J# E% i2 J+ S& r    int m ;/ J. B  ^& Y) f+ h# w# e" A6 B3 x
    for (m = 1; m * m 200; m++)0 ~0 M4 H3 S+ Q; }, Z& M+ D
    {, q* L: @5 C% U0 S$ H% z/ }+ x9 c) K
        printf("%d", m * m);
: R6 n9 x6 y3 e! N        format();
. x0 a. _+ ?+ n( _, K6 q; C+ R    }- l" `2 i! K+ F% B7 l9 {8 }
    return 0;7 U0 y. F- m4 m: h2 ]  U; s
}9 T" n7 j9 d3 L
void format()- q" l+ C/ |) E# l: V. d. W
{
9 R: @7 z$ L6 J1 b0 M$ q    static int num=0;
) H' |' {4 S  B% @( W    num++;
: j  W5 x8 J5 ^( r    if (num%5==0)1 d- P% A! c$ z3 ^
        printf("
& {  g3 g$ Q/ M& j5 W");
0 C9 R% }2 [' P! k7 i1 b- N% k    else; s2 h8 Z: R% p5 ]
        printf(" ");0 R' ~! T8 o- ^( W: C; a8 T
    return;
, O' b1 n' V- J. Q. v& @}
9 h9 M" |& V% T; x6 _/ m在這里,靜態(tài)局部變量num的作用域是局部的,定義在函數(shù)體里,封裝性在所有方案里是最好的,從而能保證信息的隱蔽性,避免其他函數(shù)無(wú)意的越權(quán)訪問(wèn);
& ?4 E* P7 ^* |8 h+ |$ A1 d: s不過(guò),num的生存期是全局的,可以跨越函數(shù)的不同次調(diào)用,在兩次調(diào)用間傳遞信息,耦合程度(自己和自己的耦合)要高一些,但使main函數(shù)和format函數(shù)的耦合達(dá)到了最理想的程度,既保證了功能的正確,又保證了局部數(shù)據(jù)的安全性,表現(xiàn)出靜態(tài)局部變量的優(yōu)勢(shì)。綜上所述,在解決一個(gè)問(wèn)題時(shí),存在著諸多的方案。
* ~" F" e" U* M2 Y方案1可以接受,但希望提高內(nèi)聚性而做出改進(jìn);方案2用簡(jiǎn)單的參數(shù)傳值方式實(shí)現(xiàn)耦合程度低,但很可惜不能完成功能;在其他方案中,對(duì)于這個(gè)問(wèn)題,選擇的優(yōu)先順序是:
9 H, j: i6 c2 G6 {方案6、方案3 > 方案4 > 方案5; ^6 Q) u& J/ g- g
建議讀者回顧前面的內(nèi)容,想一想這樣排序的理由。在上述探討各個(gè)方案的過(guò)程中,我們應(yīng)該體會(huì)到在程序設(shè)計(jì)能力提高的過(guò)程中,不斷地學(xué)習(xí)新的技術(shù),懂得新的評(píng)判標(biāo)準(zhǔn),這也就是一個(gè)不斷拓寬眼蜀的過(guò)程。( \0 \: s) X5 O+ V, A
在稍后的練習(xí)中,不妨多想一些方案,也能夠從專業(yè)的角度評(píng)判方案的優(yōu)劣,最終做到的,就是出手就是最佳方案的專業(yè)水平。
1 a2 q# V, }# P  \4 Q9 ^3 }6 f% M$ P9 C! N) e
原文鏈接:https://blog.csdn.net/sxhelijian/article/details/79401703
) @' ?- B5 V2 c% O% P3 m( [
  s$ h/ w* {- Z2 |1 h9 s: l' Q-END-
7 c2 w4 M+ Y/ r6 o  T, K  V4 I! s+ s$ {往期推薦:點(diǎn)擊圖片即可跳轉(zhuǎn)閱讀3 X* K) }- f' N! |, m0 d5 P+ ]
                                                       
6 o% t, u0 K  l2 L; r0 {                                                                1 g" G) O/ q; x
                                                                       
) D7 v% U% B8 H' E. L                                                                                . Y4 r; f0 O# _: @3 a4 O
! g& i8 i2 x' h2 A! F4 D
                                                                               
/ {% N/ v& V: f                                                                                        今天不秀 C 語(yǔ)言代碼了,秀一下注釋!
# V0 c& w3 o$ Y  G5 a                                                                                6 E8 t% E4 Q. H% [! J
                                                                        3 M0 u! s) Y  |$ _7 E2 ^
                                                                0 E5 U/ F4 B2 x' s
                                                        ) ^( U" Q$ z' }, F; ]: `( N
                                               
+ v. r' ^4 @) a' W7 O7 X# L" _
: P" t, e- ]8 \9 ^1 Z                                                        / M1 }; y1 ?' x! ?) |
                                                               
! e3 t0 f8 Z& L) s/ Y" o* t0 M: k                                                                        ( m, G; v! z) ?& e% _
                                                                                3 U0 h1 L4 U6 r; i' ?
' f/ J7 y! |& P; u; q+ Y
                                                                               
5 z  k9 p6 q! m2 z! L. W                                                                                        真香!在嵌入式開(kāi)發(fā)板上面適配 OpenHarmony!
4 k8 K7 [# B* n6 }. c                                                                               
1 X+ H& |3 L+ l& p/ I                                                                       
# S' Z4 [/ s0 z9 e& \4 O! Q5 J3 w                                                               
& I( `' J2 r: t- S* {                                                       
; W1 R$ `; L) E7 T# N3 Q" A                                               
3 S' T7 l7 v, a3 G' r2 ]* y3 _9 r- T, h( f
                                                        ! g$ X8 }  O8 r" c' A& l2 s
                                                               
/ w5 ]: k6 T2 y; y' R4 w$ L% f                                                                        0 A9 i# o6 f5 w7 {+ C7 W1 C, x
                                                                               
- s. I( `6 |0 B, Y6 m- Q 5 t( e- N5 _2 H
                                                                               
/ P$ v3 D: m1 |                                                                                        用模塊化和面向?qū)ο蟮姆绞,編寫單片機(jī)LCD驅(qū)動(dòng)程序3 M0 _3 F, b% C+ G$ f
                                                                                . Z9 U5 p! `2 H7 v
                                                                        6 s) y' _' B! ^8 U9 ^( u+ Q
                                                               
7 a% x1 c( I, Q5 \+ P1 S, l                                                       
* o9 \/ z2 M$ {5 z0 G4 Q& I                                               
4 S- r6 [. r5 v" t: j( }我是老溫,一名熱愛(ài)學(xué)習(xí)的嵌入式工程師
# c. W; N0 V$ R7 R9 C0 }- a, {關(guān)注我,一起變得更加優(yōu)秀!

發(fā)表回復(fù)

本版積分規(guī)則

關(guān)閉

站長(zhǎng)推薦上一條 /1 下一條


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表