Частные методы над публичными методами - PullRequest
27 голосов
/ 13 октября 2011

Я изучал класс StringTokenizer.java, и мне в голову пришло несколько вопросов.

Я заметил, что открытые методы, которые должны использоваться другими классами, вызывали некоторый закрытый метод, который выполнял всю работу.Теперь я знаю, что один из принципов OOD - сделать как можно больше личных данных и скрыть все детали реализации.Я не уверен, что полностью понимаю логику этого.

Я понимаю, что важно сделать поля закрытыми, чтобы в них не хранились недопустимые значения (только одна из многих причин).Однако, когда дело доходит до частных методов, я не уверен, почему они так важны.

Например, в случае класса StringTokenizer не могли бы мы просто поместить весь код реализации в публичные методы?Как это изменило бы классы, которые используют эти методы, так как API для этих методов (то есть правила для вызова этих открытых методов) останется прежним?Единственная причина, по которой я мог подумать о том, почему частные методы полезны, это то, что они помогают вам писать дубликаты кода.Например, если все публичные методы делали одно и то же, вы можете объявить закрытый метод, который выполняет эту задачу и который может использоваться публичными методами.

Другой вопрос: в чем преимущество написания реализации в приватном методе по сравнению с публичным методом?

Вот небольшой пример:

public class Sum{

    private int sum(int a, int b){
        return a+b;
    }

    public int getSum(int a, int b){
        return sum(a,b);
    }
}

Vs...

public class Sum{

    public int getSum(int a, int b){
        return a+b;
    }
}

Чем выгоднее первый образец?

Ответы [ 7 ]

31 голосов
/ 13 октября 2011

Чтобы что-то добавить, ВСЕГДА можно безопасно изменить приватный метод, потому что вы точно знаете, что он вызывается только из собственного класса, никакие внешние классы не могут вызывать приватный метод (они даже не видят его) ).

Так что иметь закрытый метод всегда хорошо, так как вы знаете, что нет проблем с его изменением, даже если вы можете безопасно добавить больше параметров в метод.

Теперь подумайте о публичном методе, любой может вызвать этот метод, поэтому, если вы добавите / удалите параметр, вам нужно будет также изменить ВСЕ вызовы этого метода.

2 голосов
/ 13 октября 2011

Единственная причина, по которой я мог подумать о том, почему частные методы полезны, заключается в том, что он помогает вам писать дублирующийся код.

В дополнение к консолидации дублирующегося кода (часто выражается как "Дон"«Повторите сами» или «СУХОЙ»), использование частных методов также может помочь вам структурировать и документировать ваш код.Если вы обнаружите, что пишете метод, который делает несколько вещей, вы можете разделить его на несколько частных методов.Это может прояснить, каковы входы и выходы для каждого элемента логики (с более высокой степенью детализации).Кроме того, описательные имена методов могут помочь дополнить документацию кода.

1 голос
/ 10 июня 2016

Целью объявления метода private является

  • скрытие подробностей реализации
  • исключение метода из списка в качестве открытого API
  • , чтобы убедиться в логикекод не используется / неправильно используется внешне
  • большую часть времени выполнение вашего метода зависит от других методов, выполняемых перед ним;тогда вы также можете быть уверены, что управляете правильной последовательностью использования вашего метода

Используйте private для ваших методов, если только вы не собираетесь безопасно использовать ваш метод вне контекста вашего класса.

1 голос
/ 13 октября 2011

Публичные методы, как правило, представляют собой код, который другие классы, которые реализуют этот класс, захотят использовать. Закрытые методы, как правило, не так полезны за пределами класса, или не (в одиночку) служат целям того, для чего предназначен класс.

Скажем, вы в выбранной вами IDE и реализуете некоторый класс A. Класс A предназначен только для одной вещи, например, для генерации документов. Естественно, у вас будут некоторые математические и байтовые методы работы в классе A, которые необходимы для создания документа, но людям, пытающимся использовать класс A, эти другие методы не понадобятся, потому что они просто хотят документ. Поэтому мы делаем эти методы приватными, чтобы все было просто для будущих пользователей нашего класса.

1 голос
/ 13 октября 2011

При написании чистого кода на Java или любом другом объектно-ориентированном языке, как правило, самый чистый и читаемый код состоит из коротких лаконичных методов.Часто оказывается, что логика внутри метода может быть лучше выражена в отдельных вызовах методов, чтобы сделать код более чистым и более понятным.

Имея это в виду, мы можем представить себе ситуации, когда у вас есть много методов, выполняющих задачи,одна цель.Подумайте о классе, который имеет только одну сложную цель.Точка входа для этой единственной цели может потребовать только одну отправную точку (один открытый метод), но много других методов, которые являются частью сложной операции (многие частные методы помощи).

С помощью частных методов мы можем скрытьлогика, которая недоступна и не должна быть доступна нигде вне самого класса.

0 голосов
/ 05 февраля 2013

Преимущество, а также веская причина использовать закрытые методы внутри публичных классов для безопасности и предотвращения ошибок. Методы, которые объявлены как частные, доступны только классу, частью которого они являются. Это означает, что ваш приватный метод не может быть вызван случайно из другого места, где в рамках программы устраняются ошибки и другие сложности. Если вы объявите свой метод как общедоступный, он может быть доступен для всей проблемы и может вызвать осложнения.

У вас может быть несколько методов, которые работают с определенным фрагментом данных, и вы не хотите, чтобы какая-либо другая часть программы могла ему мешать. Использование инкапсуляции данных с помощью закрытых методов и / или переменных помогает предотвратить это, а также упрощает отслеживание и документирование кода.

0 голосов
/ 13 октября 2011

Создание частных функций дает вам преимущество в следующих случаях:

  1. Создание частных функций дает JVM-компилятору возможность встроить функцию и, следовательно, повысить производительность приложения
  2. Если класснаследуется, и вы расширяете его из дочернего класса, тогда, если вы хотите скрыть функции от дочернего класса, вы можете сделать это (вы можете расширить StringTokenizer).
  3. Если фрагмент кода должен бытьиспользуется в нескольких функциях, когда вы перемещаете этот код в метод приватной утилиты
...