看板 C_and_CPP 關於我們 聯絡資訊
如果不在意執行速度的話 我會寫成這樣 不知道前面有沒有人提出相同的方法 我是沒有看到 不知道有沒有眼殘 typedef void (*DRAW)(int cnt, int line); void draw1(int cnt, int line); void draw2(int cnt, int line); void draw3(int cnt, int line); const DRAW drawList[] = {draw1, draw2, draw3}; enum DRAW_TYPE { DRAW_TYPE_ONE, DRAW_TYPE_TWO, DRAW_TYPE_THREE }; void draw1(int cnt, int line) { printf("1"); } void draw2(int cnt, int line) { printf("%d",cnt); } void draw3(int cnt, int line) { printf("%d",line); } void printTriangle(int level,int type) { int line, cnt; DRAW draw = drawList[type]; for(line=1; line<=level; line++) { for(cnt=1; cnt<=line; cnt++) { draw(cnt, line); } printf("\n"); } } int _tmain(int argc, _TCHAR* argv[]) { printTriangle(5, DRAW_TYPE_THREE); system("pause\r\n"); return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.32.127.112
stupid0319:複雜化嗎? 10/12 23:08
wendly777:跟大大的大作相比,確實是複雜了一點,不過我拿掉switch 10/13 00:25
wendly777:也讓迴圈變成一份,並保留了擴充性與可讀性,另外 10/13 00:27
wendly777:如果考慮這個極端的例子http://codepad.org/ptWue1zW 10/13 00:29
softwind:這個不錯 不過再改一下 就變成JNI了 XXD 10/13 00:29
wendly777:或者畫法有幾十種,我的寫法應該比較容易讀 10/13 00:31
stupid0319:這樣寫法是不錯啦,只是如果沒封裝好,到處都是含數 10/13 01:03
stupid0319:維護也會被含數迷惑 10/13 01:05
wendly777:請問有什麼比較好的具體改法嗎? 10/13 01:10
stupid0319:一個含數內只有幾行程式碼其實沒必要吧 10/13 01:12
stupid0319:到不如用switch case,執行速度也比含數呼叫還快 10/13 01:13
loveme00835:不, 其實有時候正是需要抽象化和可讀性, 才會有許多小 10/13 01:15
stupid0319:維護起來也只要修改case內容 10/13 01:15
loveme00835:函式, 維護需要改case是很糟的事情, 因為變成不是你要 10/13 01:16
loveme00835:公開原始碼, 就是你要為了別人提出的擴充需求去改你 10/13 01:16
loveme00835:的程式 10/13 01:16
loveme00835:有時候為了維護, 你必須用執行速度來換, 被函式迷惑通 10/13 01:19
loveme00835:常是沒有適當的命名, 或是維護的人不會善用工具, 但也 10/13 01:20
loveme00835:有可能是設計欠佳的關係 10/13 01:20
softwind:不是歐 switch的jmp是線性的 case多一點 call func不一定 10/13 01:38
softwind:都會輸 switch就我經驗 實在是養那些老人的code... 10/13 01:39
softwind:通常switch放enum, 後續switch case一定要改一大堆... 10/13 01:40
softwind:但是 如果你剛接案子就好笑了 被老人電假的 "你就這邊加 10/13 01:41
james732:聽說switch可以用查表法,使得速度是常數? 10/13 01:41
softwind:code那邊加code 路就通了" 真是唬瀾... 10/13 01:42
james732:不過switch的case太多 就算不影響速度 實在也超醜的... 10/13 01:45
softwind:錯誤最大宗來源 漏掉的else 和 switch的default 10/13 01:49
loveme00835:程式碼漂亮為優先吧 XD 10/13 01:51
purpose:現在大家都講求要 refacor 了 10/13 02:07
wendly777:如果可以改掉printTriangle的介面,我認為有更好的寫法 10/13 09:48
wendly777:可以改寫成printTriangle(int level, DRAW draw) 10/13 09:49
wendly777:之後要傳入的draw function是客戶自己實作,一勞永逸 10/13 09:49
wendly777:DRAW為interface,每個實作draw為object,除非interface 10/13 09:49
wendly777:定義得不夠好,不然幾乎不用改code 10/13 09:50