Почему «приватные» методы в объектно-ориентированном виде? - PullRequest
44 голосов
/ 12 апреля 2010

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

Но как это можно применить к методам?

Ответы [ 7 ]

97 голосов
/ 12 апреля 2010

Множество хороших ответов, но, может быть, еще один от программиста-самоучки на Java, когда я сам прошел через все это с большой болью;)

Думайте о Классе как о чем-то, что видно снаружи, а не как о чем-то, что вы видите внутри . Если вы смотрите на класс со стороны, что вы видите?

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

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

Но мы, как конструкторы этих часов, знаем, что перед любой временной операцией мы должны переключаться с 23 на 11 на нашем дисплее (это такие часы), поэтому мы должны немного переставить вещи для этого. Переключение с 23 на 11 прекрасно работает для нас в обоих случаях - установка часов и отображение текущего времени - но мы делаем это «на стороне» , поскольку пользователю не нужно знать обо всем этом сложная математика. Это частные методы!

Таким образом, наш класс Clock может иметь два открытых метода (showTime и setTime), которые пользователь хочет увидеть. и закрытый метод (recountTime), который обеспечивает функциональность для этих открытых методов и является тем, что пользователь не хочет видеть.

Итак, с одной стороны, вы должны иметь в виду, что private - это то, что не будет переопределено и доступно будущим программистам , использующим ваш код (как указано в ответах выше). Но приватный также означает что-то сделанное на стороне, поэтому пользователь не видит его . Вот почему мы называем публичные методы публичный интерфейс - это все, что пользователь увидит снаружи.

Для меня полезно (я самоучка, поэтому, возможно, это не очень популярная методология ...) записывать все, что пользователи (реальные пользователи и другие классы) будут делать с моим классом (общедоступный интерфейс с только сигнатуры открытых методов), а затем написать сигнатуры закрытых методов, которые I-the-Implementer будет использовать для достижения публичных целей, которые обещали предоставить моим пользователям, а затем просто выполнить их с помощью кода.

Может быть полезно иметь в виду, что старое правило C все еще действует (как было выражено в 97 вещей, которые должен знать каждый программист ): функция / метод должен быть длиной всего в несколько строк, действительно!!

27 голосов
/ 12 апреля 2010

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

9 голосов
/ 12 апреля 2010

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

6 голосов
/ 12 апреля 2010

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

3 голосов
/ 12 апреля 2010

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

Просто пример, чтобы показать, как его можно использовать:

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

В этом случае у часов будет собственный метод для настройки времени.

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

3 голосов
/ 12 апреля 2010

Методы, которые являются закрытыми, могут вызываться только методами в пределах одного и того же класса или в пределах одного и того же «модуля». Методы обычно не делаются частными; обычно они сделаны защищенными, чтобы их могли вызывать дети, или общедоступными, чтобы их мог вызывать другой код.

1 голос
/ 13 апреля 2010

Имея в виду все остальные ответы. Стоит помнить, что закрытый метод - это всего лишь совет для программиста на многих языках. В большинстве случаев все еще возможно использовать закрытый метод. Например, путем создания объекта, который наследуется от объекта с помощью закрытого метода и переопределяет его метод новым открытым методом.

В некоторых современных высоко объектно-ориентированных языках частные методы существуют только по соглашению. Метод с '_' в начале считается закрытым.

...