代码之家  ›  专栏  ›  技术社区  ›  Michael Mao

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

  •  1
  • Michael Mao  · 技术社区  · 15 年前

    自从UNI以来,我已经用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";
        }
    }
    

    他们有相同的输出我看到“约翰史密斯”两次。

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

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

    4 回复  |  直到 15 年前
        1
  •  3
  •   hlovdal    15 年前

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

    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());
    }
    
        2
  •  2
  •   Greg Hewgill    15 年前

    您发布的第一个示例很好地将问题的不同部分划分为不同的方法。第二个例子,在 getAgentName 方法,将对 .getName() 以及决定在哪里输出( System.out.println )我可能更喜欢第一种样式,因为这给了调用者最大的灵活性来决定在哪里打印什么。

        3
  •  2
  •   rsp    15 年前

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

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

    另一方面,代理类是 getagentname() 方法,所以我会把它简化成 getName() 如上下文所示:

    System.out.println(getAgent().getName());
    
        4
  •  1
  •   Peter Lawrey    15 年前

    我建议你坚持你认为最简单最清楚的。别把事情弄得比我需要的复杂。不要增加复杂性,这会使事情变得更清楚。

    完美不是在没有什么可以补充的时候,而是在没有什么可以夺走安托万·德·圣埃克苏佩里的时候。

    我会一直把东西拿走,直到它不是做同样的事情,就是你失去了清晰。

    换一种说法,下面的方法做了同样的事情,你会添加什么来让这个更清楚?

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

    谢谢你@michael mao。