看板 C_and_CPP作者 calais007 (淺水中)標題 [分享] C/C++語言工作上的心得時間 Sat Apr 28 22:55:17 2012
各位板友大家好
小弟工作經驗約3年多
寫程式從高中到工作約有10幾年的經驗
工作上主要使用的語言是C或是C++
小弟待過系統廠和IC Design廠
今天來分享我在業界看到的一些現在和我個人的想法
也許不一定正確
但也許可以給學子門一些軟工上的啟發
先說我在系統廠上的經驗
我之前是在網通廠
使用的Broadcom的solution
Broadcom的程式碼主要是用C++為主
它的程式有幾個特色
1. 非常少使用指標, 除了DMA之外可以說沒有用到指標
2. 自己實作Buffer class來配置記憶體, 解構子處理的很好
只要使用Buffer class就可以輕鬆配置memory,不會memory leak
(前題是你不要傻傻的去new buffer class)
3. 大量使用singleten
4. 在C++裡面不會出現global variable, 所有的東西一律抽象化(class化)
5. 程式寫作一致,很容易閱讀
換了工作後到了台廠IC design
我看完了code我發現台灣的軟工跟Broadcom一比起來還有一段差距
我舉幾個我看到的現像
1. makefile格式不統一,到處都有放,要花很多時間來搞清楚先後順序
2. shared library沒有好好管理,我個人的看法是shared library要儘量做到local化
減少參考其他shared library的,但我居然發現有出現shared libray互相reference
對方的詭異現象,這很明顯是link library的時候沒有clean build,然後binary
release.
3. 亂用pointer,也許定API或interface的人很強,但實作的人卻普普或是根本不懂這個
指標要幹麻, 我舉個例子好了
//@param out_b : pass a pointer and return an allocate space to pointer
// out_b
void myFunc(void *in_b, uint32 in_len, void *out_b, uint32 *out_len)
我看了這段code之後我直覺就想到這個會動嗎?這只會memory leak吧
為什麼要pass一個pointer到function裡面malloc,還是pass一個void *
而不是pass void **? 為什麼要幫人製造大便?大便不是自己做自己清嗎?
4. void *很好很強大, 但不要走火入魔.
我舉個例子
void setDataStruct(void *struct)
{
XXX_type myType= (XXX_type*) struct;
}
看起來沒啥問題,問題是用setDataSturct的人居然可以不知道XXX_type的結構
設計者所說他不希望到處放.h檔,所以這樣用?我聽了內心只有一聲"X"
5. 非必要不要自己造輪子
一個最多只有32個element的struct為什麼要寫linkedlist
宣告MAX_LENGTH 64就很夠用了吧, 比較省記憶體?
stack都用不完了為什麼要用heap? 還有memory leak的風險咧
6. goto很好很強大, 拿來error handler非常好, 但每的function都這樣用
讓我感受到大量使用goto只顯示你寫code malloc了太多大便, 導致
一定要goto來清大便, 不懂為什麼要到處拉屎, 能用array就array為什麼
要用pointer來顯示自己的高級?
7. 給我為什麼一定要用C語言的理由, 除非是3rd的code是C++,不然很多人都排斥
C++, 這一點我不懂, C++有更好的container, STL, destructor, safe pointer,
oop, 更嚴格的type check, 不使用它的理由是?
8. 程式一堆warning, compiler都看不下去了還給人看....
其實還有一堆
但目前想不起來
希望大家寫的code不要變成這樣
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.37.135.55
※ 編輯: calais007 來自: 114.37.135.55 (04/28 22:56)
--