Метод и функция в чем разница
Перейти к содержимому

Метод и функция в чем разница

В чем разница между функцией и методом?

Я слышал, что методы более объектно-ориентированные, чем функции. Мне было интересно, может ли кто-нибудь показать мне пример функции и метода и объяснить различия между методами и функциями?

Я занял 3 четверти Java-программирования, и функции никогда не упоминались, я хочу знать различия, сильные и слабые стороны.

4 ответа

Говоря строго, procedure — это подпрограмма, которая выполняется исключительно для ее побочных эффектов (например, что-то печатает на экране) и возвращает нет значений. A function — это подпрограмма, которая всегда возвращает одно и то же значение при одинаковых входах и не имеет побочных эффектов. A method — это процедура или функция, связанная с классом или объектом.

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

В Java, например, procedure создается с помощью void возвращаемый тип метода. A function — это метод с возвращаемым типом и без побочных эффектов, например:

Люди, чей опыт программирования на языке, подобном Java, часто даже не понимают, что есть разница, потому что в Java это обычно не имеет значения в практическом смысле. В контексте только для Java программисты часто ссылаются на any подпрограмму как function , даже теми, кто знает разница, и они в основном не исправлены, за исключением самого педантичного.

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

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

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

В Java нет никаких функций. Все, что у вас есть, это методы. Для имитации функций Java обычно использует статические методы (как в java.lang.Math ).

Существует множество объектно-ориентированных языков, которые предоставляют автономные функции: среди них Python, Ruby, JavaScript, C ++, Object Pascal и даже (yuck) PHP. Это хорошая причина.

Метод — это в основном функция с одним дополнительным параметром (невидимым в Java). Вы ссылаетесь на него как this . Эта функция this позволяет вам получить доступ к объекту, метод которого вызывается, поэтому вы можете думать, что весь объект всегда является неявным параметром для метод, дополнительно к параметрам, которые вы обычно определяете.

Метод имеет смысл, если он использует свой объект: вызывает другие методы и /или обращается к членам данных. Например, список может иметь метод getLength() , который знает, как рассчитать длину списка, например. путем сканирования каждого члена. Он явно использует неявный this объект, то есть список. Вот почему он не нуждается в явных параметрах.

Else, достаточно функции. Например, для вычисления косинуса угла вам нужен только угол, и никакое другое состояние, поэтому cos(float angle) может быть функцией и зависит только от явного параметра angle .

Еще одна важная вещь — метод переопределять . (Для моего мин, это сомнительная практика, но Java использует ее очень широко.) Вы объявляете определенный класс (назовите его Z ) a подкласс другого класса (назовите его A ) и измените реализацию some его методов (предположим, что мы переопределим метод foo() ).

Подкласс работает как базовый класс (говорят, что предоставляет тот же интерфейс ), но делает это разными способами. Согласно принципе подписи Лискова , вы можете объявить переменную типа A , назначьте ему экземпляр типа Z и вызовите метод foo() ; то вызывается Z реализация foo() , а не A . То есть метод вызова будет проверяться во время выполнения, основываясь на фактическом типе объекта. Это известно как «отправка динамического метода» или «виртуальные методы».

Какое переопределение метода автоматически автоматически не просто подражать с функциями. (С функциями подобные вещи обычно выполняются с помощью «обратных вызовов» или «функций более высокого порядка»).

В некоторых языках, таких как Java и C #, вы можете определить «статические методы», которые не получают параметр this . Они работают точно так же, как «автономные» функции и используют класс как пространство имен. Такое пространство имен иногда может иметь смысл, когда статический метод класса используется для поиска или создания новых экземпляров этого класса.

Надеюсь, теперь у вас будет лучшая картина.

Нет никаких реальных различий между методами, функциями и процедурами, они все те же зверь: подпрограмма, часть программы, часто называемая для выполнения конкретной задачи.

Метод — это просто функция с помощью другого имени.

Даже java имеет функции: в «a + b» оператор «+» является функцией. Даже если это будет другое имя.

Представьте, что вы создадите новый язык: JavaBlub, который является дословно копией Java, за исключением одного: у него нет методов, у него есть blubzorz. И blubzorz в JavaBlub делают то же самое, что и методы на Java.

Не могли бы вы серьезно относиться ко мне, когда я надену прямое лицо и скажу: JavaBlub отличается от Java, потому что он не использует методы?

По-моему, в Java нет functions . Все, что у нас есть:

  1. Методы объекта
  2. Методы класса (статические)

Функции, как автономные функции, не существуют в Java.

Я хотел бы поддержать мой краткий и категоричный ответ, ссылаясь на Официальную веб-страницу Java

Программные объекты концептуально похожи на объекты реального мира: они также состоят из состояния и связанного с ним поведения. Объект сохраняет свое состояние в полях (переменные в некоторых языках программирования) и раскрывает его поведение с помощью методов (функций на некоторых языках программирования) . Методы работают с внутренним состоянием объекта и служат в качестве основного механизма коммуникации между объектами. Скрытие внутреннего состояния и требование о том, чтобы все взаимодействия выполнялись с помощью методов объекта, известно как инкапсуляция данных — фундаментальный принцип объектно-ориентированного программирования.

Вот ссылка (В случае, если кто-то хочет начать с концепций Java, прежде чем начать с чистого языка)

Я думаю, мы часто вызываем функции в методы нечетко. В моем случае это вопрос наследия. Мои firt langauges были C и Visual Basic. Я хотел бы разработать алгоритм с схемами потока , где процессы (на диаграмме) часто вызывались (моим учителем) functions или /EM>. Поэтому я часто нахожусь на работе, говоря function вместо методов .

Когда я начинал с Java (10 лет назад), мой учитель попытался пометить методы в 2 группах:

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

Консультанты — это те, которые не вызывают изменений в объекте (атрибутах) или классе (статические атрибуты)

В то время я нашел такую ​​каталогизацию очень полезной при разработке времени. В целом, потому что эти условия были мне знакомы, потому что C и V.B.

Несколько лет спустя, и после стольких плохих практик и бесчисленных строк кода «hilarius» я не посмел бы предложить такую ​​маркировку.

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

Метод и функция в чем разница

Классы может иметь некоторое поведение, то есть определять некоторые действия с помощью методов . Метод представляет функцию, которая ассоциирована с определенным типом.

В различие от типа методов их определение может отличаться. В данном случае мы пока рассмотрим методы объектов. В общем случае они определяются в следующем виде:

Вначале идет ключевое слово member . Далее идет ключевое слово this . Оно указывает, что этот метод определяет поведение объекта и его можно вызвать через имя объекта. После this через точку указывается собственно имя метода.

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

Например, определим простейший метод:

Здесь метод называется SayHi . Он имеет только один параметр — значение unit (то есть фактически не имеет параметров). Все, что делает этот метод, это выводит на консоль строку с приветствием «Hi».

Имея объект данного типа, через имя объекта мы можем обратиться к методу. Для обращения к методу объекта сначала идет имя объекта (в примере выше — «tom») и через точку указывает имя вызываемого метода:

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

В итоге при выполнении данной программы на консоль будет выведена строка «Hi».

Стоит отметить, что обычно названия методов начинаются с большой буквы.

Также стоит отметить, что через this мы можем обращаться к функционалу объекта внутри класса. Здесь же мы никак this не используем, поэтому вместо него можно использовать прочерк:

Обращение к параметрам первичного конструктора

Методы объектов имеют доступ к параметрам первичным конструкторов. Например, задействуем значения параметров в методах:

Консольный вывод программы:

Методы с параметрами и получение результата

Дополнительно рассмотрим случаи определения методов, которые получают параметры и возвращают результат:

Здесь метод GetInfo() возвращает строку с общей информацией об объекте:

Ко всем методам объекта внутри класса мы можем обращаться через this . Например, мы хотим вывести на консоль информацию об объекте. Но выше мы уже определили метод GetInfo() , который возвращает данную информацию. Нет смысла повторять один и тот же код, поэтому мы можем просто вызвать этот метод через this и соответственно получить его результат:

То есть в данном случае код this.GetInfo() представляет вызов данного метода и его результат встраивается в строку.

Еще один метод, который имитирует процесс потребления пиши, получает параметр:

Консольный вывод программы:

Передача параметров методам и получение результата выполняется как и в целом в случае с функциями. И также мы можем типизировать параметры и тип результата:

Модификаторы доступа

Метод может иметь модификатор доступа, который ограничивает контекст применения метода. Модификатор доступа указывается после ключевого слова member и перед именем метода:

Приватные методы доступны только внутри своего класса. Так, в примере выше метод SayHi доступен в рамках текущего проекта, а метод Print только внутри класса Person.

let-привязка функций

Для определения поведения классы, наряду с методами, также могут определять функции с помощью оператора let :

Здесь в классе Person определена функция getYearOfBirth() , которая вычисляет год рождения на основе переданного возраста пользователя через параметр age. Для вычисления года рождения применяется конструкция System.DateTime.Now.Year , которая возвращает текущий год.

Однако стоит учитывать, что функции классов, определенные с помощью let , достуны только внутри своего класса. То есть они аналогичные приватным методам. Поэтому мы можем их использовать внутри класса для каких-то промежуточных вычислений, например, внутри методов:

МЕТОДЫ C#

Как писал Никлаус Вирт, программы — это алгоритмы + структуры данных. Можно считать, что данные в C# — это поля объектов и статические поля классов. Алгоритмы (т. е. функциональность программ) представляются с помощью методов класса и методов его объектов. В языке C# методы не существуют вне классов или структур. Нестатические методы реализуют функциональность объектов. Статические методы обеспечивают функциональность классов и, тем самым, программы в целом. Каждый метод предназначен для выполнения действий, определяемых совокупностью входящих в метод (в его тело) операторов. Начиная с версии C# 7.0, в каждом методе может быть определен и использован другой (локальный) метод (локальные методы рассмотрены в параграфе 9.2).

Для определения методов и при их вызове в C# не используются никакие служебные слова. В «языках древности», таких как ФОРТРАН или КОБОЛ, и в некоторых более современных языках, не входящих в семейство С-образных, для обозначения подпрограмм, функций, процедур используются специальные термины, включаемые в список служебных слов соответствующего языка (FUNCTION, SUBROUTINE — в Фортране, procedure в Паскале и т. д.). Для вызова подпрограмм в Фортране используется конструкция со служебным словом CALL и т. п.

В языках, ведущих свое происхождение от языка С (C + +, Java, C# и др.) при определении функций и для обращения к ним специальные термины не применяются. Это в полной мере относится и к методам языка С#. Однако синтаксически и семантически методы C# можно разделить на процедуры и функции. Это деление не особенно жесткое и в ряде случаев метод может играть две роли — и процедуры, и функции.

В упрощенном варианте формат декларации метода, который может играть роль как процедуры, так и функции, можно представить так:

людификаторы_метода0t

тип_возвращаемого_значения имя_метода (спецификация_параметров)

Индекс opt указывает на необязательность модификаторов метода.

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

Минимальная конструкция, применяемая для обращения к методу:

имя_метода(список_аргументов)

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

Метод-процедура отличается от метода-функции следующими свойствами:

  • • в качестве типа возвращаемого значения используется void, т. е. процедура не возвращает в точку вызова никакого результата;
  • • в теле процедуры может отсутствовать оператор возврата return, а когда он присутствует, то в нем нет выражения для вычисления возвращаемого значения. Если оператор return отсутствует, то точка выхода из процедуры (из метода) расположена за последним оператором тела метода;
  • • для обращения к методу-процедуре используется вызов метода в виде отдельного оператора:

имя_метода (список_аргументов);

Метод-функция всегда возвращает в точку вызова результат (некоторое значение). Типом возвращаемого значения служит тип ссылки или тип значения.

В теле функции всегда присутствует, по крайней мере, один оператор возврата:

return выражение;

где выражение определяет возвращаемый функцией результат.

Обращение к методу-функции может использоваться в качестве операнда подходящего выражения. Термин «подходящего» относится к необходимости согласования операндов в выражении по типам.

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

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

Исходные данные могут быть получены:

  • • через аппарат параметров метода;
  • • как глобальные по отношению к методу;
  • • от внешних устройств (потоки ввода, файловые потоки).

Результаты метод может передавать:

  • • в точку вызова как возвращаемое значение;
  • • в глобальные по отношению к методу объекты;
  • • внешним устройствам (потоки вывода, файловые потоки);
  • • через аппарат параметров метода.

Глобальными по отношению к методу объектами в C# являются статические поля класса, в котором, метод определен, и поля (статические) других классов, непосредственный доступ к которым имеет метод. Для нестатического метода в качестве глобальных данных доступны нестатические члены класса, т. е. члены объектов этого класса. Для локальных методов глобальными объектами являются параметры и локальные переменные того метода, в котором объявлен локальный метод. Обмены через глобальные объекты являются нарушением принципов инкапсуляции и обычно в реальных разработках не рекомендуются.

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

При определении метода в его заголовке размещается спецификация параметров (возможно пустая) — разделенная запятыми последовательность спецификаторов параметров. Каждый спецификатор параметра имеет вид:

модификатор тип_параметра имя_параметра

Модификатор параметра может отсутствовать или имеет одну из следующих форм: ref, out, params, this.

Если модификатор параметра отсутствует, то спецификатор параметра может включать умалчиваемое значение аргумента и принимает вид:

тип_параметра имя_параметра = выражение

Такие параметры в литературе называют необязательными (optional parameter). Выражение после знака присваивания определяет умалчиваемое значение аргумента и должно быть константным.

Ограничений на тип параметра не накладывается. Параметр может быть: предопределенного типа (базовые типы, строки, object); перечислением; структурой; классом; массивом; интерфейсом; делегатом.

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

Стандарт C# отмечает существование четырех видов параметров:

  • • параметры, передаваемые по значениям;
  • • параметры, передаваемые по ссылкам (ref);
  • • выходные параметры (out);

Параметры первых трех видов в Стандарте C# называют фиксированными параметрами. Спецификация фиксированного параметра включает необязательный модификатор ref или out, обозначение типа и идентификатор (имя параметра).

Список параметров представляет собой последовательность разделенных запятыми спецификаторов параметров (возможно, пустую), из которых только последний может быть массивом-параметром, имеющим модификатор params.

Модификаторы метода необязательны, но их достаточно много. Вот их список, пока без комментариев:

new, public, protected, internal, private, static, virtual, sealed, override, abstract, extern, async.

В данной главе мы будем рассматривать только статические методы (методы классов, не объектов) и локальные методы. В декларацию каждого метода класса (или структуры) входит модификатор static и такой метод называют статическим методом.

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

// 09_01.cs — Статические методы — процедура и функция using System;

using static System.Console; class Program <

static void print(string line)

WriteLine(«Длина строки: » + line.Length);

WriteLine(«Значение строки: » + line);

static string change(string str)

char[] rev = str.ToCharArrayQ;

Array.Reverse(rev); return new string(rev);

static void Main()

string numbers = «123456789»;

Результат выполнения программы:

Длина строки: 9 Значение строки: 123456789

Значение строки: 987654321

В классе Program три статических метода. Метод print() получает исходные данные в виде строки-параметра и выводит длину и значение этой строки. В точку вызова метод print() ничего не возвращает — это процедура.

Метод change() — это функция. Он получает в качестве параметра строку, формирует ее «перевернутое» значение и возвращает в точку вызова этот результат.

В статическом методе Main() определена ссылка numbers на строку «123456789». В отдельном операторе вызван метод-процедура print(numbers), который выводит сведения о строке, именованной ссылкой numbers. Затем та же ссылка использована в качестве аргумента метода-функции change (). Обращение к этому методу размещено в правой части оператора присваивания, поэтому возвращаемый методом change() результат становится новым значением ссылки numbers. Повторное обращение к методу print() иллюстрирует изменения.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *