Johnny850807 / Coding-GYM

自己菜鳥階段時在練習Java物件導向、設計模式時,所設計的題庫,此專案庫目前用來讓我的同學/學生 (欠調教的) 們提交程式碼來進行Review,欲參考OOP題目者可直接到Projects區觀看,題目皆(85%)擁有示範解答程式碼。ISSUE放的都是Code Review嘴砲。(物件導向設計學分兩階段→JAVA→設計模式)
24 stars 6 forks source link

Command Pattern : 永王 #90

Open Johnny850807 opened 7 years ago

Johnny850807 commented 7 years ago

可讀性 image

Command 意即指令,每個指令的動機性都是強烈的。 命名成Button1...6,就代表你只是針對這題解題而已, 難道之後接班這個家具案子的工程師,真的敢用你的sdk做事嗎? 他要繼續命名 Button7 ...12 下去嗎 ? 如果要有可讀性 應該命名為 TurnOnLightCommand 等等..。 第一能夠讓人知道這是 Command Pattern, 第二能夠讓這個指令的意圖很明顯。 第三瞬間也知道這個指令的原會做什麼。

這就是缺乏的維護性可讀性

image

然而先不論 btn_number 這個命名有多不像 java... 應該是 buttonNumber 然後是整數型態...

指令本身何須自帶數字 ? 其實你的指令設計中從來都不需要跟這個數字耦合, 他只需要被放進某個資料結構而已... 如果自帶數字 那以後不用遙控器的話怎辦。 這個數字就會成為一個累贅而已。

封裝性

設計原則:封裝 都沒顧慮到的話 還跟人談什麼 OOD?

image

button.btn_number ??

image

public static 全域變數? 那你還不如直接這個類別刪掉都來得有維護性, 特地創一個類別來搞亂大家的關係 這樣哪叫分配責任,這叫亂僱員工。

更別說你類別的命名哪一點看得出他就是主要的那個遙控器?

例外處理 image

這裡是二轉,題目需求有寫要丟例外,丟例外才能進行整合處理。 如果連丟例外的價值都還不確定的話,那就不能開發 sdk 這樣還是不具有擴充性的寫法。

更不用說你直接耦合 System.out,連搬到App上都做不到

UNDO 呢?

你的設計中都只有 press,請再去看 Command Pattern 的 class diagram,一定不是這樣,這樣的話根本就沒有支援還原功能。

這是啥鬼? 用建構子做事? image

先不論你的類別首字小寫... 這樣還敢說你愛 java?

再來這張根本就是新手會做的,用建構子控制流程? 用建構子來控制流程,除了不直覺以外也沒有重複利用性。 全世界只有你知道自己在幹嘛。

然後這些全部都是一些沒意義的關聯,請問你要這個類別幹嘛 ? 直接寫個工廠去創造遙控器都比這個有意義多, new HandleButtonEvent(button);handler.handle(button); 哪個比較省記憶又比較有可讀性? 這種解題的流程思維根本該去寫 c++

image

你竟然用remoteControl的建構子來初始化這個傢伙, 而這個傢伙的建構子又製造出全域變數給別人依賴? 這真的有半點維護性跟可讀性可言嗎? 擴充性的話以下我還有很多話要說

依賴注入 !! image

再來這個真的是致命性的錯誤,指令在實體化的時候也會實體化家具 ? 那我今天想要重複現有的家具不就做不成 ? 這不就是解題思維嗎, 連依賴都注入不進去哪叫OOD 起碼也是把家具從建構子丟進來,才叫 Command Pattern 才真的解耦 !! 才符合 SOLID 原則的 D

再來以下是常識

可讀性 image

這邊請用 do while ,只會直覺地用無限迴圈+break,只是另類的把可讀性降低而已。

你十年後再來看,你真的知道自己在寫什麼 ?

new remoteControl().press(RemoteControlButtonItem.buttonList.get(command));

然後你真的不知道這句有多麼像一個來搞亂的實習生寫的??

毫無擴充性好嗎... 假如今天需求變了,指令要避免重複跟要自動藉由一些演算法排序了, 你要換資料結構換成 TreeSet,你告訴我全部都直接依賴buttonList.get(command), 這個情況下是要換個鳥 ? 一改資料結構全部都瞬間紅線太開心了

全域變數根本是來亂的,只 Focus 在 Command Pattern 上,但卻連基本的都做不到的話就先回去二轉前幾題。

喔對了,請問你用 new remoteControl().press 而這裡面 呼叫 new HandleButtonEvent(button);, 那一開始就直接 new HandleButtonEvent(button); 不就好了?

你這種老闆公司會倒閉吧 亂請員工