自从大学以来,我已经用Java编程了3年,虽然我还没有完全致力于这种语言,但是我已经花了很长时间。我理解这两种方式,只是好奇你喜欢哪种风格。
请关注主要方法 - 这是我最关心的部分。
public class Test
{
public static void main(String[] args)
{
System.out.println(getAgent().getAgentName());
}
private static Agent getAgent()
{
return new Agent();
}
}
class Agent
{
private String getAgentName()
{
return "John Smith";
}
}
我对嵌套方法调用非常满意,如下面的
public class Test
{
public static void main(String[] args)
{
System.out.println(getAgentName(getAgent()));
}
private static String getAgentName(Agent agent)
{
return agent.getName();
}
private static Agent getAgent()
{
return new Agent();
}
}
class Agent
{
public String getName()
{
return "John Smith";
}
}
我看到“John Smith”两次输出相同。
我想知道,如果这样做的一种方式比另一种方式具有更好的性能或其他优势。我个人更喜欢后者,因为对于嵌套方法,我当然可以先知道哪个开始,哪个开始。
上面的代码只是一个示例,我现在使用的代码要复杂得多,有点像迷宫......所以在这两种样式之间切换通常会立刻引起我的注意。
答案 0 :(得分:3)
我建议不要使用后一种风格,因为它将数据检索与“业务逻辑”(即如何处理数据)混合在一起。 使用第一种方法,您可以保持对数据的高度自由,例如
public static void main(String[] args)
{
System.out.println(getAgent().getAgentName());
System.err.println(getAgent().getAgentName());
someTextArea.append("The agent name is: " + getAgent().getAgentName());
// etc
}
如果您选择以这种方式执行操作,至少将名称明确描述已完成内容的函数命名为,例如
private static void getAgentNameAndPrintIt(Agent agent)
{
System.out.println(agent.getName());
}
答案 1 :(得分:2)
您发布的第一个示例很好地将问题的不同部分分成不同的方法。第二个示例在getAgentName
方法中,将对.getName()
的调用与输出(System.out.println
)的决定混为一谈。我可能更喜欢第一种风格,因为这样可以让调用者最灵活地决定在哪里打印。
答案 2 :(得分:2)
我更喜欢第一种风格,因为它使实现细节更接近负责它们的对象。第二种风格倾向于创造更多“实用方法”,让对象采取行动,但不涉及他们所在类的对象来执行其功能。
您的测试类不需要知道代理类定义其getAgentName
方法的位置,在测试类中引入getAgentName()
方法会给代码库增加不必要的复杂性,未来的维护者需要检查使用它时的额外方法。
另一方面,代理类是getAgentName()
方法的上下文,因此我会将其简化为getName()
,因为上下文已明确:
System.out.println(getAgent().getName());
答案 3 :(得分:1)
我建议你坚持你认为最简单,最清晰的东西。不要让事情变得比他们需要的更复杂。不要增加使事情变得更清晰的复杂性。
“没有什么可以补充的,但是当没有什么东西可以带走时,完美就达到了完美” - Antoine de Saint-Exupery我会继续拿走东西,直到它要么不做同样的事情,要么你失去清晰度。
换句话说;以下是相同的事情,你会添加什么来使这个更清楚?
class Test{public static void main(String[]args){System.out.println("John Smith");}}
谢谢@Michael Mao。