Что такое метод в программировании
Перейти к содержимому

Что такое метод в программировании

  • автор:

Чем отличается «метод» от «функции»

Неоднократно видел использование термина «метод» для обозначения функций-членов классов в противоположность термину «функция» для обозначения «свободных» функций нечленов. С другой стороны, в текстах о Си++, часто всё называют «функцией» и члены и нечлены. Собственно, какова разница между терминами «метод» и «функция», почему в Си++ члены не называют «методами»?

Отслеживать
задан 30 окт 2017 в 7:28
6,853 2 2 золотых знака 23 23 серебряных знака 43 43 бронзовых знака

почему в Си++ члены не называют «методами»? — так и хочется пошутить про потому что они ч. но не буду

30 окт 2017 в 7:34
Метод — это функция, которая член класса. И это вся разница вроде)
30 окт 2017 в 7:34
@andreymal можно как ответ делать. терминология-faq с эпичным ответом)
30 окт 2017 в 7:40

@АлексейШиманский я не уверен, что так во всех языках, и предпочту воздержаться от ответа. Эпичный ответ с примерами и исключениями (если таковые существуют) от кого-нибудь уверенного будет более полезным)

30 окт 2017 в 7:43
@andreymal А процедура — член класса тогда как называется?
30 окт 2017 в 8:25

6 ответов 6

Сортировка: Сброс на вариант по умолчанию

И чего так много слов то? Все просто:

Метод всегда является функцией, а функция не всегда является методом.

Отслеживать
ответ дан 30 окт 2017 в 9:12
81.1k 7 7 золотых знаков 72 72 серебряных знака 153 153 бронзовых знака
Это как «Большой палец — всегда палец, но палец не всегда большой?» (c) ТБВ
30 окт 2017 в 9:46
Точно, именно так 🙂
30 окт 2017 в 10:14

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

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

Параллельно существуют процедуры. Процедура — это последовательность действий, приводящая к определенному результату (да, обычная программа — это также может быть процедура, хотя. ). В паскале и фортране принято, что процедура не возвращает результат. Но я считаю, что это исключительно соглашение, потому что иначе нужно было бы делать как в C/C++ и вводить пустой тип (void).

почему в Си++ члены не называют «методами»?

Во многих языках 60-70 годов не было ООП в том понимании, которое известно сейчас. С++ изначально был просто «фронтом» (то есть надстройкой) над обычным Си. Был долгий период, когда это уже был не Си, но и ещё и не C++. Компилятора C++ не было, а был транслятор в Си. Видимо, поэтому там закрепилось функция класса/переменная класса. Сейчас Страуструп предлагает N4174, и если его примут, то грань между обычными функциями и функциями класса размоется ещё больше.

В других языках — Java и семейство, проектировались, когда уже ООП был немного сформированным. От обычных функций они решили отказаться и, видимо, чтобы не вызывать путаницу, обозвали все методами. Да, потом им пришлось функции все-таки вернуть назад, но, чтобы ничего не сломать, назвали это статическими методами.

Собственно, какова разница между терминами «метод» и «функция»

Правильный ответ — историческая. Как правильно называть сущности в разных языках, нужно уточнять в их документации.

многие автора книг по с++ называют функции класса методами. Как быть?

Тут все сложно. Например, Эккель так делает видимо потому, что он ещё и много книг о Java написал. Также не стоит забывать, что многие книги мы читаем в переводе, а они «исправляют», потому что переводчику так понятнее.

так можно ли называть функции класса с++ методами?

Это точно так же, как использовать мат/обсценную лексику в высшем обществе. Или пытаться объясниться с гопниками языком Тургенева и стихами Пушкина/Блока.

P.S. метод — слово многозначное и вполне можно услышать от C++ программистов такое «это метод для получения данных с сервера, реализован в виде 5 функций и двух классов».

#6. Вводный курс по JAVA. Методы

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

Методы определяются всегда внутри классов:

public class Main < public static void foo() < // Тело метода >>

foo — это метод, который мы определили в классе Main, давайте его рассмотрим.

  • public – тип доступа (метод может вызываться из другого класса). Существуют и другие типы доступа, к примеру private (метод доступен только внутри класса) и protected (о нем мы будем говорить позже).
  • static означает что метод статический, он принадлежит классу Main, а не конкретному экземпляру класса Main. Мы можем вызвать этот метод из другого класса так: Main.foo() .
  • void значит, что этот метод не возвращает значение. Методы могут возвращать значение в Java и оно должно быть определено при объявлении метода. Однако, вы можете использовать return просто для выхода из метода.
  • Этот метод не получает никаких аргументов, но методы java могут получать аргументы, как мы увидим далее на примерах.

Если тип возвращаемого значения не void, в теле метода должен быть хотя бы один оператор

return выражение;
где тип выражения должен совпадать с типом возвращаемого значения. Этот оператор возвращает результат вычисления выражения в точку вызова метода.
Если тип возвращаемого значения – void, возврат из метода выполняется либо после выполнения последнего оператора тела метода, либо в результате выполнения оператора
return;
(таких операторов в теле метода может быть несколько).
Пример объявления метода, возвращающего значение типа int – сумму двух своих параметров типа int:

int sum(int a, int b)

При вызове метода, например, sum (5, 3) , параметры 5 и 3 передаются в метод, как значения соответственно a и b , и оператор вызова метода sum (5, 3) – заменяется значением, возвращаемым методом ( 8 ).

В отличие от языка C, в котором тип параметра, задаваемого при вызове, приводится к типу параметра в объявлении функции, тип задаваемого параметра в Java должен строго соответствовать типу параметра в объявлении метода, поэтому вызов метода sum(1.5, 8) приведет к ошибке при компиляции программы.

Не статические методы

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

Не статические методы могут получать доступ и изменять поля объекта.

public class Student < private String name; public String getName() < return name; >public void setName(String name) < this.name = name; >>

Вызов методов требует экземпляра класса Student .

Student s = new Student(); s.setName("Danielle"); String name = s.getName(); Student.setName("Bob"); // Не будет работать! Student.getName(); // Не будет работать!

Перегруженные методы

В языке Java в пределах одного класса можно определить два или более ме­тодов, которые совместно используют одно и то же имя, но имеют разное количество параметров. Когда это имеет место, методы называют перегру­женными, а о процессе говорят как о перегрузке метода (method overloading).

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

double sum(double a, double b)

вместе с объявленным ранее методом int sum(int a, int b)составляют пару перегруженных методов и при вызове sum(5, 8) будет вызван первый метод, а при вызове sum(5.0, 8.0) будет вызван второй метод.

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

Переопределение методов

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

public class Thought < public void message() < System.out.println("Я себя чувствую как стрекоза, попавшая в параллельную вселенную."); >> public class Advice extends Thought < @Override // Аннотация @Override с Java 5 является необязательной, но весьма полезной public void message() < System.out.println("Внимание: Даты в календаре ближе, чем кажутся."); >>

Класс Thought представляет собой суперкласс и обеспечивает вызов метода message() . Подкласс, называемый Advice , наследует каждый метод класса Thought . Однако, класс Advice переопределяет метод message() , замещая функционал, описанный в классе Thought .

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

public class Advice extends Thought < @Override public void message() < System.out.println("Внимание: Даты в календаре ближе, чем кажутся."); super.message(); // Вызов версии метода родительского класса >>

Существуют методы, которые подкласс не может переопределять. Например, в Java метод, объявленный с ключевым словом final , не может быть переопределён. Методы, объявленные как private или static не могут быть переопределены, поскольку это соответствует неявному использованию final .

Резюме

  • Каждый java-метод должен быть внутри класса
  • Статические методы принадлежат классу, а не статические методы принадлежат объектам, экземплярам класса
  • В пределах одного класса может быть два и более методов с одинаковыми именами, но разным набором параметров (перегрузка метода)
  • Класс-потомок может обеспечивать свою реализацию метода, уже реализованного в одном из родительских классов (переопределение метода)

Упражнение

Написать метод printFullName класса Student, который выводит полное ФИО студента.

Выполните упражнение, прежде чем перейти к следующему уроку.

Определение методов — Основы Java

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

К примеру, отправка письма на сайте — это достаточно сложный процесс, включающий в себя взаимодействие с интернетом. Можно определить метод и скрыть всю сложность за одной простой конструкцией:

// Место, откуда берется метод import com.example.Mailer; var email = "support@hexlet.io"; var title = "Помогите"; var body = "Я написал историю успеха, как я могу получить скидку?"; // Mailer – имя класса, в котором определен метод send() // Один маленький вызов — и много логики внутри Mailer.send(email, title, body); 

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

Как создавать методы

Для начала рассмотрим структуру методов. Обычно они устроены так:

Создадим наш первый метод. Его задача — вывести на экран текущую дату:

import java.time.LocalDate; // Определение метода // Определение не вызывает и не выполняет метод // Мы лишь говорим, что теперь такой метод существует public class App  public static void showCurrentDate()  // Встроенный метод в Java для получения текущего времени и даты var currentDate = LocalDate.now(); var text = "Today is: " + currentDate; System.out.println(text); > > // Вызов метода // Обязательно указывать имя класса App.showCurrentDate(); // => Today is: 2021-10-25 

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

Их можно разделить на две группы:

  • То, что влияет на работу самого метода
  • То, как этот метод видим за пределами класса

За видимость отвечает слово public. Оно дает возможность вызывать методы снаружи класса, как в примере выше. Кроме него существует private, который разбирается на Хекслете в курсе по ООП в Java.

За работу метода отвечают:

  • static — говорит о том, что метод статический. Это значит, что он принадлежит самому классу. Благодаря этому мы можем вызвать метод, используя имя класса, без необходимости создавать объект этого класса
  • void используется, если метод ничего не возвращает. Например, такое определение у метода System.out.println() . Если метод возвращает какие-то данные, то вместо void указывается тип возвращаемых данных

В отличие от обычных данных, методы выполняют действия, поэтому их имена практически всегда должны быть глаголами: «построить что-то», «нарисовать что-то», «открыть что-то».

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

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

// Минимальное определение метода public class App  public static void noop()  // Тут мог бы быть код, но его нет // Обратите внимание на отступы // Для читаемости, любой код внутри тела сдвигается вправо на 4 пробела > > App.noop(); 

Понятие «создать метод» имеет много синонимов: «реализовать», «определить» и даже «заимплементить». Все эти термины встречаются в повседневной практике на работе.

Дополнительные материалы

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты

Об обучении на Хекслете

  • Статья «Как учиться и справляться с негативными мыслями»
  • Статья «Ловушки обучения»
  • Статья «Сложные простые задачи по программированию»
  • Урок «Как эффективно учиться на Хекслете»
  • Вебинар « Как самостоятельно учиться »

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно

  • 130 курсов, 2000+ часов теории
  • 1000 практических заданий в браузере
  • 360 000 студентов

Наши выпускники работают в компаниях:

Методы программирования в задачах и примерах на С/С++ (pdf)

Методы программирования в задачах и примерах на С/С++ (pdf)

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

Обратите внимание! Если Вы покупаете электронное издание, лучше зарегистрироваться на сайте и запомнить данные для входа в личный кабинет. Ссылка на книгу будет доступна в Вашем личном кабинете в разделе «Купленные электронные товары» и прислана Вам на почту, но некоторые почтовые серверы не пропускают письма со ссылками.

Забронировать
Аннотация Для цитирования Об авторах Рецензии

Учебное пособие является обобщением опыта преподавания университетского курса «Работа на ЭВМ и программирование» для студентов механико-математического факультета МГУ имени М. В. Ломоносова и школьного курса «Информатика» в классах при механико-математическом факультете на базе 54-й школы г. Москвы и в математических классах Университетской гимназии. В книге собраны и систематизированы задачи, предлагавшиеся для самостоятельного решения во время семинарских занятий, лабораторных работ, на зачетах и экзаменах.

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

Для цитирования

Валединский, В. Д., Корнев, А. А. Методы программирования в задачах и примерах на С/С++ : учебное пособие / В. Д. Валединский, А. А. Корнев. — Москва : Издательство Московского университета, 2023. — 413, [1] с. — (Электронное издание сетевого распространения).

Об авторах

кандидат физико-математических наук,

Является специалистом в области численных методов. Опубликовал около 35 научных работ и 10 учебных пособий (в соавторстве). Активно участвовал в компьютеризации учителей математики, физики, химии города Москвы.

доктор физико-математических наук,

Профессор кафедры вычислительной математики механико-математического факультета МГУ. Профессор РАН.

Доцент кафедры вычислительной математики механико-математического факультета МГУ имени М. В. Ломоносова, кандидат физико-математических наук М. А. Ложников

Методы программирования в задачах и примерах на С/С++ (pdf)

Автор Валединский В. Д. / Корнев А. А. ISBN 978-5-19-011886-5 (e-book) УДК 519.68+004.43 ББК 32.97 Год издания 2023 Цена 0 Диапозон цен до 500 рублей Формат 60×90/16 страниц 413 тип Учебное издание дополнительно к типу Электронное издание сетевого распространения. Рекомендовано учащимся старших классов с углубленным изучением математики и информатики, студентам высших учебных заведений, осваивающим методы программирования и язык C, а также в помощь преподавателям для проведения практических занятий буклист информатика и программирование Аннотация

Учебное пособие является обобщением опыта преподавания университетского курса «Работа на ЭВМ и программирование» для студентов механико-математического факультета МГУ имени М. В. Ломоносова и школьного курса «Информатика» в классах при механико-математическом факультете на базе 54-й школы г. Москвы и в математических классах Университетской гимназии. В книге собраны и систематизированы задачи, предлагавшиеся для самостоятельного решения во время семинарских занятий, лабораторных работ, на зачетах и экзаменах.

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

Доцент кафедры вычислительной математики механико-математического факультета МГУ имени М. В. Ломоносова, кандидат физико-математических наук М. А. Ложников

Для цитирования Валединский, В. Д., Корнев, А. А. Методы программирования в задачах и примерах на С/С++ : учебное пособие / В. Д. Валединский, А. А. Корнев. — Москва : Издательство Московского университета, 2023. — 413, [1] с. — (Электронное издание сетевого распространения). Бесплатный pdf /ebook/978-5-19-011886-5_e-book.pdf

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

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