Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 面向对象的方法是什么?(或者你的方法?)_Java_Oop - Fatal编程技术网

Java 面向对象的方法是什么?(或者你的方法?)

Java 面向对象的方法是什么?(或者你的方法?),java,oop,Java,Oop,我在使用一些通用的OOP和Java方法时遇到了困难。有多种方法可以让类/对象相互通信。举一个简单的例子: 我需要对象A来执行动作X 对象A需要P、Q和R来执行该动作X 然后对象A将自己检索p、Q和R(在动作X中),或者这些值必须是动作X的参数吗?如果这些值可以重用,则将它们(或其中的一部分)作为参数传递。另外,将它们创建为X中的局部变量。这是一个太笼统的问题,无法具体回答。在某些情况下,任何一种方法都是好的。一些因素: 将P、Q和R作为参数传递,可以更容易地重用和测试(请参阅) 如果P、Q

我在使用一些通用的OOP和Java方法时遇到了困难。有多种方法可以让类/对象相互通信。举一个简单的例子:

  • 我需要对象A来执行动作X
  • 对象A需要P、Q和R来执行该动作X

然后对象A将自己检索p、Q和R(在动作X中),或者这些值必须是动作X的参数吗?

如果这些值可以重用,则将它们(或其中的一部分)作为参数传递。另外,将它们创建为X中的局部变量。

这是一个太笼统的问题,无法具体回答。在某些情况下,任何一种方法都是好的。一些因素:

  • 将P、Q和R作为参数传递,可以更容易地重用和测试(请参阅)
  • 如果P、Q和R不在A之外的任何地方使用,则可以使它们成为本地方法
  • 如果P、Q和R也用于A的其他方法,则它们可以成为成员

通过将p、Q和R设置为A的属性或将它们传递给X(取决于PQR是否是X特定的,或者A在其他情况下是否也需要它们),以某种方式将p、Q和R传递给A。

答案是这取决于

如果p、q和r与A的实例有一个强的有意义的链接,那么您可以考虑将它们添加为类A/<

public class A {

  private P p;
  private Q q;
  private R r;

  public A(P p, Q q, R r) {
    this.p = p;
    this.q = q;
    this.r = r;
  }

  public void x() {
    p.doSomething();
    q.doSomething();
    r.doSomething();
  }

}
如果p、Q和R不是,只是帮助动作X执行其任务的“一些值”,那么您可能希望将它们用作参数

public class A {

  public void x(P p, Q q, R r) {
    p.doSomething();
    q.doSomething();
    r.doSomething();
  }

}

第二个版本不维护任何状态,因此根据定义,它是线程安全的

方法1

class A{
  ctor(P, Q, R)
  {
  }
  void X()
  {
    P.SomeMethod();
    Q.SomeMethod();
    R.SomeMethod();
  }
}
方法2

class A{
  void X(P, Q, R)
  {
    P.SomeMethod();
    Q.SomeMethod();
    R.SomeMethod();
  }
}

类设计是软件设计的一个子集:所以这完全取决于

由于这个问题不太主观(每个人都有不同的方法),我只会说我使用这个方法,而不是说它是最好的。可能有很多不同的方法

public interface FuncX {

    public void actionX(FuncP p, FuncQ q, FuncR r);

}
并让类实现这个接口。如果这两个类很小但相关,我让它们实现这两个接口

它使每个实现都非常容易测试。要引导系统,main方法必须创建特定类的实例。例如,这可以配置

public class MyFuncX implements FuncX, FuncP {

    public void actionX(FuncP p, FuncQ q, FuncR r) {
        ...
    }

    public void actionP(...) {
        ...
    }

}

// the caller:
FuncX x = new MyFuncX(); // dependency
FuncQ q = ...;
FuncR r = ...;

x.actionX(x, q, r);

对我来说,这听起来像是一份工作

基本上,将对象p、Q和R传递到A中,然后在所有对象中执行特定的方法。当您需要多个对象来执行同一操作时,将使用此模式。所以,正如wiki上的例子所说,您基本上可以做如下事情:

graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);

graphic.print();

graphic.print()
将在每个椭圆对象内调用
print
方法。

在项目中,如果对象p、Q、R的值位于动作X内,则在动作本身内创建对象。相反,如果生存期不依赖于操作X,则将其作为参数传递。还要注意对象P、Q、R的范围。我建议您在设计类之前先了解关联、聚合、组合和依赖等概念。理解这些概念后,根据对象的范围和生命周期进行调用。

这是最方便的方法吗

您可以编写一个函数/方法来接受18个以上的参数,但这并不方便

如果执行操作A的方法总是得到相同的参数(并且您非常确定这不会改变),我不明白为什么需要通过参数传递它们

也就是说,我通常不遵守标准,也不知道其他OOP原教旨主义者(炒作大师)在这种情况下会做什么