跳到主要內容

Re: 配合修改介面的心得

單元測試終於結束了,雖然之前就預期介面修改會很麻煩,在寫測試計畫與測試時,才真正的體會真的是suffer。僅僅改小小的一段,得了解這段程式碼到底在幹什麼,才知道改了這段對程式有什麼影響,程式碼嘛大家也知道,有時候看半天也不知道到底他為什麼這樣寫,或者他這樣寫會有什麼影響,甚至是自己以前寫的也要花點時間回想為什麼要這樣寫。在寫測試計畫時,在找這段改完會有什麼特徵可以觀察的到。有時候寫在特殊的檢查機制,正常來說不會發生,要測通常得bk配合給錯誤資料或自己在程式碼中作手腳。總之寫測試計畫跟花在改的時間可不遑多讓,有時還覺得毛毛的,有種「這段真的這樣測就好嗎?」的想法。
我一直在想,如果下次要作類似改介面的事,要怎樣作,才能減少測試的成本與錯誤發生的情況。我又重看「重構」這本書有關介面修改和測試的部份。配合「重構」所介紹的方法與我們開發現況,我有幾點建議。
1.舊有的介面暫時不要移除,等整體連結測試完成,再看是否需要移除。
不移除的原因主要有幾點。
a.可階段性修改,測試。
在大幅度翻修介面時,像這次多對多的介面修改,改的初期希望可以先對同樣介面修改
處先作測試,在一步一步修改不同的介面,如果拿掉舊介面,我們必須一次就把他改完才能測試。
b.比對測試。
當舊介面與新介面產生的結果不同時,可以馬上就知道哪裡不一樣,也可利額外的測試函式來進行比對。
c.配合舊有程式邏輯
有時候舊程式邏輯是配合舊介面所得出的資料,而且大部來說更改舊有程式邏輯並不是好的修改方法(太複雜了),通常我們會把新介面的資料改成跟舊介面所得資料一樣,當有舊介面時,我們就可以較容易比對、產生相同邏輯的資料。
當然把舊介面移除有時是控制舊介面的遺毒不要殘留,在「重構」這本書建議說有時介面替換太複雜或牽扯太多,無法一次移除介面,可以利用thorw
error的方式並標注不建議使用,來強迫使用介面者必須使用新介面或catch error。不過書中改介面的流程也是在測試完才把舊介面移除。

2.利用中介(轉藉)函式作二段式修改,像GetTWSECategoryIndex(TWSE_SERVID, CBK_CAT_ALL,
vcsCat)這這舊函式,vector同時回傳包含長名和短名的資料,遺憾的新介面並沒有提供這樣的功能,因此在改的時候我們通常要將他轉為我們需要的格式,而有時不是傳回的vector資料格式不符,有時是回傳的bool直改變,舊介面再沒抓到資料會回傳false,而新介面則是傳回一個空vector。這種情形我想到利用中介函式來修改,共同創一個中介函式或類別來轉藉新函式至舊函式的邏輯,例如寫一個類別叫newBkTalk裡面包含GetTWSECategoryIndex這函式,但是他實際的工作是將新介面轉換成舊介面的處理邏輯,而在修改時也很好修改只要把需要換介面處將bktalk的指標轉成newbkTalk即可。
這有兩個好處,1.集中管理,當我們修改時不用再一個個對照,想要換成什麼,並作測試,而當一個錯誤發生,又得重新測試相同的舊介面轉換之處,對每個地方修改只要作一次即可。2.可寫測試函式來測試轉換邏輯是否正確。通常會遇到某些參數帶入時,才發現竟然會與原來預想不同。利用中介函式,可以列舉所有可能進行比對測試,避免轉換出我們未預期的結果,這筆我們在測試還要找各種資料來測所有的結果好很多吧!但是這是在寫測試計畫時才想到的,都已經改完了所以就沒有用了。

暫時寫到這,腦袋裡好像還有一些東西沒表達出來,有點亂,等釐清在繼續寫下去。

對了告訴大家一個方法可以不用登入論壇就能回覆相同主題的方法,只要回覆同一主題至F61RShare@googlegroups.com這裡就可以了。而大家也不需要登入論壇就可以看到論壇討論的文章,只要登入後選擇訂閱論壇文章即可。只有有新主題或文章就會寄信至大家的信箱了。而要發表新主題也只要寄信至F61RShare@googlegroups.com即可。希望論壇能多些水,都乾掉了。

在 2007/3/8,河馬 <hippo_su@yahoo.com.tw> 撰寫:
> 呵呵...原本就有排時間呀.....
> 之前是漏排了吧.....所以我才提醒要特別注意呀....
>
> On 3月6日, 下午11時26分, cccm...@gmail.com wrote:
> > 今天配合bk修改介面,將sysset裡面有用到的函式都改完了,具統計sysset也才僅僅"65"個要改介面的地方,但就搞了我一個下午,才剛剛進
> > 入測試而已。原本看起來只是要換一下函式而已,就像更名一樣,嘿嘿!改第一個,就明顯的體會出沒那麼簡單,除了要找到對應的函式,裡面所該帶的函式也要
> > 稍稍想一下,有時不是一眼就看得出來到底該帶那一個參數,上下程式碼要稍微看一下,就算sysset我幾乎改過一半以上,在改的時候也會稍微猶豫一下。
> > 果不其然,全部修改完成後,編譯後,開始測試時,果然輕易發現一個bug,天知道還有多少bug藏在裡面。有時候某些函式只是特殊的檢查機制,只在特定
> > 時候才可能發生,有可能出了一兩個版本才會發現吧。嘿嘿!最近又找到一個至少是180版本之前就存在的bug,這種bug可是四處存在的。我可以想
> > 像,IMMain此版bug爆增的慘狀了。
> > 這是我改完的建議,是類似這種重構,應該正式的排入時程,而且時程還短不得,正常來講應該是改一個測試一個,而且像這次是多介面轉成同一介面的,要帶入
> > 適當的參數,程式碼有時要還要稍微理解一下,可不是簡單的替換,如果以改一個測試一個來說,一個大概平均也要十分鐘吧,那麼sysset要650分鐘,
> > 也就是大約11個小時,1個半天,當然這是最佳狀況,如果從與熊共舞所提出奈米完成度來看,大概乘以2是合理認為70%有可能達成的機會。所以
> > sysset光改介面應該可以排三天吧。不知道IMMain要排多久?
> > 其實我有另一個想法,應該先開新介面,將舊介面先轉藉到新介面上,等於是說舊介面底子是用新介面的函式,先看看運行是否有問題,沒問題的話,就可以利用
> > 舊介面轉藉新介面的原理一對一對轉,也就不用一個一個測試了。這是重構那本書提供的作法。
> > 不過如果依重構的正常作法來說的話,得先預想所有測試案例,對每次重構都得保證和原來程式運算出來的結果需一致,當然我們是沒有作這種事。重構的兩難是
> > 沒有新增新功能,看不出實際的效果,但他的確會把系統架構改的更好,但所花的時間並沒有想像中的少,尤其花在測試的時間。
>
> --~--~---------~--~----~------------~-------~--~----~
> 您收到此郵件,是因為您訂閱了 Google 網上論壇的「個金產品研發處分享論壇」
> 群組。
> 如要在此群組張貼留言,請寄電子郵件至 F61RShare@googlegroups.com
> 如要取消訂閱此群組,請寄電子郵件至 F61RShare-unsubscribe@googlegroups.com
> 如需更多選項,請造訪此群組:http://groups.google.com/group/F61RShare?hl=zh-TW
> -~----------~----~----~----~------~----~------~--~---
>
>

留言

這個網誌中的熱門文章

勝券在握

其實這本書,感覺上寫的有點雜,比上一本講巴非特的書更難懂,兩個講的東西其實是一致的。投資原則便是先選產業,再選公司,慎選時機進場。只買了解的企業是價值投資一貫的原則。價值投資的書大概就先看到這裡了,彼得林區不知道是屬於那一類的,接下來大概會看這部份的書。暫時的目標是把杜金龍介紹的書單看完,真的還不少。接下來的投資會以巴菲特的方法來做,感覺上這比較適合我,練習把漲跌不當一回事,對我而言真的很重要。期權大概不會再玩了,買了以後一直在看漲跌,令人受不了。工作時都不能專心。 就價值投資人而言,真的不需要我們的產品,因為第一點就把我們程式特性打死,不理會股票市場的漲跌,這樣報價功能就沒什麼意義了,價值投資根本不需要技術分析,除非我們能提供相關價值投資的資訊,但我們基本分析真的很爛,看不到什麼資料。有機會我來思考一下價值投資到底要什麼資料,能不能把他寫成一個可運用的程式。 以下是我認為重要的書摘,其實這也只包含最後一章,我認為也只有這章值得做書摘。 巴非特相信使用短期價格來判斷一家公司的成功與否是愚蠢的。取而代之的是,他要公司向他報告因經濟實力成長所獲得的價值,一年一次,他固定檢查幾個變數: 初始的股東權益報酬率。 營運毛利、負債水準與資本支出需求的變化。 該公司的現金產生能力。 如果這些經濟指標正在進展,他知道長期下來,結果會反應在股價上。短期之內,股價所發生的是是不合常理的。 投資策略 不理會股票市場每日的漲跌 不擔心經濟情勢。 買下一家公司,而不是股票 管理企業的投資組合 巴非特原則 企業原則 這家企業是簡單且可以了解的 了解一家企業如何產生利潤的相關經濟活動。 這家企業的營運歷史是否穩定 他必須經得起時間的考驗。 這家企業的長期發展前景是否看好 市場特許權,五力分析 經營原則 經營者是否理性 理性的經營者將只會把多餘的現金,投資在那些產生較資本成本報酬率為高的計畫裡。 經營者對他的股東是誠實坦白的 報告時能知道營業部門如何營業,坦承失敗,了解公司的目的是使股東權益報酬率達到最大。 經營者是會盲從其他法人機構的行為 當心『其他公司也這麼做,一定沒問題』為自己行為辯護的經營者。衡量經營者競爭力的一個方法是,看他們如何運用自己的思考能力以避免依附群眾心理。 財務原則 把重點集中...

用 AI Debug 的迷思:當建議越改越糟時

現在許多開發者習慣用 AI 來協助 debug,但在實務上常遇到一種情況: 依照 AI 建議改了兩三輪後,錯誤仍然存在,甚至越改越複雜。 這種狀況其實有幾個常見的盲點,值得特別注意。 1. 先回到「上一個正常版本」 當你已經按照 AI 的方向修了好幾次但問題仍未解決時,最有效的第一步是: 回到上一個正常工作的版本,縮小問題來源。 許多 bug 並不是你正在看的那段程式碼造成的,而可能是: 同事剛好修改了某個底層模組 某個 shared component 產生 side effect Auto Layout 層級重新 layout 時觸發 crash 如果只是盯著眼前的 function 修,反而容易被誤導。 2. AI 沒有看到你的整個專案 AI 通常只能根據你貼出的片段判斷問題,這代表它不知道: 你的 view hierarchy 裡是否有其他 constraint 影響 layout 某些 model 是否被 extension 修改過 父層或子層邏輯是否干擾目前的行為 整個專案採用的 concurrency 模型是什麼 因此,AI 可能會朝著完全錯誤的方向修,導致反覆修改卻無法解決。 3. Swift 6 例子:錯誤真正原因常不在你修改的那一行 例如開發者常遇到的錯誤: passing closure as a 'sending' parameter risks causing data races 許多人(包含 AI)會開始從 function 內部調整,但這類錯誤真正的關鍵通常是: 傳進去的物件沒有實作 Sendable。 也就是說,你不是要改 function,而是要回頭檢查: 傳入的 model / struct / class 裡面是否有 non-Sendable 成員 是否需要標註 @unchecked Sendable 如果 AI 沒看到相關檔案,自然很難找到正確方向。 結語:AI 是工具,不是預言機 AI 很適合用來: 解釋概念 協助產生測試程式 提供重構建議 釐清你已懷疑的方向 但在 debug 狀況下,以下三件事更重要: 回到上一版,縮小差異範圍。 釐清真正問題來...

解決 CI Trust Issue:Target Must Be Enabled Before It Can Be Used

📱 iOS開發 | 🔧 CI/CD | 💻 Xcode | 🐛 除錯筆記 🔴 問題描述 這兩天在跑 CI 時突然出現錯誤訊息: Package@swift-6.0.swift:PACKAGE-TARGET:CasePathsMacros: error: Target 'CasePathsMacros' must be enabled before it can be used 🤔 嘗試過的解法 💬 Claude 的建議 首先詢問了 Claude,得到以下步驟: 先更新 swift-case-paths 到最新版本 確保使用 "Up to Next Major Version" 執行 File → Packages → Reset Package Caches Clean Build Folder (Cmd + Shift + K) 重新 Build 結果: 一看就知道沒用 😅 🤖 ChatGPT 的建議 接著試了 ChatGPT 的解法,主要是降低引用到的 package 版本。繞了一圈,還是沒用。 ✅ 最終解決方案 最後還是回到 Google,找到了真正有效的解法。針對這個 macro fingerprint validation 問題,有三種解決方式: 📌 方法一:本機開發用(Terminal 指令) defaults write com.apple.dt.Xcode IDESkipMacroFingerprintValidation -bool YES 📌 方法二:xcodebuild 參數 在執行 xcodebuild 指令時,加上 -skipMacroValidation 參數 📚 參考連結: https://vocus.cc/article/690779ebfd89780001859b14 📌 方法三:CI 正統做法 ⭐️(推薦) 步驟 1: 在專案根目錄建立資料夾 ci_scripts 步驟 2: 在此資料夾中建立腳本 ci_post_clone.sh ,內容如下: #!/bin/zsh mkdir -p ~/Library/org.swift.swiftpm/security/ cp macros.js...