Java 嵌套方法vs";管道;方法,哪个更好?

Java 嵌套方法vs";管道;方法,哪个更好?,java,Java,自从上大学以来,我已经用Java编程3年了,虽然我并没有完全致力于这门语言,但我还是在这门语言上花了相当长的时间。我两方面都懂,只是好奇你喜欢哪种风格 请关注主要方法-这是我最关心的部分 public class Test { public static void main(String[] args) { System.out.println(getAgent().getAgentName()); } private static Agent

自从上大学以来,我已经用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";
    }
}
他们有相同的输出我看过两遍《约翰·史密斯》

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


上面的代码只是一个示例,我现在使用的代码要复杂得多,有点像迷宫。。。因此,在这两种风格之间切换常常会让我感到震惊。

我建议你坚持你认为最简单、最清晰的风格。别把事情弄得太复杂了。不要增加不能使事情更清楚的复杂性

“完美不是当没有什么可以补充的时候,而是当没有什么可以带走的时候”——安托万·德·圣埃克苏佩里

我会一直把东西拿走,直到它不能做同样的事情,或者你失去清晰度

换言之;下面做了同样的事情,你会添加什么来让这更清楚

class Test{public static void main(String[]args){System.out.println("John Smith");}} 

谢谢你@Michael Mao。

我建议你坚持你认为最简单、最清晰的方法。别把事情弄得太复杂了。不要增加不能使事情更清楚的复杂性

“完美不是当没有什么可以补充的时候,而是当没有什么可以带走的时候”——安托万·德·圣埃克苏佩里

我会一直把东西拿走,直到它不能做同样的事情,或者你失去清晰度

换言之;下面做了同样的事情,你会添加什么来让这更清楚

class Test{public static void main(String[]args){System.out.println("John Smith");}} 

谢谢@Michael Mao。

您发布的第一个示例很好地将问题的不同部分划分为不同的方法。第二个示例,在
getAgentName
方法中,将对
.getName()
的调用和输出位置的决定(
System.out.println
)合并在一起。我可能更喜欢第一种样式,因为这使调用者能够最灵活地决定在哪里打印什么。

您发布的第一个示例将问题的不同部分很好地划分为不同的方法。第二个示例,在
getAgentName
方法中,将对
.getName()
的调用和输出位置的决定(
System.out.println
)合并在一起。我可能更喜欢第一种样式,因为这使调用者能够最灵活地决定在何处打印内容。

我建议不要使用后一种样式,因为它将数据检索与“业务逻辑”(即如何处理数据)相混合。 使用第一种方法,您可以在处理数据时保持高度的自由度,例如

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

我建议不要使用后一种方式,因为它将数据检索与“业务逻辑”(即如何处理数据)混合在一起。 使用第一种方法,您可以在处理数据时保持高度的自由度,例如

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

我更喜欢第一种样式,因为它使实现细节更接近负责它们的对象。第二种风格倾向于创建更多的“实用方法”,将对象作为操作对象,但不涉及它们所属类的对象来执行其功能

您的测试类不需要知道代理类在哪里定义了它的
getAgentName
方法,在测试类中引入
getAgentName()
方法会给您的代码库增加不必要的复杂性,未来的维护人员在使用它时需要检查额外的方法

另一方面,代理类是
getAgentName()
方法的上下文,因此我将把它简化为
getName()
,因为上下文在:

System.out.println(getAgent().getName());

我更喜欢第一种样式,因为它使实现细节更接近负责它们的对象。第二种风格倾向于创建更多的“实用方法”,将对象作为操作对象,但不涉及它们所属类的对象来执行其功能

您的测试类不需要知道代理类在哪里定义了它的
getAgentName
方法,在测试类中引入
getAgentName()
方法会给您的代码库增加不必要的复杂性,未来的维护人员在使用它时需要检查额外的方法

另一方面,代理类是
getAgentName()
方法的上下文,因此我将把它简化为
getName()
,因为上下文在:

System.out.println(getAgent().getName());

那是一个。。。有趣的大括号样式…@Greg:我不知道大括号样式,现在就用谷歌搜索一下好吗。@Michael Mao:如果你找不到任何东西,请参阅“Java编程语言的代码约定”,特别是第6.4节:@Greg:哦,你是指缩进样式,啊,我通常会匹配大括号,但我在这里发布时出错了。。。好的,完成了,现在好多了。我找不到任何理由在#2中引入额外的方法,所以我不建议使用它。此外,这种风格会使你的代码更难重构和维护。。。有趣的大括号样式…@Greg:我不知道大括号样式,现在就用谷歌搜索一下好吗。@Michael Mao:如果你找不到任何东西,请参阅“Java编程语言的代码约定”,特别是第6.4节:@Greg:哦,你是指缩进样式,啊,我通常是