我遇到了一些通用OOP & Java方法的困难。有多种方式让类/对象相互通信。举个简单的例子:面向对象的方法是什么? (或你的方法?)
- 我需要一个对象执行操作X.
- 对象A需要P,Q和R执行此操作X.
然后将对象A检索P ,Q和R本身(在动作X内),还是这些值必须是动作X的参数?
我遇到了一些通用OOP & Java方法的困难。有多种方式让类/对象相互通信。举个简单的例子:面向对象的方法是什么? (或你的方法?)
然后将对象A检索P ,Q和R本身(在动作X内),还是这些值必须是动作X的参数?
如果这些值可以重复使用,则将它们(或其中的一部分)作为参数传递。另外,将它们创建为X内部的局部变量。
这太笼统了,需要具体回答一个问题。在某些情况下,这两种方法都可以很好。一些因素:
通行证P,Q和R所述的以某种方式,或者通过将其设置为A的属性或者通过将它们传递给X(取决于PQR是否是X特定的,或者如果它们在其他情况下也可能需要它们)。
答案是,它取决于。
如果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();
}
}
第二个版本不保留任何状态,所以它是定义线程安全
方法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);
}
然后让类实现这个接口。如果两个类很小但相关,我让他们实现这两个接口。
它使每个实现非常容易测试。为了引导系统,主要方法必须创建特定类的实例。例如,这可以是可配置的。
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);
这听起来像我的工作Composite Pattern。
你基本上将对象P,Q和R传递给A,然后在它们中执行某种方法。当您需要几个对象来执行相同的操作时使用此模式。所以,例如在维基说,你基本上做一些事情,因为这:
graphic1.add(ellipse1);
graphic1.add(ellipse2);
graphic1.add(ellipse3);
graphic.print();
和graphic.print();
会打电话内的每个椭圆对象print
方法。
在您的项目中,如果对象P,Q,R的lifetime位于动作X内,则在动作本身内创建对象。相反,如果生命周期不依赖于动作X,则将其作为参数传递。还要照顾对象P,Q,R的范围。我建议你在设计课程之前先通过关联,聚合,构图和依赖等概念。在理解这些概念后,根据对象的范围和生命周期进行调用。
使它成为最方便的方式吗?
您可以编写一个函数/方法来接受18+个参数,但这并不方便。
如果要做动作A的方法总是得到相同的参数(并且你确信这不会改变),我不明白你为什么需要它们通过参数传递。这就是说,我通常不会遵守标准,也不知道在这种情况下其他OOP原教旨主义者(炒作大师)会做什么。