2010-06-03 59 views
5

我遇到了一些通用OOP & Java方法的困难。有多种方式让类/对象相互通信。举个简单的例子:面向对象的方法是什么? (或你的方法?)

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

然后将对象A检索P ,Q和R本身(在动作X内),还是这些值必须是动作X的参数?

回答

0

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

4

这太笼统了,需要具体回答一个问题。在某些情况下,这两种方法都可以很好。一些因素:

  • 通过P,Q和R作为参数使得重新使用更容易和试验(见Dependency Injection
  • 如果P,Q和R,不使用任何其它地方外,它们可以由方法本地
  • 如果P,Q和R中也A的其他方法中使用,它们可以由成员
0

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

0

答案是,它取决于。

如果P,Q和R有一个强大的,有意义的链接到的实例,那么你可以考虑将其添加为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(); 
    } 

} 

第二个版本不保留任何状态,所以它是定义线程安全

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

类设计软件设计的一个子集:所以这一切取决于。由于这个问题很少主观(每个人都有不同的方法),我只会说我使用这种方法,并不是说它是最好的。可能有很多不同的方法。

public interface FuncX { 

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

} 

然后让类实现这个接口。如果两个类很小但相关,我让他们实现这两个接口。

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

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

这听起来像我的工作Composite Pattern

你基本上将对象P,Q和R传递给A,然后在它们中执行某种方法。当您需要几个对象来执行相同的操作时使用此模式。所以,例如在维基说,你基本上做一些事情,因为这:

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

graphic.print(); 

graphic.print();会打电话内的每个椭圆对象print方法。

0

在您的项目中,如果对象P,Q,R的lifetime位于动作X内,则在动作本身内创建对象。相反,如果生命周期不依赖于动作X,则将其作为参数传递。还要照顾对象P,Q,R的范围。我建议你在设计课程之前先通过关联,聚合,构图和依赖等概念。在理解这些概念后,根据对象的范围和生命周期进行调用。

0

使它成为最方便的方式吗?

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

如果要做动作A的方法总是得到相同的参数(并且你确信这不会改变),我不明白你为什么需要它们通过参数传递。这就是说,我通常不会遵守标准,也不知道在这种情况下其他OOP原教旨主义者(炒作大师)会做什么。

相关问题