Страницы

Поиск по вопросам

четверг, 28 ноября 2019 г.

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

#терминология


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

Собственно, какова разница между терминами "метод" и "функция", почему в Си++ члены
не называют "методами"?
    


Ответы

Ответ 1



И чего так много слов то? Все просто: Метод это функция класса Метод всегда является функцией, а функция не всегда является методом.

Ответ 2



Нет единой устоявшейся техники наименования сущностей в языках программирования и каждый язык, чтобы немного отличаться от других, по историческим причинам имеет свой набор названий и соглашений. Так как программирование пришло с математики, то начальные корни нужно искать там. А там были функции и процедуры. Функция на основании своих аргументов генерирует какой-то результат. sin, cos - яркие примеры. Функция без аргументов - вырожденный вариант и обычно это константа. В математике обычно функции являются чистыми - то есть, у них нет побочных эффектов. То есть, вызов функции с одними и теми же аргументами дает один и тот же результат. Параллельно существуют процедуры. Процедура - это последовательность действий, приводящая к определенному результату (да, обычная программа - это также может быть процедура, хотя...). В паскале и фортране принято, что процедура не возвращает результат. Но я считаю, что это исключительно соглашение, потому что иначе нужно было бы делать как в C/C++ и вводить пустой тип (void). почему в Си++ члены не называют "методами"? Во многих языках 60-70 годов не было ООП в том понимании, которое известно сейчас. С++ изначально был просто "фронтом" (то есть надстройкой) над обычным Си. Был долгий период, когда это уже был не Си, но и ещё и не C++. Компилятора C++ не было, а был транслятор в Си. Видимо, поэтому там закрепилось функция класса/переменная класса. Сейчас Страуструп предлагает N4174, и если его примут, то грань между обычными функциями и функциями класса размоется ещё больше. В других языках - Java и семейство, проектировались, когда уже ООП был немного сформированным. От обычных функций они решили отказаться и, видимо, чтобы не вызывать путаницу, обозвали все методами. Да, потом им пришлось функции все-таки вернуть назад, но, чтобы ничего не сломать, назвали это статическими методами. Собственно, какова разница между терминами "метод" и "функция" Правильный ответ - историческая. Как правильно называть сущности в разных языках, нужно уточнять в их документации. многие автора книг по с++ называют функции класса методами. Как быть? Тут все сложно. Например, Эккель так делает видимо потому, что он ещё и много книг о Java написал. Также не стоит забывать, что многие книги мы читаем в переводе, а они "исправляют", потому что переводчику так понятнее. так можно ли называть функции класса с++ методами? Это точно так же, как использовать мат/обсценную лексику в высшем обществе. Или пытаться объясниться с гопниками языком Тургенева и стихами Пушкина/Блока. P.S. метод - слово многозначное и вполне можно услышать от C++ программистов такое "это метод для получения данных с сервера, реализован в виде 5 функций и двух классов".

Ответ 3



Вот определение метода: Метод в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-то классу или объекту. Методы классифицируются по применимости к объектам: статические и простые или нестатические; по возможности использования: public, private, protected. Вот определение функции: Функция в программировании — фрагмент программного кода (подпрограмма), к которому можно обратиться из другого места программы. Функция может принимать параметры и должна возвращать некоторое значение, возможно void. Функции, которые возвращают void, называются процедурами. Как видим, первое является разновидностью второго. Насчет того, что в C++ все называют функциями я не соглашусь, понятие метод класса тоже часто употребляется. Просто функция является более общим названием.

Ответ 4



Функция это самостоятельная сущность. Метод это часть класса(объекта) и без него не употребляется.

Ответ 5



Понятие "метод" это частный случай "фукнции". Здесь под "методом" понимается функция-член. Понятие "метод" пришло из языка Smalltalk на заре ООП. Вводить это понятие потребовалось для того, чтобы описать механизмы вызовов функций в Smalltalk. Процесс вызова функции в Smalltalk, в общем, делится на: посылку сообщения, выбор подходящего метода (диспечеризацию) и выполнение найденого метода. Вот чтобы эти тонкости описать потребовались отдельные понятия: "сообщение", "диспечеризация" и "метод". Когда ООП сделали "передним краем" программирования, а Smalltalk одной из его звед, его идеология начала интенсивно просачиваться в другие языки. Smalltalk оказал большое влияние на развитие ООП, прежде всего благодаря хорошей проработке понятий и качественной "архитектуре" языка. Причем "метод" появился не просто как "функция-член", он вытащил и представление о "сообщениях" с "диспечеризацией". Вот от сюда в Си++ и возникло стремление четко указывать что в Си++ "методов" нет, что здесь только функции-члены. В 90-х "метод" появился в новой Яве. Но только к этому времени, от него отвалились "сообщения" и "диспечеризация", так как на "переднем крае" уже с ними наигрались, наступала эпоха компонентов. Понятие "метод" приобрело современное содержание и стало означать "функцию-член". К стати, результатом этого стало то, что "метод" таки просочился в Си++, но только, опять повторю, этот новый "метод" проще, чем тот старый на сообщениях. Понятие "функция" в это время никак не менялось.

Комментариев нет:

Отправить комментарий