HFOOAD Chapter 1 A Simple Application. We build software to solve problems. People have problems. Therefore, we build software for people. Phần mềm tốt.

Slides:



Advertisements
Similar presentations
Dù muốn hay không, một ngày kia, chúng ta cũng phải chia tay thế giới này.
Advertisements

THÁNH CẢ GIUSE VÀ … CHIẾC CẦU THANG KỲ DIỆU
GV: Nguyễn Thị Thúy Hiền PHÒNG GD&ĐT PHÚ VANG TRƯỜNG THCS PHÚ THƯỢNG.
HFOOAD Chapter 1 A Simple Application. We build software to solve problems. People have problems. Therefore, we build software for people. Good software.
CS 151: Object-Oriented Design August 22 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak
GIÁO ÁN PHÒNG GIÁO DỤC VÀ ĐÀO TẠO HUYỆN PHÚ VANG SINH HỌC LỚP 7
5.
AI CŨNG PHẢI HỌC LÀM NGƯỜI
Giáo viên thực hiện: Võ HuyHoàng
LÒNG TỰ TRỌNG gxdaminh.net Cảnh thiên nhiên soi mình dưới nước…
By Nguyen Minh Quy - UTEHY
LOGO JOOMLA & PHP See How easy it is! Trung tâm đào tạo lập trình viên quốc tế Aprotrain -Aptech Làm web trong 10 phút Diễn giả : Đặng Tuấn Tú.
CS 151: Object-Oriented Design August 27 Class Meeting Department of Computer Science San Jose State University Fall 2013 Instructor: Ron Mak
Cách trộn thư trong Office 2003 Ứng dụng để làm giấy khen, giấy mời.
Chào mừng quý thầy cô và các em TRƯỜNG THPT TRẦN VĂN KỶ TỔ LÝ – TIN - KTCN.
Anh gặp nàng trong một bữa tiệc. Nàng vô cùng xinh xắn và dễ thương... Biết bao chàng trai vây quanh nàng trong khi anh chỉ là một gã bình thường chẳng.
BÀI 3. ĐƯỜNG THẲNG VÀ MẶT PHẲNG SONG SONG SỞ GD&ĐT ĐIỆN BIÊN TRƯỜNG THCS-THPT TẢ SÌN THÀNG BÀI DỰ THI SOẠN GIẢNG E-LEARNING Chương II ĐƯỜNG THẲNG VÀ MẶT.
Orientation Các vấn đề về IT.
Chúa Nhật 18 Thường Niên Năm C
25th Sunday in Ordinary Time Year A Chúa Nhật 25 Thường Niên Năm A
Giáo viên: Nguyễn Ngọc Thúy Hằng Đơn vị: Trường THPT Lê Quý Đôn
TRAO ĐỔI KINH NGHIỆM PHƯƠNG PHÁP ÔN LUYỆN & KỸ NĂNG THI TOEIC
CƠ CHẾ QUẢN LÝ KINH TẾ TRƯỚC THỜI KÌ ĐỔI MỚI (1975 – 1986)
1 BÀI 6 BẤM CÁP VÀ CHIA SẺ DỮ LIỆU MẠNG. 2 Nội Dung  Bấm cáp xoắn đôi đúng chuẩn Phương pháp bấm cáp chuẩn A Phương pháp bấm cáp chuẩn B  Kết nối máy.
TỔNG QUAN VỀ NGÔN NGỮ LẬP TRÌNH C/C++
Thị trường mới ThS. Nguyễn Văn Thoan
Top 10 đáng tin cậy cá cược bóng đá online trang web ở Việt Nam.
Internet & E-Commerce
Ngôn ngữ lập trình C/C++
SỬ DỤNG EXCEL ĐỂ TRÍCH KHẤU HAO TSCĐ
Bảo mật - Mã hóa dữ liệu Nội dung trình bày :
CHƯƠNG 9 PHẦN MỀM POWERPOINT
BÀI 4 CÔNG NGHỆ THÔNG TIN VÀ CHUỖI CUNG ỨNG
© 2007 Thomson South-Western
Hướng dẫn viết đề cương nghiên cứu
Kỹ Năng Ghi Nhận - Affirmation
© 2007 Thomson South-Western
Tuyển chọn nguồn nhân lực của
Ràng buộc toàn vẹn (Integrity Constraint)
Dược Thảo Lợi Hại Ra Sao Kính thưa quí bạn, slide show nầy nói về những điều cần lưu ý khi tìm đọc các thông tin về các loại thuốc phụ trợ hoặc bổ sung,
Chương 1: Khái quát về dự án đầu tư.
Ra quyết định kinh doanh
Nơi Microsoft Oulook Chứa Và Data
Policy Analysis Tools of the Trade NMDUC 2009.
Cấu hình đơn giản cho Router
Chương 5: Kiểm thử (Testing)
Môn: Lập trình Hướng đối tượng (Object Oriented Programming)
Chương 6 Các chiến lược tiếp thị
TÀI LIỆU GIẢNG DẠY IC3 GS4 SPARK
HỆ ĐIỀU HÀNH MẠNG.
Chương10: Vai trò của sai lệch hệ thống trong các nghiên cứu sức khỏe
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
CMPE 135: Object-Oriented Analysis and Design August 23 Class Meeting
I Believe Tôi tin.
CÁC PHƯƠNG PHÁP XÁC ĐỊNH CHI PHÍ (phần B)
Lớp DH05LN GIÁO VIÊN PHỤ TRÁCH ThS. NGUYỄN QUỐC BÌNH
Special complete mix for dairy cows Cám hỗn hợp đặc biệt cho bò sữa
KỸ NĂNG LUYỆN TRÍ NHỚ ThS. Huỳnh Phạm Ngọc Lâm.
LỄ CHÚA BA NGÔI NĂM C. THE MOST HOLY TRINITY
Please click through slides at your leisure
Chương 3. Lập trình trong SQL Server TRIGGER
SỞ GIÁO DỤC VÀ ĐÀO TẠO ĐIỆN BIÊN TRƯỜNG THPT MÙN CHUNG
CMPE 135: Object-Oriented Analysis and Design August 30 Class Meeting
Quản trị rủi ro Những vấn đề căn bản Nguyễn Hưng Quang 07/11/2015 NHẬT HOA IC&T.
I II III Sinh hoạt kinh tế Chỉ huy, quyết định Nhà Nước cộng sản I. KHÁI NIỆM.
CMPE 135: Object-Oriented Analysis and Design February 5 Class Meeting
TRƯỜNG ĐẠI HỌC NGOẠI THƯƠNG CƠ SỞ II TẠI TP. HỒ CHÍ MINH HỘI NGHỊ KHOA HỌC CƠ SỞ II “BÁO CÁO HOẠT ĐỘNG ĐI THỰC TẾ CỦA GIẢNG VIÊN CSII, NĂM HỌC ”
NGHI TH Ứ C XÃ H Ộ I VI Ệ N TH Ẩ M M Ỹ 198 LÀO CAI.
Presentation transcript:

HFOOAD Chapter 1 A Simple Application

We build software to solve problems. People have problems. Therefore, we build software for people. Phần mềm tốt không chỉ giải được các bài toán hiện tại, mà nó có thể được bảo trì và sửa đổi để đáp ứng với những thay đổi tất yếu mà khách hàng sẽ muốn có. 2

Rick’s Guitars ‣ Maintain a guitar inventory ‣ Locate guitars for customers 3

What your predecessor built Does this make any sense to you? 4

A simplified view 5

But there’s a problem… 6 Rick’s Guitars Back Room Not in stock. I’m looking for a fender Strat.

But there’s a problem… fender ≠ Fender 7 Rick’s Guitars Back Room Not in stock. I’m looking for a fender Strat.

The Guitar class public class Guitar { private String serialNumber, builder, model, type, backWood, topWood; private double price; public Guitar(String serialNumber, double price, String builder, String model, String type, String backWood, String topWood) { this.serialNumber = serialNumber; this.price = price; this.builder = builder; this.model = model; this.type = type; this.backWood = backWood; this.topWood = topWood; } public String getSerialNumber() {return serialNumber;} public double getPrice() {return price;} public void setPrice(float newPrice) { this.price = newPrice;} public String getBuilder() {return builder;} public String getModel() {return model;} public String getType() {return type;} public String getBackWood() {return backWood;} public String getTopWood() {return topWood;} } 8

public class Inventory { private List guitars; public Inventory() { guitars = new LinkedList(); } public void addGuitar(String serialNumber, double price, String builder, String model, String type, String backWood, String topWood) { Guitar guitar = new Guitar(serialNumber, price, builder, model, type, backWood, topWood); guitars.add(guitar); } public Guitar getGuitar(String serialNumber) { for (Iterator i = guitars.iterator(); i.hasNext(); ) { Guitar guitar = (Guitar)i.next(); if (guitar.getSerialNumber().equals(serialNumber)) { return guitar; } return null; } The Inventory class 9

The Inventory class continued public Guitar search(Guitar searchGuitar) { for (Iterator i = guitars.iterator(); i.hasNext(); ) { Guitar guitar = (Guitar)i.next(); String builder = searchGuitar.getBuilder().toLowerCase(); if ((builder != null) && (!builder.equals("")) && (!builder.equals(guitar.getBuilder().toLowerCase()))) continue; String model = searchGuitar.getModel().toLowerCase(); if ((model != null) && (!model.equals("")) && (!model.equals(guitar.getModel().toLowerCase()))) continue; String type = searchGuitar.getType().toLowerCase(); if ((type != null) && (!searchGuitar.equals("")) && (!type.equals(guitar.getType().toLowerCase()))) continue; String backWood = searchGuitar.getBackWood().toLowerCase(); if ((backWood != null) && (!backWood.equals("")) && (!backWood.equals(guitar.getBackWood().toLowerCase()))) continue; String topWood = searchGuitar.getTopWood().toLowerCase(); if ((topWood != null) && (!topWood.equals("")) && (!topWood.equals(guitar.getTopWood().toLowerCase()))) continue; return guitar; } return null; } 10

What can you do?

What can you do? case insensitive khi so sánh maker Lúc nào cũng dùng case insensitive khi so sánh string Dùng constant cho các maker khác nhau Nói chuyện với Rick để hỏi chi tiết về bài toán

Three steps to great software 1. Đảm bảo rằng phần mềm làm đúng những gì khách hàng muốn 2. Áp dụng tốt các nguyên lí hướng đối tượng 3. Cố gắng đạt được một thiết kế bảo trì được, tái sử dụng được 13

Step 1: Talk to Rick What questions will you ask Rick? 14

Questions for Rick

Questions for Rick Do you only sell guitars? How will you update the inventory? How should a search for a guitar really work? Do you need reports about inventory and sales?

Rick says Khách hàng không phải lúc nào cũng biết tất cả các đặc điểm của cây đàn họ muốn. Thường có nhiều hơn 01 cây đàn khớp với nhu cầu khách hàng. Khách hàng thường tìm một cây đàn trong một khoảng giá cụ thể Tôi có cần báo cáo kho hàng và các chức năng khác, nhưng vấn đề số 1 của tôi là tìm được đúng cây ghi-ta cho khách hàng. 17

To do list: 1.If there are guitars in stock that fit the customer’s needs, always find them. 2.Take into account typing mistakes by the customer or make it impossible to enter erroneous data. 18

Iteration 1: Remove strings public class Guitar { private String serialNumber, model; private double price; private Builder builder; private Type type; private Wood backWood, topWood; … public enum Type { ACOUSTIC, ELECTRIC; public String toString() { switch(this) { case ACOUSTIC: return "acoustic"; case ELECTRIC: return "electric"; default: return "unspecified"; } 19

A better enum implementation public enum Type { ACOUSTIC("acoustic"), ELECTRIC("electric"), UNSPECIFIED("unspecified"); String value; private Type(String value) { this.value = value; } public String toString() { return value; } 20

The impact of our changes What else might we have to do to our application?

The impact of our changes Change data entry forms and code Update the inventory database …

Rick says Khách hàng không phải lúc nào cũng biết tất cả các đặc điểm của cây đàn họ muốn. Thường có nhiều hơn 01 cây đàn khớp với nhu cầu khách hàng. Khách hàng thường tìm một cây đàn trong một khoảng giá cụ thể Tôi có cần báo cáo kho hàng và các chức năng khác, nhưng vấn đề số 1 của tôi là tìm được đúng cây ghi-ta cho khách hàng. 23

To do list: 1.If there are guitars in stock that fit the customer’s needs, always find them. 2.Take into account typing mistakes by the customer or make it impossible to enter erroneous data. 3.Find ALL matching guitars. 24

We can return an array of Guitars. Why not a List of Guitars? Does it really matter? 25

Solution public Iterator search(Guitar searchGuitar) { List matchingGuitars = new LinkedList (); for (Iterator i = guitars.iterator(); i.hasNext(); ) { Guitar guitar = i.next(); // Ignore serial number since that's unique // Ignore price since that's unique if (searchGuitar.getBuilder() != guitar.getBuilder()) continue; String model = searchGuitar.getModel().toLowerCase(); if ((model != null) && (!model.equals("")) && (!model.equals(guitar.getModel().toLowerCase()))) continue; if (searchGuitar.getType() != guitar.getType()) continue; if (searchGuitar.getBackWood() != guitar.getBackWood()) continue; if (searchGuitar.getTopWood() != guitar.getTopWood()) continue; matchingGuitars.add(guitar); } return matchingGuitars.iterator(); } 26

Something is still wrong Tôi tưởng anh có bộ sưu tập ghi-ta Gibson lớn nhất bang. Tôi rất muốn một cái, nhưng cái hệ thống bán hàng đần độn của anh bảo rằng anh chẳng có cây Gibson nào. Tôi chỉ muốn một cây Gibson. Tôi chẳng quan tâm ghi-ta điện hay ghi-ta dây, gỗ gì cũng được. Vậy mà anh không có cây nào như vậy! Bán đàn kiểu quái gì vậy? 27

Rick is not happy Tôi tưởng các anh sửa rồi? Tôi có cả lô Gibson. Các anh nhận tiền công để làm gì? 28

Why didn’t the Gibsons show up? Maybe there really were none in stock. What did the customer enter? 29

Something’s still wrong I just entered “Gibson” and left everything else empty. That’s right, isn’t it? 30

Three steps to great software Does the software do what the customer wants? What’s the problem? 1. Make sure the software does what the customer wants 2. Apply good object-oriented principles 3. Strive for a maintainable, reusable design 31

Things that might be wrong

Things that might be wrong Not all properties are relevant There is no wildcard value There’s no way to select more than one value for a property …

You know, when a customer searches for a guitar, they’re providing a set of characteristics they are looking for, not a specific guitar. Maybe that’s the problem. 34

A GuitarSpec is not a Guitar GuitarSpecGuitar I am not a Guitar. 35

We can use UML to show this 36

public class GuitarSpec { private Builder builder; private String model; private Type type; private Wood backWood; private Wood topWood; public GuitarSpec(Builder builder, String model, Type type, Wood backWood, Wood topWood) { this.builder = builder; this.model = model; this.type = type; this.backWood = backWood; this.topWood = topWood; } public Builder getBuilder() { return builder; }… Incremental changes 37

Incremental changes (2) public class Guitar { private String serialNumber; private double price; GuitarSpec spec; public Guitar(String serialNumber, double price, Builder builder, String model, Type type, Wood backWood, Wood topWood) { this.serialNumber = serialNumber; this.price = price; this.spec = new GuitarSpec(builder, model, type, backWood, topWood); } … public GuitarSpec getSpec() { return spec; } 38

What’s in a name? Is GuitarSpec a good name for the new class? What other names might fit? Are the better or worse? 39

Does this make sense? 40

Things that might be wrong Not all properties are relevant There is no wildcard value There’s no way to select more than one value for a property … Did the changes we just made help?

What principles did we apply? Are there any more that come to mind? 1. Make sure the software does what the customer wants 2. Apply good object-oriented principles 3. Strive for a maintainable, reusable design Three steps to great software 42

A word on increments & iterations ‣ Iterative development ‣ Repeating the steps in a development process over and over ‣ Shorter iterations are better ‣ Incremental development ‣ Add a bit at a time ‣ No big bang 43 Start Goal

A lot of customers are looking for 12-string guitars. Maybe we’d better add that to the guitars’ characteristics we record. According to the contract, that’s not what you asked for. 44

We can add the number of strings. It’s not a problem. 45

What do you need to change?

What do you need to change? GuitarSpec Inventory 47

public class GuitarSpec { private Builder builder; private String model; private Type type; private int numStrings; private Wood backWood; private Wood topWood; public GuitarSpec(Builder builder, String model, Type type, int numStrings, Wood backWood, Wood topWood) { this.builder = builder; this.model = model; this.type = type; this.numStrings = numStrings; this.backWood = backWood; this.topWood = topWood; } … public int getNumStrings() { return numStrings; } … } 48 Changes to GuitarSpec

public Iterator search(GuitarSpec searchSpec) { List matchingGuitars = new LinkedList (); for (Iterator i = guitars.iterator(); i.hasNext(); ) { Guitar guitar = i.next(); GuitarSpec spec = guitar.getSpec(); if (searchSpec.getBuilder() != spec.getBuilder()) continue; String model = searchSpec.getModel().toLowerCase(); if ((model != null) && (!model.equals("")) && (!model.equals(spec.getModel().toLowerCase()))) continue; if (searchSpec.getType() != spec.getType()) continue; if (searchSpec.getBackWood() != spec.getBackWood()) continue; if (searchSpec.getTopWood() != spec.getTopWood()) continue; if (searchSpec.getNumStrings() != spec.getNumStrings()) continue; matchingGuitars.add(guitar); } return matchingGuitars.iterator(); } 49 Changes to Inventory

Cool. That’s just what I wanted. You’re the best. Next time you’ve got my business again. 50

Three steps to great software That wasn’t so hard! 1. Make sure the software does what the customer wants 2. Apply good object-oriented principles 3. Strive for a maintainable, reusable design 51

Can we do better? Why did we have to modify two files to make the change? 52

Maybe we’ve allocated the responsibilities incorrectly. There’s a pattern called Information Expert that might be appropriate here. O-O design is all about assigning responsibilities to the objects in our system. 53

Information Expert Assign responsibility to the class that has the essential information—the information expert. Craig Larman, “Applying UML and Patterns” 54

Think about this? Who is the information expert? What should we do? What behavior is misplaced? 55

Think about this? Matching the guitar to the specification GuitarSpec Make GuitarSpec reasonable for determining if it matches a guitar. Who is the information expert? What should we do? What behavior is misplaced? 56

The new GuitarSpec class Gee, this looks sort of familiar! public class GuitarSpec { … public boolean matches(GuitarSpec otherSpec) { if (builder != otherSpec.builder) return false; if ((model != null) && (!model.equals("")) && (!model.toLowerCase().equals(otherSpec.model.toLowerCase()))) return false; if (type != otherSpec.type) return false; if (numStrings != otherSpec.numStrings) return false; if (backWood != otherSpec.backWood) return false; if (topWood != otherSpec.topWood) return false; return true; } … } 57

The new Inventory class Public class Inventory { … public List search(GuitarSpec searchSpec) { List matchingGuitars = new LinkedList(); for (Iterator i = guitars.iterator(); i.hasNext(); ) { Guitar guitar = (Guitar)i.next(); if (guitar.getSpec().matches(searchSpec)) matchingGuitars.add(guitar); } return matchingGuitars; } … } 58

Congratulations! ‣ You’ve just performed your first refactoring ‣ You’ve made the customer happy ‣ You’ve applied solid O-O principles ‣ You have a maintainable application ‣ You’ve created great software, right? Go out and celebrate at the coffee shop 59

Do you think we might have broken something when we made those last changes? How can you be sure? 60