2014-01-24 27 views
1

我是Java新手,這是我正在閱讀的書中找到的一個示例。在此代碼中有幾件事我不明白。請幫助我理解它。瞭解java中的類和變量

/* 
* CalculatorModel 
* Encapsilates the data model used by the calculator Application 
*/ 

public class CalculatorModel{ 
    private double operand1; 
    private double operand2; 

    public void setOperand1(double value){ 
     operand1=value; 
    } 

    public void setOperand2(double value){ 
     operand2=value; 
    } 

    public double getOperand1(){ 
     return operand1; 
    } 

    public double getOperand2(){ 
     return operand2; 
    } 

    public String toString(){ 
     String s = "operand 1=" + operand1 + "operand 2=" + operand2; 
     return s; 
    } 
} 

/* 
* CalculatorHelper 
* A class that performs mathematical functions for a calculator program 
*/ 
public class CalculatorHelper{ 
    private CalculatorModel calcModel; 

    public CalculatorHelper(){ 
     calcModel=new CalculatorModel();  
    } 

    public void setOperand1(double value){ 
     calcModel.setOperand1(value); 
    } 

    public void setOperand2(double value){ 
     calcModel.setOperand2(value); 
    } 

    public double add(){ 
     return calcModel.getOperand1()+calcModel.getOperand2(); 
    } 

    public double subtract(){ 
     return calcModel.getOperand1()-calcModel.getOperand2(); 
    } 

    public double multiply(){ 
     return calcModel.getOperand1()*calcModel.getOperand2(); 
    } 

    public double divide(){ 
     return calcModel.getOperand1()/calcModel.getOperand2(); 
    } 
} 

請幫助我瞭解什麼是

private CalculatorModel calcModel; 

    public CalculatorHelper(){ 
     calcModel=new CalculatorModel();  
    } 

calculatorHelper類完成。是calcModel變量是CalculatorModel類型的變量嗎?將對象作爲數據類型而不是基本數據類型與變量相比有什麼區別?
如果calcModel是一個變量,那麼行calcModel = new CalculatorModel();

我不明白爲什麼重要的是要有兩個類CalculatorModelCalculatorHelper

什麼與方法

public void setOperand1(double value){ 
    calcModel.setOperand1(value); 
} 

在輔助類做的已經有一個setmethodCalculatorModel類。

這是我試過的,這個代碼有什麼問題?

public class Calculator{ 
    private double num1,num2; 
    public void setValue1(double value1){ 
     num1=value1;  
    } 

    public void setValue2(double value2){ 
     num2=value2;  
    } 

    public double getValue1(){ 
     return num1; 
    } 

    public double getValue2(){ 
     return num2; 
    } 

    public double add(){ 
     return getValue1()+getValue2(); 
    } 

    public double subtract(){ 
     return getValue1()-getValue2(); 
    } 

    public double multiply(){ 
     return getValue1()*getValue2(); 
    } 

    public double divide(){ 
     return getValue1()/getValue2(); 
    } 
} 
+3

那段代碼確實有點奇怪。這是我無法遵循的面向對象設計的嘗試。 – zapl

+0

這本書應該解釋它。如果沒有,你可以嘗試另一種(更友好)的書。 – Christian

+0

也許更好地解釋OOP是需要的:http://docs.oracle.com/javase/tutorial/java/concepts/object.html –

回答

3

「是什麼具有對象作爲比原始數據類型爲可變的數據類型區別?」

編程是關於數據的。您可以將類視爲複雜數據,將原語視爲簡單數據。假設你有班級School

public class School { 
} 

學校有什麼?它有學生。你不能用一種原始類型來代表一個學生,因爲它對學生來說只是一個無意義的東西,因爲學生是一個double,intboolean等。所以學生是另一種複雜的數據類型,就像學校一樣。因此,爲了使學生由學校包含的數據,你需要一個Student類也,可容納學生的姓名,地址,這樣

public class Student{ 
    String firstName; 
    String lastName; 
    String address; 
    int age; 

因此,要充分體現學生在學校是要被代表您使用有-一個關係,其中School有-一個Student

public class School { 
    Student student; 
} 

鑽研得更深,並一所學校只能有一個學生?不,它應該有很多學生。所以,你會表示爲具有Students

public class School { 
    Student[] students; 
} 

所以在數據方面的陣列School,你有這樣的數據樹現在

School 
    Student 
      firstName 
      lastName 
      address 
      age 
    Student 
      firstName 
      lastName 
      address 
      age 

這背後是面向對象編程的基本概念。當你將物體視爲實際的物體時,理解起來要容易得多。它使得理解這些關係變得更加容易。

+0

我覺得我坐在大學的OOP-1課程中:')。很好的解釋。 – Noe

0
private CalculatorModel calcModel; 

    public CalculatorHelper(){ 
    calcModel=new CalculatorModel();  
    } 
在calculatorHelper類有

。 CalcModel變量是一個變量,類型爲CalculatorModel ?將對象作爲 數據類型的對象與原始數據類型對象的差異是什麼?如果calcModel是一個 變量,那麼行calcModel = new CalculatorModel();

可變calcModel實例的CalculatorModel,但是一個類變量對類CalculatorHelper。如果您想了解基本數據類型與對象數據類型,請致電check this article out。此行calcModel=new CalculatorModel();初始化變量。你必須這樣做才能真正使用這些方法。 Read more here.

我不明白爲什麼有兩個班作爲 CalculatorModel和CalculatorHelper是很重要的。

有些情況下,當涉及到分離大塊邏輯時,輔助類/方法很有用。 Check this article out.

public void setOperand1(double value){ 
     calcModel.setOperand1(value); 
    } 
在輔助類的還有已經在CalculatorModel 類使用setMethod

是的,它調用的是相同的確切的設置方法,但從CalculatorHelper類。

這是我試過的,這個代碼有什麼問題?

代碼似乎沒有錯。我假設你正在從主要方法(或者你使用類的任何方法)正確使用它。

+0

我的代碼工作正常。我只需要知道是否可以編寫代碼而不是書中給出了什麼。 – clarkson

2
  1. 是的,你的假設calcModel是CalculatorModel類型的變量對象是正確的。當你說calcModel = new CalcModel();它實際上是在內存中創建另一個對象來存儲要存儲的數據(兩個操作數)並將該對象的地址存儲在calcModel中。這樣你可以引用你之前創建的對象。如果您之前使用過c,則可以輕鬆地說calcModel是一個指針,其中創建的對象是位於指針中的地址中的數據。

  2. 原始類型變量和對象類型變量之間的區別在於要存儲在變量中的實際數據要複雜得多。例如類CalculatorModel是兩個雙打的組合......您可以將兩個操作數作爲一個實體組合(封裝)在一個類中。一個對象也可能包含可以對存儲在其成員變量中的數據執行一些操作的方法。

  3. 沒有必要有兩個班,有些人喜歡這樣。我確信在這種情況下不需要創建兩個類。兩者都可以像你明顯做的那樣合併。請注意,沒有正確和錯誤的代碼編寫方式,因爲它們更受歡迎,並且避免了長期可讀性問題,所以採用某些方法更好。 setOperand1()方法只是使用calcModel.setOperand1(),所以我沒有看到這樣做的必要性,calcModel.setOperand1可以從setOperand1()被調用的地方直接調用。但是,在調用calcModel.setOperand1之前,可能會出現要隱藏setOperand1的哪個函數被調用或者要執行一些複雜操作的情況。在這種情況下,您希望通過創建的setOperand1()來減少calcModel.setOperand1的調用者的負擔。

  4. 代碼沒有問題。但是,您不必在添加,減除和其他數學運算中使用getValue1()& getValue2()函數。你可以簡單地說return num1+num2因爲,num1 & num2是同一類的成員變量。

0

這實際上是一個委託人模式,作者實施Calculator。計算器服務於真實計算器的抽象。

通過提供helper/delegate類,我分開了對象的行爲。我可以自由地使用助手類編寫自己的add/subtract實現。 Calculator將作爲您計算的模型。

考慮一下,如果您嘗試修改行爲,您需要更改整個Calculator類並將其分發給客戶端。但是,我不必修改計算器,只需修改客戶端/可能無法發送的幫助器。

沒有什麼錯在你做了什麼 - 但考慮到這一點 - 如果你想有計算器的單實例什麼 - 你可以使用輔助類(在這種情況下)控制instantion

0
private CalculatorModel calcModel; 

    public CalculatorHelper(){ 
    calcModel=new CalculatorModel();  
    } 

是在此使用的組合物來分開關注點。 CalculatorHelper的關注是知道如何做加法,減法,..而CalculatorModel知道值,如何提供給他們的外部和如何存儲他們。

CalculatorHelper has therefore an instance of CalculatorModel`它可以委託它不知道的所有東西。例如。

public void setOperand1(double value){ 
    calcModel.setOperand1(value); 
} 

整體設計仍值得懷疑。首先,這是對「計算器」的封裝,因爲沒有任何數學操作以任何方式反射回模型。需要有一個知道如何處理兩個以上操作數的第三類(CalculatorHelperHelper?)。

CalculatorModel是否一次有兩個值也是有問題的。兩個單獨的值對象會使IMO更有意義,並且會導致更多的模塊化代碼,這些代碼也會更容易理解爲對象的組合。

本示例的最後一點是,將「存儲」的值封裝到CalculatorModel中並沒有提供任何真正的好處。如果有某種數據庫後端或其他「複雜」的邏輯不屬於CalculatorHelper。我會在一個簡單的現實世界中採取或多或少的方法。你的代碼沒有錯。這只是一種不同的方法。

在本書的上下文中的代碼,並給出它是一個示例來顯示一些設計技術可以用於此目的。如果我要寫一個計算器,我會做很大的改變。另一方面,面向對象的設計不對或錯,人們可以爭論很多關於優秀設計的內容。