[leetcode]程式記錄、測試方式大改版
睽違一年又兩個月的leetcode主題(回頭一看才發現居然隔這麼久0.O),今天不是發布新的解題紀錄,而是把過去一年多工作上精進的技能拿來把專案做個大改版。
關鍵字:spring boot,junit,單元測試
從去年七月到職以來,先是邊摸索邊投入產品的開發,到後來從頭開始開發對不同客戶的客製化專案,經手五六個專案各個不相同,文件、溝通、測試發生的問題也是千奇百怪,被公司要求著在上班時間參加了沒有用處的榮譽典章毒雞湯課程,最近要負責關注的新人逐漸變多,除了自己開發的專案之外也稍微晉升成半個管理職,收拾他人爛攤子的情況也變多了,但是薪水完全沒漲。
今年七到九月經歷了平日假日無薪加班努力完成更多開發項目的業績衝刺期,最近得到了一句「計算規則有問題所以沒人拿到獎金」作為總結,接下來打算還自己下班時間的自由,重新做些技術心得的整理,也就想起了leetcode的解題紀錄。
上面稍微說了點重回matters的前因後果,吐苦水的部分以後再看情況分享,比較重要的是我在共用程式以及單元測試的領域有了更多的實作心得,現在來看去年留下的這個只記錄了答案的專案,還真是…寫的挺不好的耶。
以下分別是舊版和新版專案在同一個題目的紀錄方式,舊版是在專案的根目錄建立資料夾,名稱格式為「編號. 題目」,純粹複製貼上leetcode解答的內容;
新版建立了一個maven spring boot專案,每個題目於所在的難度package底下建立以題目+題號組成的package(例如com.easy.valid_parentheses_20,題目名稱是以leetcode網址修改而來)。
各題目package下首先建立一個AbstractSolution.java抽象類別,定義這題要求的輸入輸出格式為何,與leetcode網站上的要求相同,因此建立繼承它的類別時就可以把程式裡寫的內容貼到網站上測試解答。
public abstract class AbstractSolution {
abstract boolean isValid(String s);
}
此外如上圖,在建立的對應測試程式當中「AbstractSolutionTest<String, Boolean>」定義了測試時期望的回傳值,如此一來AbstractSolutionTest中的map物件就可以定義輸入值與期望回傳的對應,用於驗證執行結果。
public abstract class AbstractSolutionTest<M, N> {
protected Map<M, N> checkPoints;
}
class SolutionTest extends AbstractSolutionTest<String, Boolean> {
SolutionTest() {
// 此區的輸入與期望回傳結果為題目範例
checkPoints = Map.ofEntries(
Map.entry("()", true),
Map.entry("()[]{}", true),
Map.entry("(]", false),
Map.entry("([])", true)
);
}
private final AbstractSolution solution = new Solution();
private final AbstractSolution solutionOther = new SolutionOther();
@Test
void testSolution() {
isValid(solution);
}
@Test
void testSolutionOther() {
isValid(solutionOther);
}
}
星期五花了一點時間把這些紀錄改成新寫法,幸好累積的不多不然真是浩大的工程,如此一來總算比較有開發實際可用程式的感覺,也比較方面透過測試紀錄一些自己的心得,這些也是受到今年的開發經驗影響吧。
未來如果又有更適合的管理方式應該也可以基於目前的架構維持舊版程式不變,只有新版套用新方法互不影響,應該可以……吧?
如何寫出未來可以相容的程式,好改或不需要改的程式也是日常開發的重要課題之一呢。
新版架構專案連結