第一章.良好应用程序基石(2)

伟大软件的简易三步骤:

1.确认你的软件客户要它做的事。

2.运用基本的OO原则来增加软件的灵活性。

3.努力实现可维护、可重用的设计。

项目架构:

Guitar类:

 1 package com.headfirst.guitar;
 2
 3 public class Guitar {
 4     private String serialNumber, builder, model, type, backWood, topWood;
 5     private double price;
 6
 7     public Guitar(String serialNumber, double price, String builder,
 8             String model, String type, String backWood, String topWood){
 9         this.serialNumber = serialNumber;
10         this.price = price;
11         this.builder = builder;
12         this.model = model;
13         this.type = type;
14         this.backWood = backWood;
15         this.topWood = topWood;
16     }
17
18     public String getSerialNumber(){
19         return serialNumber;
20     }
21     public double getPrice(){
22         return price;
23     }
24     public void setPrice(float newPrice){
25         this.price = newPrice;
26     }
27     public String getBuilder(){
28         return builder;
29     }
30     public String getModel(){
31         return model;
32     }
33     public String getType(){
34         return type;
35     }
36     public String getBackWood(){
37         return backWood;
38     }
39     public String getTopWood(){
40         return topWood;
41     }
42 }

Inventory类:

 1 package com.headfirst.guitar;
 2
 3 import java.util.Iterator;
 4 import java.util.LinkedList;
 5 import java.util.List;
 6
 7 public class Inventory {
 8
 9     private List guitars;
10
11     public Inventory(){
12         guitars = new LinkedList();
13     }
14
15     public void addGuitar(String serialNumber, double price, String builder, String model, String type,
16             String backWood, String topWood){
17         Guitar guitar = new Guitar(serialNumber, price, builder,
18                 model, type, backWood, topWood);
19         guitars.add(guitar);
20     }
21
22     public Guitar getGuitar(String serialNumber){
23         for(Iterator i = guitars.iterator(); i.hasNext();){
24             Guitar guitar = (Guitar) i.next();
25             if(guitar.getSerialNumber().equals(serialNumber)){
26                 return guitar;
27             }
28         }
29
30         return null;
31     }
32
33     public Guitar search(Guitar searchGuitar){
34         for(Iterator i = guitars.iterator(); i.hasNext();){
35             Guitar guitar = (Guitar) i.next();
36             String builder = searchGuitar.getBuilder();
37             if((builder != null) && (!builder.equals("")) &&
38                     (!builder.equals(guitar.getBuilder())))
39                     continue;
40
41             String model = searchGuitar.getModel();
42             if((model != null) && (!model.equals("")) &&
43                     (!model.equals(guitar.getModel())))
44                     continue;
45
46             String type = searchGuitar.getType();
47             if((type != null) && (!type.equals("")) &&
48                     (!type.equals(guitar.getType())))
49                     continue;
50
51             String backWood = searchGuitar.getBackWood();
52             if((backWood != null) && (!backWood.equals("")) &&
53                     (!backWood.equals(guitar.getBackWood())))
54                     continue;
55
56             String topWood = searchGuitar.getTopWood();
57             if((topWood != null) && (!topWood.equals("")) &&
58                     (!topWood.equals(guitar.getTopWood())))
59                     continue;
60             return guitar;
61         }
62
63         return null;
64     }
65 }

搜寻测试代码:

 1 package com.headfirst.guitar;
 2
 3 public class FindGuitarTester {
 4     public static void main(String[] args){
 5         Inventory inventory = new Inventory();
 6         initializeInventory(inventory);
 7
 8         Guitar whatErinLikes = new Guitar("", 0, "fender", "Stratocastor", "electric", "Alder", "Alder");
 9
10         Guitar guitar = inventory.search(whatErinLikes);
11         if(guitar != null){
12             System.out.println("Erin, you might like this " +
13             guitar.getBuilder() + " " + guitar.getModel() +
14             " " + guitar.getType() + " guitar:\n " +
15             guitar.getBackWood() + " back and sides,\n " +
16             guitar.getTopWood() + " top.\nYou can have it for only $" +
17             guitar.getPrice() + "!");
18         }else{
19             System.out.println("Sorry, Erin, we have nothing for you.");
20         }
21     }
22
23     private static void initializeInventory(Inventory inventory){
24         inventory.addGuitar("V95693", 1499.95, "Fender", "Stratocastor", "electric", "Alder", "Alder");
25     }
26 }

运行结果:

为什么,明明有,为什么说没有?

检查了代码,可能搜寻中“fender”的f是小写,而我们有的“Fender”是大写。

好,我们对吉他搜索工具进行第一个改善,去除掉所有String比较:

项目修改架构:

Builder.java:

 1 package com.headfirst.guitar;
 2
 3 public enum Builder {
 4
 5     FENDER, MARTIN, GIBSON, COLLINGS, OLSON, RYAN, PRS, ANY;
 6
 7     public String toString(){
 8         switch(this){
 9         case FENDER:
10             return "Fender";
11         case MARTIN:
12             return "Martin";
13         case GIBSON:
14             return "Gibson";
15         case COLLINGS:
16             return "Collings";
17         case OLSON:
18             return "Olson";
19         case RYAN:
20             return "Ryan";
21         case PRS:
22             return "Prs";
23         case ANY:
24             return "Any";
25         default:
26             return "";
27         }
28     }
29 }

Type.java:

 1 package com.headfirst.guitar;
 2
 3 public enum Type {
 4     ACOUSTIC, ELECTRIC;
 5
 6     public String toString(){
 7         switch(this){
 8         case ACOUSTIC:
 9             return "acoustic";
10         case ELECTRIC:
11             return "electric";
12         default:
13             return "";
14         }
15     }
16 }

Wood.java:

 1 package com.headfirst.guitar;
 2
 3 public enum Wood {
 4     INDIAN_ROSEWOOD, BRAZILIAN_ROSEWOOD, ALDER;
 5
 6     public String toString(){
 7         switch(this){
 8         case INDIAN_ROSEWOOD:
 9             return "Indian Rosewood";
10         case BRAZILIAN_ROSEWOOD:
11             return "Brazilian Rosewood";
12         case ALDER:
13             return "Alder";
14         default:
15             return "";
16         }
17     }
18 }

修改FindGuitarTester.java第8行代码:

1 Guitar whatErinLikes = new Guitar("", 0, "Builder.FENDER", "Stratocastor", "Type.ELECTRIC", "Wood.ALDER", "Wood.ALDER");

修改Inventory.java中search()方法:

 1 public Guitar search(Guitar searchGuitar){
 2         for(Iterator i = guitars.iterator(); i.hasNext();){
 3             Guitar guitar = (Guitar) i.next();
 4
 5             if(searchGuitar.getBuilder() != guitar.getBuilder())
 6                     continue;
 7
 8             String model = searchGuitar.getModel().toLowerCase();
 9             if((model != null) && (!model.equals("")) &&
10                     (!model.equals(guitar.getModel().toLowerCase())))
11                     continue;
12
13             if(searchGuitar.getType() != guitar.getType())
14                     continue;
15
16             if(searchGuitar.getBackWood() != guitar.getBackWood())
17                     continue;
18
19             if(searchGuitar.getTopWood() != guitar.getTopWood())
20                     continue;
21
22             return guitar;
23         }
24
25         return null;
26     }

现在我们担心的是Model属性,我们没有把它做成enum,并且Model没有办法限制,所以做不出enum。

除此之外:我们修改的地方还有:

各种变量的类型,用enum的全部替换掉。

时间: 07-14

第一章.良好应用程序基石(2)的相关文章

第一章.良好应用程序基石(4)

上次,我们从Guitar类中分离出了GuitarSpec类,可以让用户通过GuitarSpec类来搜索心仪的吉他. 这次用户说了,卖吉他的时候,又多出了一个搜索方法,弦的个数,可以从1到12,我不管反正我就要这个搜索功能,你看着办吧! 上次的GuitarSpec类中,我们并没有提供用户弦的个数这个搜索功能,于是乎,我们在GuitarSpec类中加上一个变量numStrings来存储弦的个数: GuitarSpec.java更新: 这不算完,有没有想到在Inventory.java的search(

第一章.良好应用程序基石(3)

客户又通知我们,他的Guitars库中有很多相同属性的吉他,但是可能售价上不同. 现在,我们要实现的是,怎样返回库中能匹配所有属性的Guitar,并列出来. 更新Inventory.java中的search()方法: 1 public List search(Guitar searchGuitar){ 2 List matchingGuitars = new LinkedList(); 3 for(Iterator i = guitars.iterator(); i.hasNext();){ 4

第一章.良好应用程序基石(总结)

不会总结的程序员,不是好的程序员! 回头看,我们做了什么? 1.确认你的软件在做客户要它做的事 是的,我们做了让用户提供吉他属性,可以从Guitar库中搜索到心仪的吉他,之间出现了总是没有匹配到用户想要的吉他,导致吉他店差点倒闭.还好经过努力,我们把自己犯得错误纠正了!不然店长就和我们同归于尽了!太可怕了. 改正了大小写不匹配的错误,具体一点就是,把所有可以限制的吉他属性,通过枚举一一列出,想使用哪个,就调用哪个.不能限制的吉他属性,只好全部转为小写来匹配. 2.运用基本的OO原则来增加软件的灵

第一章.良好应用程序基石(1)

UML(Unified Modeling Language):统一建模语言 封装:将编程元素(programming elements)包含在较大.较抽象的实体内的过程,也被称为信息隐藏(information hiding)或关注点分离(separation of concerns) 继承:一个类继承来自另一个类的行为,如果需要,也可以改变该行为. 多态:与继承紧密相关.当一个类继承另一个类时,多态让子类能替代父类. 1 public Guitar getGuitar(String seria

大道至简第一章读后感 Java伪代码形式

观看了大道至简的第一章之后,从愚公移山的故事中我们可以抽象出一个项目, 下面用Java 伪代码的形式来进行编写: import java(愚公移山的故事) //愚公移山 public class yugong { //项目的目的:惩山北之塞,出入之迂: //项目的基本沟通方式:聚室而谋曰: //愚公确定的项目的目标:毕力平险,指通豫南,达于汉阴: //项目的技术方案:扣石垦壤,箕畚运于渤海之尾: //项目中的三名技术人员以及工程管理人员:(愚公)率子孙荷担者三夫: //力量较弱,富有激情的外援:

大道至简第一章读后感(java伪代码)

大道至简第一章用Java伪代码编写第一次写,难免有错误,欢迎指正和指导 //1 愚公移山public class yishan{public static void main(String[]args){while(山还在){扣石垦壤,箕畚运于渤海之尾:if(愚公死&&子孙存在)愚公=愚公儿子: //有子复焉,子又生孙,孙又生子else if(愚公死&&无子孙)//考虑没有子孙的情况break: }if(山平)System.out.println("山已平,指通豫

MVC 5 起航 - 第一章

本章将讲述一些构建ASP.NET  MVC 5 web application的一些基础知识, 通过本章学习,你应该能够掌握到构建MVC 5应用程序的基本步骤,并且通过展示一个完整的MVC 5 hello world应用程序了解MVC 5应用程序所带来的用户体验. 1. MVC 5 应用程序环境配置(参考本人机器配置) Win7 x64 Enterprise Visual Studio Express 2013 for Web or Visual Studio 2013 2. 创建一个简单的MV

《大道至简》第一章读后感及伪代码

在第一章中,作者通过<愚公移山>的寓言,引出了编程的根本:顺序.选择.循环."愚公移山"的工程虽然庞大,但是可以通过极其简单的方式来完成.并且在关于"会或者不会写程序的问题"时,作者给出了自己的看法:除了先天智障或后期懒惰者,都是会写程序的.后面用伪代码来呈现作者在第一章中提到的几个问题 import.java.大道至简.*; import.java.第一章.*; public class yishan{ public static void main(

日暮&middot;第一章&middot;决斗

日暮 第一章 决斗   泉州府,位于帝国的东南沿海,在数百年前,这里已是帝国最大的通商口岸之一,其一城之繁荣喧哗足以与异邦小国的都城相媲美,无数的人曾经来到这里,追逐财富,梦想,女人以及所有他们认为可以用自己一生去交换的东西,但如今,来自西夷的舰队横列在离泉州不足三十里的近海,一如傲慢的帝王,尽情地炫耀着武力:自东瀛跨海而来的僧侣,浪人肆无忌惮地横行在街巷之中,尽做着令人愤怒的肮脏勾当:还有来自西域的舞女,天竺的修业僧,波斯的商人--每个人的脸上都带着轻蔑讥讽的笑意,曾经的帝国,对于他们是如此的