Re: [請益] 要如何說服同事停止命名類似iID的變數

看板Soft_Job作者 (Inkling)時間11年前 (2013/05/23 23:42), 編輯推噓3(300)
留言3則, 3人參與, 最新討論串8/19 (看更多)
※ 引述《FukadaKyoko (小毛哥)》之銘言: : 補充一些白天沒講清楚的細節: 部份恕刪。 前面有許多版友都提過了, "如果你沒有辦法說服大多數人,請從眾。" 這不是放大絕,Coding Style 本來就是見仁見智的事。 這基本上不需要誰說服誰,公司/主管/大多數同意的 style 就是好的 style。 下面是基於一個曾經是匈牙利命名法的擁護者,而已經變節很 多年的人的立場,利用你舉得的例子,解釋一些個人的觀點: : 再加上如果一個變數同時有兩種屬性那又會變成更長的prefix : (如int array) int[] 的 prefix 一般是 ai (array of integer),兩個字母 不會多長。 : 比如說我看到一個vector3叫做 vPos, 一個member叫做m_bFloating : 了解function內部後我可能會改成 : if (m_IsFloating) PlayerPosition.z += 100.0f; : 而原本的: if (m_bFloating) vPos.z =+ 100.0f; : 似乎沒有比較好維護啊? 這裡有個問題,在我個人的習慣, IsFloating 會是函數/方法名,不會是變數名。 三種情況: 1. 前面有個 m_,可以區分它是 member variables, 那,m_ 不也個 prefix ? (我沒寫過 m_ 這種 prefix) 2. 後面沒有 (),我看程式碼的第一直覺會是,誰打漏了 () 嗎? 3. 滑鼠移過去:ok, 了解了。可是我為何要移滑鼠來確認呢? 這樣你是否可以體會另一邊的人的想法? : 而且在這邊我在乎的只是: "若是漂浮狀態, 則玩家的Z軸+100" : 我完全不在乎型別是甚麼: 甚至 : void SetID(int iID) : { : m_iID = iID; : } : 我一定會改成 : void SetID(int ID) : { : m_ID = ID; : }  這裡啊,因為我從不加 m_,所以一直都很討厭。 我會寫成: void SetID(int iID) { this.iID = iID; // 如果有 this } 或,其實我更常作的是: void SetID(int newID) { iID = newID; } 重點在改 function/method 的參數,但 *不* 碰 member field。 原因等下說。 : 或者: ObjInfo* GetInfo(int iID) : { : InfoMap::iterator oIter = m_Data.find(iID); : if (oIter != m_Data.end()) : { : return oIter->second; : } : return NULL; : } : 改成: ObjInfo* GetInfo(int ID) : { : InfoMap::iterator It = m_Data.find(ID); : if (It != m_Data.end()) : { : return It->second; : } : return NULL; : } : 在這邊 o或者 i對我完全沒幫助 這裡沒意見。 : 再舉: 在接收端, 因為ObjInfo是一個struct : 那可能就有人會寫個 : ObjInfo* sInfo = GetInfo(iID); : 那改成: ObjInfo* Info = ... : ObjInfo* ObjInfo = ... 或者任何更符合該變數角色的名字 : 不是比較清楚嗎? 不,對我而言一點也不清楚。 匈牙利命名在這裡應該寫: ObjInfo* psInfo = ... p 代表 pointer。 因為如果 Info 是指標,後續會變成: Info-> 參考, Info. 對,IDE 會告訴我,但如果我只是快速瀏覽呢? 更具體的說,看到 sInfo,我知道它是一個 struct, 等等預期會看到 . 或 -> 去存取它的 field;只看到 Info,我會把它當成 primitive type,看到接著 . 或 -> 會愣一下。 : UserProfile好還是user_profile好我覺得確實見仁見智 這個我才覺得討厭。 之前很喜歡 Java 的這種 CamelCase,昨兒翻 Python 的 PEP8 ,建議不要用 CamelCase,要寫 camel_case, 才很怒的將正在寫的 python 碼翻修了一遍... : 但szUserProfile或是szuser_profile我就會覺得為甚麼要加? sz -> char * -> string end with \0 str -> String 當你會混用 C 的 char * 和 C++ 的 String 時,你就知道為 什麼要加了。 : 且如我所說我們專案沒有規範, 我是很希望可以建立專案的coding style : nobody1大大 : andymai大大 : 我說服不了別人 : 也無法被說服 : 因為我同事只有兩個理由"習慣了", "有差嗎?" : 主管的理由是"我們不限制做法" : 我想這種理由應該很難說服人吧 很難,可是這就是現實。 不能說服大多數人,就從眾;或者,努力拼上主管位。 : TonyQ板大所提 : "大多數情況下需要知道型態,特別是大型系統架構" : 確實我是沒接觸過: 也無法想像為何需要知道 : 如果板大可以話不知是否能夠舉幾個實例供觀摩 : 感激不盡! 我不知道 TonyQ 的具體意見。不過,前面留下一點沒說的, 你舉了不少例子你看懂 xxx ,你就會改成 yyy。 這個很危險。 函數的參數,你改沒問題。member fields/variables 你改了名字, 如果不幸它是 public/protected 的怎辦? 我知道 IDE 很強大可以幫你全替換掉;但如果你的另一個夥伴正寫 一個新的 class;進一步假設他對這個案子很熟,不用翻程式碼就可 以直接引用既存的 class。好死不死,他引用到了你改了名的  member fields,怎辦?最好的情況是編譯錯誤,其它... 要推 coding style ,可以: 1. 說服大多數人,或當主管。 2. 更重要的,由新專案開始推。舊專案, if it's not broken, don't fix it. 別沒事找事,搬石頭砸腳。 -- 我不知道你同事年紀多大,不過匈牙利命名法是微軟推廣開的。 去翻早期的 Win32 API,那個 prefix 才叫噁心。沒事來個 lpszXXX 啥的。 我同意在現在 C++/C#/Java 當道的年代,匈牙利命名法已經可 以功成身退 (我個人也不用了)。但是,歷史的包袱沒有辦法一 刀切。Coding Style 這種沒有絕對對錯的東西,就放寬心胸看 待它吧。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.145.208.242

05/24 00:01, , 1F
同意這篇.
05/24 00:01, 1F

05/24 01:31, , 2F
Win32的prefix真的很噁心......
05/24 01:31, 2F

05/24 15:18, , 3F
謝謝 我會再多參考
05/24 15:18, 3F
文章代碼(AID): #1HdZZNWZ (Soft_Job)
討論串 (同標題文章)
完整討論串 (本文為第 8 之 19 篇):
文章代碼(AID): #1HdZZNWZ (Soft_Job)