Trở thành lập trình viên giỏi hơn.
Phát triển phần mềm với thiết kế tốt thực hiện đúng việc nó cần làm .
. và có tính mềm dẻo, đáng tin cậy, và bảo trì được.
Sử dụng các kĩ thuật hướng đối tượng đã được kiểm chứng.
Học các kĩ năng chuyên nghiệp quan trọng.
Làm việc trong một đội lập trình nhỏ.
Lấy kinh nghiệm về cách cộng tác và phối hợp với nhau để thiết kế, phát triển, và test ứng dụng.
Áp dụng các cách làm việc theo chuẩn công nghiệp hiện đại.
_
61 trang |
Chia sẻ: Mr Hưng | Lượt xem: 877 | Lượt tải: 0
Bạn đang xem trước 20 trang nội dung tài liệu Phân tích thiết kế hướng đối tượng, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
therSpec.builder) return false; if ((model != null) && (!model.equals("")) && (!model.equals(otherSpec.model))) return false; if (type != otherSpec.type) return false; if (backWood != otherSpec.backWood) return false; if (topWood != otherSpec.topWood) return false; return true; }Chỉ so sánh các thuộc tính chung.SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Revised Inventory Classpublic class Inventory { private List inventory; ... public void addInstrument(String serialNumber, double price, InstrumentSpec spec) { Instrument instrument = null; if (spec instanceof GuitarSpec) { instrument = new Guitar(serialNumber, price, (GuitarSpec) spec); } else if (spec instanceof MandolinSpec) { instrument = new Mandolin(serialNumber, price, (MandolinSpec) spec); } inventory.add(instrument); }}SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Revised Inventory Class, cont’d public List search(GuitarSpec searchSpec) { List matchingGuitars = new LinkedList(); for (Iterator i = inventory.iterator(); i.hasNext();) { Guitar guitar = (Guitar) i.next(); if (guitar.getSpec().matches(searchSpec)) { matchingGuitars.add(guitar); } } return matchingGuitars; } public List search(MandolinSpec searchSpec) { List matchingMandolins = new LinkedList(); for (Iterator i = inventory.iterator(); i.hasNext();) { Mandolin mandolin = (Mandolin) i.next(); if (mandolin.getSpec().matches(searchSpec)) { matchingMandolins.add(mandolin); } } return matchingMandolins; }Search for guitars.Search for mandolins.Overloaded search() methods.SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Guitar and Mandolin Classespublic class Guitar extends Instrument{ public Guitar(String serialNumber, double price, GuitarSpec spec) { super(serialNumber, price, spec); }}public class Mandolin extends Instrument { public Mandolin(String serialNumber, double price, MandolinSpec spec) { super(serialNumber, price, spec); }}Hai lớp này khác gì nhau?SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Revised GuitarSpec Classpublic class GuitarSpec extends InstrumentSpec { private int numStrings; ... // Override the superclass matches() public boolean matches(InstrumentSpec otherSpec) { if (!super.matches(otherSpec)) return false; if (!(otherSpec instanceof GuitarSpec)) return false; GuitarSpec spec = (GuitarSpec) otherSpec; if (numStrings != spec.numStrings) return false; return true; }}So sánh các thuộc tính của lớp chaSJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*New MandolinSpec Classpublic class MandolinSpec extends InstrumentSpec { private Style style; ... // Override the superclass matches() public boolean matches(InstrumentSpec otherSpec) { if (!super.matches(otherSpec)) return false; if (!(otherSpec instanceof MandolinSpec)) return false; MandolinSpec spec = (MandolinSpec) otherSpec; if (!style.equals(spec.style)) return false; return true; }}So sánh các thuộc tính của lớp chaHai phương thức matches() khác gì nhau?SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Any Red Flags?Duplicated codeGuitar and Mandolin classesGuitarSpec and MandolinSpec classesOverloaded search() methods in class Inventory: public List search(GuitarSpec searchSpec) { List matchingGuitars = new LinkedList(); for (Iterator i = inventory.iterator(); i.hasNext();) { Guitar guitar = (Guitar) i.next(); if (guitar.getSpec().matches(searchSpec)) { matchingGuitars.add(guitar); } } return matchingGuitars; } public List search(MandolinSpec searchSpec) { List matchingMandolins = new LinkedList(); for (Iterator i = inventory.iterator(); i.hasNext();) { Mandolin mandolin = (Mandolin) i.next(); if (mandolin.getSpec().matches(searchSpec)) { matchingMandolins.add(mandolin); } } return matchingMandolins; }SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*More Red Flags?Kiểm tra kiểu thành chuỗi, chẳng hạn trong addInstrument() của lớp Inventory: public void addInstrument(String serialNumber, double price, InstrumentSpec spec) { Instrument instrument = null; if (spec instanceof GuitarSpec) { instrument = new Guitar(serialNumber, price, (GuitarSpec) spec); } else if (spec instanceof MandolinSpec) { instrument = new Mandolin(serialNumber, price, (MandolinSpec) spec); } inventory.add(instrument); }SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Rick Wants More Instruments!Thiết kế của ta mở rộng không tiện tí nào!From: Head First Object-Oriented Analysis & Design, O’Reilly, 2006.SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Thiết kế của ta mở rộng không tiện tí nào!Với mỗi loại nhạc cụ mới:Ta cần thêm một lớp con của Instrument.Ta cần thêm một lớp con của InstrumentSpec.Trong lớp Inventory, ta cần viết thêm:Một phương thức search() mớiMột đoạn kiểm tra kiểu trong phương thức addInstrument()_SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Time to Revisit Our Design!Có lẽ cả loạt lớp con của Instrument và InstrumentSpec không phải là ý hay.Cái gì khác nhau giữa các lớp instrument?Đặc điểmThuật toán so sánhCái gì giống nhau?Hãng sản xuất - manufacturer Loại - typeGiá - priceserial numberTa làm gì với những thứ thay đổi?SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Encapsulation to the Rescue!Nếu ta có thể đóng gói những đặc điểm khác nhau của instrument vào một chỗ ... Ta có thể vứt bỏ tất cả các lớp con của Instrument và InstrumentSpec.Sau đó cả hai lớp Instrument và InstrumentSpec sẽ thành lớp cụ thể (thay vì lớp trừu tượng).Các nhạc cụ khác nhau có các đặc điểm khác nhau.Ghi-ta có một số đặc điểm mà măng-đô-lin không có.Đóng gói các đặc điểm vào trong một bảng băm.Các cặp property name : property value Mỗi loại nhạc cụ có thể có một bộ property riêng._SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Revised InstrumentSpec Classpublic class InstrumentSpec { private Map properties; public InstrumentSpec(Map properties) { if (properties == null) { this.properties = new HashMap(); } else { this.properties = new HashMap(properties); } } ...SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Revised InstrumentSpec Class, cont’dpublic boolean matches(InstrumentSpec otherSpec) { // Loop over the property keys in the hashmap. for (Iterator i = otherSpec.getProperties().keySet().iterator(); i.hasNext();) { // Do all the properties match? String propertyName = (String) i.next(); if (!properties.get(propertyName) .equals(otherSpec.getProperty(propertyName))) { return false; } } return true;}Đây là một thuật toán so sánh tổng quát chạy được chocác đặc điểm của loại nhạc cụ bất kì.SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Re-revised Inventory Classpublic class Inventory { private List inventory; ... public void addInstrument(String serialNumber, double price, InstrumentSpec spec) { Instrument instrument = new Instrument(serialNumber, price, spec); inventory.add(instrument); } ...SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Re-revised Inventory Class, cont’d public List search(InstrumentSpec searchSpec) { List matchingInstruments = new LinkedList(); for (Iterator i = inventory.iterator(); i.hasNext();) { Instrument instrument = (Instrument) i.next(); if (instrument.getSpec().matches(searchSpec)) { matchingInstruments.add(instrument); } } return matchingInstruments; }}Chỉ cần đúng một phương thức search()!SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Improved DesignFrom: Head First Object-Oriented Analysis & Design, O’Reilly, 2006.SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Improved Design, cont’dFrom: Head First Object-Oriented Analysis & Design, O’Reilly, 2006.SJSU Dept. of Computer ScienceSpring 2013: August 27CS 151: Object-Oriented Design© R. Mak*Kết luậnCần một hành trình để đến được một thiết kế tốtCải tiến từng bướcĐi sai đườngQuay luiViệc phát triển một phần mềm tuyệt vời có thể là một việc rắc rối!Hãy sẵn lòng sửa các quyết định thiết kế tồi của chính mình._
Các file đính kèm theo tài liệu này:
- 01_intro_7926.ppt