Процедуры и функции - методы класса
Первыми формами модульности, появившимися в языках программирования, были процедуры и функции . Они позволяли задавать определенную функциональность и многократно выполнять один и тот же параметризованный программный код при различных значениях параметров. Поскольку функции в математике использовались издавна, то появление их в языках программирования было совершенно естественным. Уже с первых шагов процедуры и функции позволяли решать одну из важнейших задач, стоящих перед программистами, - задачу повторного использования программного кода. Встроенные в язык функции давали возможность существенно расширить возможности языка программирования. Важным шагом в автоматизации программирования было появление библиотек процедур и функций , доступных из используемого языка.
Процедуры и функции - методы классаДолгое время процедуры и функции играли не только функциональную, но и архитектурную роль. Весьма популярным при построении программных систем был метод функциональной декомпозиции "сверху вниз", и сегодня еще играющий важную роль. Но с появлением ООП архитектурная роль функциональных модулей отошла на второй план. Для ООП-языков, к которым относится и язык C#, в роли архитектурного модуля выступает класс . Программная система строится из модулей, роль которых играют классы , но каждый из этих модулей имеет содержательную начинку, задавая некоторую абстракцию данных.
Процедуры и функции связываются теперь с классом , они обеспечивают функциональность данных класса и называются методами класса . Главную роль в программной системе играют данные, а функции лишь служат данным. Напомню здесь, что в C# процедуры и функции существуют только как методы некоторого класса , они не существуют вне класса .
В данном контексте понятие класс распространяется и на все его частные случаи - структуры, интерфейсы, делегаты.
В языке C# нет специальных ключевых слов - procedure и function, но присутствуют сами эти понятия. Синтаксис объявления метода позволяет однозначно определить, чем является метод - процедурой или функцией .
Прежнюю роль библиотек процедур и функций теперь играют библиотеки классов . Библиотека классов FCL, доступная в языке C#, существенно расширяет возможности языка. Знание классов этой библиотеки и методов этих классов совершенно необходимо для практического программирования на C# с использованием всей его мощи.
Уже в лекции 1 мы говорили о роли библиотеки FCL - статическом компоненте Framework .Net. В лекции 4 рассматривались возможности класса Convert этой библиотеки , а в лекции 7 - классы Math и Random . Изучение классов FCL будет постоянно сопровождать наш курс.
Процедуры и функции. ОтличияФункция отличается от процедуры двумя особенностями:
- всегда вычисляет некоторое значение, возвращаемое в качестве результата функции ;
- вызывается в выражениях.
Процедура C# имеет свои особенности:
- возвращает формальный результат void , указывающий на отсутствие результата ;
- вызов процедуры является оператором языка;
- имеет входные и выходные аргументы , причем выходных аргументов - ее результатов - может быть достаточно много.
Хорошо известно, что одновременное существование в языке процедур и функций в каком-то смысле избыточно. Добавив еще один выходной аргумент , любую функцию можно записать в виде процедуры . Справедливо и обратное. Если допускать функции с побочным эффектом , то любую процедуру можно записать в виде функции . В языке С - дедушке C# - так и сделали, оставив только функции . Однако значительно удобнее иметь обе формы реализации метода: и процедуры , и функции . Обычно метод предпочитают реализовать в виде функции тогда, когда он имеет один выходной аргумент , рассматриваемый как результат вычисления значения функции . Возможность вызова функций в выражениях также влияет на выбор в пользу реализации метода в виде функции . В других случаях метод реализуют в виде процедуры .
Описание методов (процедур и функций). СинтаксисСинтаксически в описании метода различают две части - описание заголовка и описание тела метода:
Рассмотрим синтаксис заголовка метода:
Имя метода и список формальных аргументов составляют сигнатуру метода . Заметьте, в сигнатуру не входят имена формальных аргументов - здесь важны типы аргументов. В сигнатуру не входит и тип возвращаемого результата .
Квадратные скобки (метасимволы синтаксической формулы) показывают, что атрибуты и модификаторы могут быть опущены при описании метода. Подробное их рассмотрение будет дано в лекциях, посвященных описанию классов . Сейчас же упомяну только об одном из модификаторов - модификаторе доступа. У него четыре возможных значения, из которых пока рассмотрим только два - public и private . Модификатор public показывает, что метод открыт и доступен для вызова клиентами и потомками класса . Модификатор private говорит, что метод предназначен для внутреннего использования в классе и доступен для вызова только в теле методов самого класса . Заметьте, если модификатор доступа опущен, то по умолчанию предполагается, что он имеет значение private и метод является закрытым для клиентов и потомков класса .
Обязательным при описании заголовка является указание типа результата, имени метода и круглых скобок, наличие которых необходимо и в том случае, если сам список формальных аргументов отсутствует. Формально тип результата метода указывается всегда, но значение void однозначно определяет, что метод реализуется процедурой . Тип результата, отличный от void , указывает на функцию . Вот несколько простейших примеров описания методов:
Методы A и B являются закрытыми , а метод С - открыт . Методы A и С реализованы процедурами , а метод B - функцией , возвращающей целое значение.