我遇到一些普通的OOP& amp; Java方法。有许多方法可以让类/对象相互通信。举一个简单的例子:
那么对象A会自己检索P,Q和R(在动作X中),还是这些值必须是动作X的参数?
答案 0 :(得分:4)
这个问题太过普遍,无法具体回答。在某些情况下,这两种方法都可能是好的。一些因素:
答案 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原教旨主义者(炒作专家)会在这种情况下做些什么。