2014-01-24 25 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。我会在一个简单的现实世界中采取或多或少的方法。你的代码没有错。这只是一种不同的方法。

在本书的上下文中的代码,并给出它是一个示例来显示一些设计技术可以用于此目的。如果我要写一个计算器,我会做很大的改变。另一方面,面向对象的设计不对或错,人们可以争论很多关于优秀设计的内容。