自己菜鳥階段時在練習Java物件導向、設計模式時,所設計的題庫,此專案庫目前用來讓我的同學/學生 (欠調教的) 們提交程式碼來進行Review,欲參考OOP題目者可直接到Projects區觀看,題目皆(85%)擁有示範解答程式碼。ISSUE放的都是Code Review嘴砲。(物件導向設計學分兩階段→JAVA→設計模式)
24
stars
6
forks
source link
Command Pattern : 永王 #90
Open
Johnny850807 opened 7 years ago
Command 意即指令,每個指令的動機性都是強烈的。 命名成Button1...6,就代表你只是針對這題解題而已, 難道之後接班這個家具案子的工程師,真的敢用你的sdk做事嗎? 他要繼續命名 Button7 ...12 下去嗎 ? 如果要有可讀性 應該命名為
TurnOnLightCommand
等等..。 第一能夠讓人知道這是 Command Pattern, 第二能夠讓這個指令的意圖很明顯。 第三瞬間也知道這個指令的還原會做什麼。這就是缺乏的維護性及可讀性。
指令本身何須自帶數字 ? 其實你的指令設計中從來都不需要跟這個數字耦合, 他只需要被放進某個資料結構而已... 如果自帶數字 那以後不用遙控器的話怎辦。 這個數字就會成為一個累贅而已。
設計原則:封裝 都沒顧慮到的話 還跟人談什麼 OOD?
button.btn_number
??public static 全域變數? 那你還不如直接這個類別刪掉都來得有維護性, 特地創一個類別來搞亂大家的關係 這樣哪叫分配責任,這叫亂僱員工。
這裡是二轉,題目需求有寫要丟例外,丟例外才能進行整合處理。 如果連丟例外的價值都還不確定的話,那就不能開發 sdk 這樣還是不具有擴充性的寫法。
你的設計中都只有 press,請再去看 Command Pattern 的 class diagram,一定不是這樣,這樣的話根本就沒有支援還原功能。
再來這張根本就是新手會做的,用建構子來控制流程? 用建構子來控制流程,除了不直覺以外也沒有重複利用性。 全世界只有你知道自己在幹嘛。
然後這些全部都是一些沒意義的關聯,請問你要這個類別幹嘛 ? 直接寫個工廠去創造遙控器都比這個有意義多,
new HandleButtonEvent(button);
跟handler.handle(button);
哪個比較省記憶又比較有可讀性? 這種解題的流程思維根本該去寫 c++你竟然用
remoteControl
的建構子來初始化這個傢伙, 而這個傢伙的建構子又製造出全域變數給別人依賴? 這真的有半點維護性跟可讀性可言嗎? 擴充性的話以下我還有很多話要說再來這個真的是致命性的錯誤,指令在實體化的時候也會實體化家具 ? 那我今天想要重複用現有的家具不就做不成 ? 這不就是解題思維嗎, 連依賴都注入不進去哪叫OOD 起碼也是把家具從建構子丟進來,才叫 Command Pattern 才真的解耦 !! 才符合 SOLID 原則的 D
再來以下是常識
這邊請用
do while
,只會直覺地用無限迴圈+break,只是另類的把可讀性降低而已。new remoteControl().press(RemoteControlButtonItem.buttonList.get(command));
然後你真的不知道這句有多麼像一個來搞亂的實習生寫的??
毫無擴充性好嗎... 假如今天需求變了,指令要避免重複跟要自動藉由一些演算法排序了, 你要換資料結構換成 TreeSet,你告訴我全部都直接依賴
buttonList.get(command)
, 這個情況下是要換個鳥 ? 一改資料結構全部都瞬間紅線太開心了喔對了,請問你用
new remoteControl().press
而這裡面 呼叫new HandleButtonEvent(button);
, 那一開始就直接new HandleButtonEvent(button);
不就好了?你這種老闆公司會倒閉吧 亂請員工