Re: [問題] 請教有無方法簡化我的code

看板C_and_CPP作者 (小水)時間15年前 (2010/10/12 14:52), 編輯推噓9(9025)
留言34則, 6人參與, 最新討論串5/5 (看更多)
如果不在意執行速度的話 我會寫成這樣 不知道前面有沒有人提出相同的方法 我是沒有看到 不知道有沒有眼殘 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

10/12 23:08, , 1F
複雜化嗎?
10/12 23:08, 1F

10/13 00:25, , 2F
跟大大的大作相比,確實是複雜了一點,不過我拿掉switch
10/13 00:25, 2F

10/13 00:27, , 3F
也讓迴圈變成一份,並保留了擴充性與可讀性,另外
10/13 00:27, 3F

10/13 00:29, , 4F
如果考慮這個極端的例子http://codepad.org/ptWue1zW
10/13 00:29, 4F

10/13 00:29, , 5F
這個不錯 不過再改一下 就變成JNI了 XXD
10/13 00:29, 5F

10/13 00:31, , 6F
或者畫法有幾十種,我的寫法應該比較容易讀
10/13 00:31, 6F

10/13 01:03, , 7F
這樣寫法是不錯啦,只是如果沒封裝好,到處都是含數
10/13 01:03, 7F

10/13 01:05, , 8F
維護也會被含數迷惑
10/13 01:05, 8F

10/13 01:10, , 9F
請問有什麼比較好的具體改法嗎?
10/13 01:10, 9F

10/13 01:12, , 10F
一個含數內只有幾行程式碼其實沒必要吧
10/13 01:12, 10F

10/13 01:13, , 11F
到不如用switch case,執行速度也比含數呼叫還快
10/13 01:13, 11F

10/13 01:15, , 12F
不, 其實有時候正是需要抽象化和可讀性, 才會有許多小
10/13 01:15, 12F

10/13 01:15, , 13F
維護起來也只要修改case內容
10/13 01:15, 13F

10/13 01:16, , 14F
函式, 維護需要改case是很糟的事情, 因為變成不是你要
10/13 01:16, 14F

10/13 01:16, , 15F
公開原始碼, 就是你要為了別人提出的擴充需求去改你
10/13 01:16, 15F

10/13 01:16, , 16F
的程式
10/13 01:16, 16F

10/13 01:19, , 17F
有時候為了維護, 你必須用執行速度來換, 被函式迷惑通
10/13 01:19, 17F

10/13 01:20, , 18F
常是沒有適當的命名, 或是維護的人不會善用工具, 但也
10/13 01:20, 18F

10/13 01:20, , 19F
有可能是設計欠佳的關係
10/13 01:20, 19F

10/13 01:38, , 20F
不是歐 switch的jmp是線性的 case多一點 call func不一定
10/13 01:38, 20F

10/13 01:39, , 21F
都會輸 switch就我經驗 實在是養那些老人的code...
10/13 01:39, 21F

10/13 01:40, , 22F
通常switch放enum, 後續switch case一定要改一大堆...
10/13 01:40, 22F

10/13 01:41, , 23F
但是 如果你剛接案子就好笑了 被老人電假的 "你就這邊加
10/13 01:41, 23F

10/13 01:41, , 24F
聽說switch可以用查表法,使得速度是常數?
10/13 01:41, 24F

10/13 01:42, , 25F
code那邊加code 路就通了" 真是唬瀾...
10/13 01:42, 25F

10/13 01:45, , 26F
不過switch的case太多 就算不影響速度 實在也超醜的...
10/13 01:45, 26F

10/13 01:49, , 27F
錯誤最大宗來源 漏掉的else 和 switch的default
10/13 01:49, 27F

10/13 01:51, , 28F
程式碼漂亮為優先吧 XD
10/13 01:51, 28F

10/13 02:07, , 29F
現在大家都講求要 refacor 了
10/13 02:07, 29F

10/13 09:48, , 30F
如果可以改掉printTriangle的介面,我認為有更好的寫法
10/13 09:48, 30F

10/13 09:49, , 31F
可以改寫成printTriangle(int level, DRAW draw)
10/13 09:49, 31F

10/13 09:49, , 32F
之後要傳入的draw function是客戶自己實作,一勞永逸
10/13 09:49, 32F

10/13 09:49, , 33F
DRAW為interface,每個實作draw為object,除非interface
10/13 09:49, 33F

10/13 09:50, , 34F
定義得不夠好,不然幾乎不用改code
10/13 09:50, 34F
文章代碼(AID): #1Cj7P9K4 (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1Cj7P9K4 (C_and_CPP)