OOP方法是什么? (或你的方法?)

时间:2010-06-03 10:10:34

标签: java oop

我遇到一些普通的OOP& amp; Java方法。有许多方法可以让类/对象相互通信。举一个简单的例子:

  • 我需要对象A来执行操作X.
  • 对象A需要P,Q和R来执行此操作X。

那么对象A会自己检索P,Q和R(在动作X中),还是这些值必须是动作X的参数?

9 个答案:

答案 0 :(得分:4)

这个问题太过普遍,无法具体回答。在某些情况下,这两种方法都可能是好的。一些因素:

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

答案是,这取决于。

如果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();
  }

}

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

答案 4 :(得分:0)

方法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();
  }
}

答案 5 :(得分:0)

类设计是软件设计的一个子集:所以这一切都取决于。

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

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);

答案 6 :(得分:0)

听起来像Composite Pattern的工作。

您基本上将对象P,Q和R传递给A,然后在所有对象中执行某些方法。当您需要多个对象来执行相同的操作时,将使用此模式。所以,正如wiki所说的那样,你基本上可以这样做:

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

graphic.print();

graphic.print();会在每个椭圆对象中调用print方法。

答案 7 :(得分:0)

在项目中,如果对象P,Q,R的lifetime位于动作X内,则在动作本身内创建对象。相反,如果生命周期不依赖于动作X,则将其作为参数传递。还要注意对象P,Q,R的范围。我建议你在设计一个类之前先阅读Association,Aggregation,Composition和Dependency等概念。在理解了这些概念之后,根据对象的范围和生命周期进行调用。

答案 8 :(得分:0)

让它成为最便捷的方式吗?

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

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

那就是说,我通常不会坚持标准,也不知道其他OOP原教旨主义者(炒作专家)会在这种情况下做些什么。