嵌套方法vs“管道”方法哪个更好?

时间:2010-03-13 06:59:00

标签: java

自从大学以来,我已经用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”两次输出相同。

我想知道,如果这样做的一种方式比另一种方式具有更好的性能或其他优势。我个人更喜欢后者,因为对于嵌套方法,我当然可以先知道哪个开始,哪个开始。

上面的代码只是一个示例,我现在使用的代码要复杂得多,有点像迷宫......所以在这两种样式之间切换通常会立刻引起我的注意。

4 个答案:

答案 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。