Вложенные методы против "пайпед", что лучше? - PullRequest
1 голос
/ 13 марта 2010

Начиная с 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 ]

3 голосов
/ 13 марта 2010

Я бы порекомендовал против последнего стиля, так как он смешивает поиск данных с «бизнес-логикой» (то есть, что делать с данными). При первом подходе вы сохраняете высокую степень свободы в том, что вы хотите делать с данными, например,

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 голосов
/ 13 марта 2010

Я предпочитаю первый стиль, так как он поддерживает детали реализации ближе к объекту, который за них отвечает. Второй стиль имеет тенденцию создавать больше «служебных методов», принимающих объекты для воздействия, но которые не включают объекты класса, в котором они находятся, для выполнения своей функции.

Вашему тестовому классу не нужно знать, где класс агента определил свой метод getAgentName, введение метода getAgentName() в тестовом классе добавляет ненужную сложность вашей кодовой базе, и будущие сопровождающие должны проверять дополнительный метод, когда работая с ним.

С другой стороны, класс агента является контекстом метода getAgentName(), поэтому я бы упростил его до getName(), поскольку контекст ясен в:

System.out.println(getAgent().getName());
2 голосов
/ 13 марта 2010

Первый пример, который вы опубликовали, прекрасно разделяет разные части проблемы на разные методы. Второй пример, в методе getAgentName, объединяет как вызов .getName(), так и решение о том, куда выводить (System.out.println). Я бы, вероятно, предпочел бы первый стиль, так как это дает вызывающему абоненту большую гибкость в выборе того, что и где печатать.

1 голос
/ 13 марта 2010

Я предлагаю вам придерживаться того, что вы считаете самым простым и ясным. Не усложняй мне дела. Не добавляйте сложность, которая не проясняет ситуацию.

«Совершенство достигается совершенством не тогда, когда нечего добавить, а когда нечего убрать» - Антуан де Сент-Экзюпери

Я бы продолжал забирать вещи, пока они не сделают то же самое, или вы не потеряете ясность.

Поставь другой путь; следующее делает то же самое, что бы вы добавили, чтобы сделать это понятнее?

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

Спасибо @Майкл Мао.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...