今天花了點時間看了物件導向分析與設計,看了前四章的感覺是,這本書花了很多時間在指導我們如何分析客戶的需求,如何寫出良好的 user cases ,當然對於程式的封裝也有稍微提及。
不過今天要介紹的是UML圖
UML
是系統分析以及設計的重要產物,也是實作以及測試的依據。
下面這張圖是 head first 物件導向分析與設計裡面的一個 sample,
使用者希望能有一個 Remote 能夠在按下按鈕的時候, DogDoor 會打開/關閉,
然後也希望家裡的狗 Bark 的時候, DogDoor 可以 Recognize 是自己家的狗然後開門。
上圖中 Remote -> DogDoor 之間的數字 1 代表著
Remote has 1 個 DogDoor
相同的 BarkRecognizer also has 1個 DogDoor
DogDoor has n 個 Bark 而DogDoor 可以在 allowedBarks的屬性裡儲存任意數量的Bark
看完了UML圖以及解釋之後接下來就是實作部分
Sample Code
Bark.java
public class Bark { /** * @param args */ private String sound; public Bark(String sound) { this.sound = sound; } public String getSound() { return sound; } public boolean equals(Bark bark) { if(bark.getSound().equals(this.sound)) return true; return false; } }
BarkRecognizer.java
public class BarkRecognizer { /** * @param args */ private DogDoor door; public BarkRecognizer(DogDoor door) { this.door = door; } public void recognize(Bark bark) { java.util.List<Bark> allowedBarks = door.getAllowedBarks(); for (Bark allowedBark : allowedBarks) { if(bark.equals(allowedBark)) { door.Open(); return; } } System.out.println("Door is not Open"); } }
DogDoor.java
public class DogDoor { /** * @param args */ private List<Bark> allowedBarks = new ArrayList<Bark>(); private boolean Open=false; public void Open() { System.out.println("Door Open"); final Timer timer = new Timer(); timer.schedule(new TimerTask(){ @Override public void run() { // TODO Auto-generated method stub Close(); timer.cancel(); } },5000); } public void Close() { System.out.println("Door Close"); } public boolean IsOpen() { return Open; } public void addAllowedBark(Bark bark) { allowedBarks.add(bark); } public List<Bark> getAllowedBarks() { return allowedBarks; } }
Remote.java
public class Remote { /** * @param args */ private DogDoor door; public Remote(DogDoor door) { this.door = door; } public void pressButton() { if(door.IsOpen()) door.Close(); door.Open(); } }
接著拿出head first 裡面所提供的測試檔案
Test
public static void main(String[] args) { // TODO Auto-generated method stub DogDoor door = new DogDoor(); door.addAllowedBark(new Bark("rowlf")); door.addAllowedBark(new Bark("rooowlf")); door.addAllowedBark(new Bark("rawlf")); door.addAllowedBark(new Bark("woof")); BarkRecognizer recognizer = new BarkRecognizer(door); Remote remote = new Remote(door); System.out.println("Bruce starts barking."); recognizer.recognize(new Bark("rowlf")); System.out.println("Bruce has gone outside..."); try{ Thread.currentThread().sleep(6000); }catch(InterruptedException ex) { } System.out.println("Bruce's all done..."); System.out.println("but he's stuck outside..."); Bark smallDogBark = new Bark("open the door"); System.out.println("A small dog starts barking."); recognizer.recognize(smallDogBark); System.out.println("Bruce starts barking"); recognizer.recognize(new Bark("rowlf")); System.out.println("Bruce's Back inside"); }
Result
Bruce starts barking.
Door Open
Bruce has gone outside...
Door Close
Bruce's all done...
but he's stuck outside...
A small dog starts barking.
Door is not Open
Bruce starts barking
Door Open
Bruce's Back inside
Door Close
結論
這次展示了如何從UML 到程式的coding
UML就有點像是蓋房子之前的藍圖,
有了藍圖就可以降低user想蓋巴黎鐵塔結果developer卻蓋出金字塔的問題。
我想這對user 來說應該也算是一大福音吧 XD