看板 C_Sharp 關於我們 聯絡資訊
是這樣的 最近小弟改code改到累了, 改到非常想翻桌 想跟各位大神討論該怎麼做 Obsolete 程式碼的編程 我的實際應用狀況是這樣的:(我舉兩個例子都是相同問題) =================================== 情境1. WriteTraceLog 在原本一開始的時候我根本不會去寫所謂的Log File 只要編譯可以過就行了 直到某一天我的程式出問題 我問使用者出了什麼問題? 他說:"就是點點點後就當機了" 能敘述詳細一點嗎? 他說:"就是如下操作..." 然後實際操作正常... 我:...... 從此我學會了WriteLog的重要性 在這個時候的我 撰寫程式碼如下 WriteLog("進入OO方法"); WriteLog("做某事已成功"); WriteLog("退出某方法"); 隨著事情的發展 我明白到Polling Event Callback方法根本不能這樣寫 因為會多一堆垃圾訊息 因此改寫成 WriteLog("EventCallback已呼叫", isDebugMode); 寫到這裡 我覺得自己很厲害 以後就可以不用靠使用者口耳相傳的方式除錯了 只要給我Log檔,剩下我自己想辦法重現 做到這邊 我就在想,如果我能適時的 "順便" 紀錄一些使用者覺得需要的訊息好像也不錯? (以前他們是自己做完自己用紙筆紀錄的) 就在這個時候 我的解決方法是 一般的 WriteLog 是用 Static, static string logPath; static string logFile; 當要特別處理時我另開變數處理 string dynamicLogPath; string dynamicLogFile; 這樣就可以各自處理需要的文件 (讚!) 相安無事一些時間後 我學到了multiThread 因為C#很注重委派方法 我開始在意writeLog是哪個執行序 因此我開始加入thread.CurrentThread, 並開始排版 writeLog("LogStr","NowClassName","NowMethodName"); 然後到了最近 我又學到了 stackTrace(true).GetFrame(1).GetMethod().Name; stackTrace(true).GetFrame(1).GetMethod().DeclareType.Name; 我就想把整個過去的方法整個改掉 不然一路走來的方法實在是太多種了,多到我我覺得我之後一定會忘記哪種是最新的版本 而且印出來的log排版格式完全不一樣,看了格外的痛苦. 因此想問寫程式有什麼好辦法? ================================= 情境2:ConnectMethod 我時常用程式去操控一硬體, 我要給予該硬體一個指定電壓電流的命令 (如LED燈泡,可以吃7V~12V的電壓) 在一開始的版本中 是採用 類比控制 (不連線) 我就只要直接輸出類比電壓就結案了 之後我操控的軟體升級了 改採用 RS232 去操控 (serialPort連線) 然後我就再寫了一個新的版本 又過了幾天 我開始擔心會不會又改了一個新版本 採用網路去控制 (Ethernet連線) 當我開始意識到這個問題時 我開始找解決方法 在 深入淺出 - 設計模式 中 他們的建議是盡量採用 Interface 做變數型別 盡量不要用 class 當變數型別 class SerialPortConnect{} interface ConnectMethod{} SerialPortConnect myRS232; (X) ConnectMethod myConnectMethod; (O) 但問題是我已經很懶得再動以前的程式碼了 因為真的花很多時間處理通訊的問題 好不容易有個 "稍微" 穩定的版本 我想詢問版上的大大 會怎麼去處理這樣的問題呢? 我目前的想法是添加警告訊息 [Obsolete("請不要使用",false)] public class MyClass{} 但我想知道大家會怎麼去設計 因為我真的改到不想改以前的程式碼了... 但我又覺得專案中有一堆過時的東西、各種風格令人煩躁... -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 60.250.235.221 ※ 文章網址: https://www.ptt.cc/bbs/C_Sharp/M.1558321945.A.03D.html
totte: 建議找一下董大偉 AOP 05/20 12:33
ssccg: log通常都用現成的library 05/20 12:36
因為小弟寫任何程式之前,都是先想該有什麼功能 然後就直接實作了,反而幾乎沒有搜尋現成功能的習慣 另外問一下下列兩種情境: 1. 主管不喜歡用外部元件,因為靠別人打造,他總是說要是臨時出問題, 根本就無從修改,感覺不靠譜 (但維修力求盡快好) 2. 編譯環境不能使用 外網 和 USB,所有CODE查詢必須用手機網路, 然後自己手打一遍做撰寫 以上兩種是我覺得是使我有不習慣搜尋現成元件的主因
Litfal: log去參考別人的lib和用法,雖然自己做輪子也蠻有趣的 05/20 16:12
Litfal: 往壞處看,你經驗不足,設計離到位差太遠。往好處看得話, 05/20 16:16
Litfal: 就是你一直在進步啊。 05/20 16:16
s4300026: 現在做輪子做到想摔工具了 05/20 16:27
YahooTaiwan: 怎麼不用 NLog? 05/20 19:30
同2樓.
neo5277: AOP做法+1累一次就好 05/20 19:38
看起來有至少兩個人推AOP,我會朝那個方向去學習的。
Litfal: 問題2: 有Visual Studio這個地表最強IDE,重構超簡單 05/21 01:27
Litfal: 你只要擷取介面+rename methods,最後再把介面改成同一個 05/21 01:29
這個甜頭有嚐過,撰寫的時候就能看到那些位置有使用到參考該方法 改編時能用rename一次改全部,簡單錯字還會有change供你參考 自動加入interface的方法,然後補上 NotImplementException 整個就很讚!!!! ※ 編輯: s4300026 (60.250.235.221), 05/21/2019 08:51:23
ssccg: 如3樓說的,即使自己做也可以參考一下別人的設計 05/21 09:16
s4300026: 好的,說也是,不應該什麼都自己想 05/21 10:02
jass970991: Log4net 05/21 19:01
M9665566: 套用現成工具很重要,不能一直閉門造車 : ) 06/09 13:36
Tony427: NLog...另外一堆code都開源了...缺功能自己寫送PR,外部 08/09 02:26
Tony427: 元件不是全用全不用,而是要有能力判斷哪個適合解決問題 08/09 02:26
Tony427: ,另外有沒有人持續維護 08/09 02:26