Tennis Kata 是我最常練習的一個題目, 就我個人而言,這個題目源起 91 大的極速開發, 目前最快只有在 17 分左右,使用 Rider with Mac 的話可能還會再慢一些。 我很熟悉,所以很少作需求分析,Test Case 也大多有即定的寫法。 手動得很快,腦卻不怎麼動了,明明這是一個相當經典的題目, 不過我卻被定錨了。
今年 5 月上了「測試驅動開發與持續重構」, 第一天 91 大也有透過 Tennis Kata 展示了一下火力, 那個時候又有提到可以使用 State Pattern 來實作, 最近工作上又恰巧有使用到 State Pattern。 於是我便決定要試著用 State Pattern 來進行 Tennis Kata 。
有兩種方法,一種是無到有的 Kata, 一種是將現有 Tennis Production Code, 透過重構轉換成 State Pattern, 這次我選擇從無到有。
第一次失敗
總歸來說,需求分析作得不夠徹底, Test Case 設計不良,所以很難自然而然的讓 State 產生
上圖是我第一次畫的 State , 現在回過頭來想想,圖型上其實可以很明顯看出重複的壞味道。 但是我當下完全沒有「覺察」,明明是想要消除 if else, 卻在 State 裡面產生了大量的 if else。
以 ServerScore 方法為例, 本來是在定義在 Abstract Class State 之中的抽像方法, 由各個 State (Normal、Same、Deuce、Adv 與 Win)實作, 但是我們可以明顯發現, Context.ServerPoint++ 是重複的, 而 ChangeState 才是真正抽像的地方, 所以我們可以在 Abstract Class State 加入以下的方法與抽像方法,
另外個人的工作流程我不覺得需要跑 Scrum , 可以試試 GTD 或 PDCA ,而且你會發現很多類似的觀念與原則。 Scrum 設計上是適合小型團隊的,業界說法是 3~9 人,不含 PO 與 SM 多人的公司也有很多別的方法論(EX: LeSS or SAFe),這裡我不多開戰線,敏捷無它「務實」而已。 方法沒有不好,只有適不適合。
Azure DevOps 的 BackLogs 放著許多 Feature , 依據不同的功能,再將每個 Sprint 的 User Story 放進去 這些 Feature 永遠不會被作完,隨著時間過去, 儘管完成了許多 User Story ,但是也會有新的 User Story 被加進去。 而作為文件,他的巢狀結構又不足以面對複雜的需求內容, 分散式存儲對於維護與修改上也是相同不便。
public Result MyMethod(Context ctx) { this.logger.LogInformation("Hello Marsen"); try{ //// do some thing } catch { this.logger.LogError("What's a Wonderful World"); } }
[ServiceFilter(typeof(AuditLogAttribute))] public Result MyMethod(Context ctx) { try{ //// do some thing } catch { this.logger.LogError("What's a Wonderful World"); } }
-tp|--test-projects Specify what test projects should run on the project under test. -p|--project-file <projectFileName> Used for matching the project references when finding the project to mutate. Example: "ExampleProject.csproj" -dk|--dashboard-api-key <api-key> Api key for dashboard reporter. You can get your key here: https://dashboard.stryker-mutator.io