Зачастую при написании программ встречается дублированный код, который кроме увеличения размера написанного кода ещё и ухудшает его чтение. Для устранения этой проблемы и были придуманы методы, которые позволяют избежать дублирования кода и повышают его читаемость.
Например, представьте себе ситуацию, когда в консоли нужно вывести 10 разных за размерами прямоугольников. Для реализации данной задачи (без использования методов) нам нужно продублировать ниже написанный цикл 10 раз (количество итераций циклов может меняться при необходимости):
for (int i = 0; i < 10; i++)
{
for (int j = 0; j < 20; j++)
{
Console.Write('*');
}
Console.WriteLine();
}
Как видно из этого в нашей программе будет присутствовать дублированный код (наши циклы), что приводит к увеличению строк кода и ухудшению его чтения и понимания (ведь нужно вчитывается, что бы понять, что делает каждый цикл). Теперь же рассмотрим решение этой же задачи при использовании методов:
// метод для вывода прямоугольника с указанной шириной и высотой
void DrawRectangle(int width, int height)
{
for (int i = 0; i < height; i++)
{
for (int j = 0; j < width; j++)
{
Console.Write('*');
}
Console.WriteLine();
}
}
// где-то в коде...
DrawRectangle(20, 10); // выводит прямоугольник 20х10
DrawRectangle(17, 15); // выводит прямоугольник 17х15
DrawRectangle(10, 20); // выводит прямоугольник 10х20
// ...
Как видно из данного решения, метод DrawRectangle
будет отвечать за рисование прямоугольника в консоли, поэтому теперь нам ненужно каждый раз писать цикл для его вывода, а также чтение кода повысится, ведь было выбрано правильное название метода (отображающее его предназначение). Соответственно другому программисту, начавшему читать данный код, будет намного проще разобраться в этом.
Таким образом метод – это:
- именованная часть программы, которая может вызываться из других частей программы столько раз, сколько необходимо.
- функция или процедура, выполняющая одну задачу. (понятия функции и процедуры рассматривается дальше)
Самая важная причина создания методов – это снижение сложности программ, ведь без них читать и понимать программный код будет намного сложнее, что в свою очередь приведёт к:
- повышению количества различных логических ошибок и дополнительным затратам на их устранение.
- потере времени при подключении нового программиста к написанию проекта (программы).
Методы реализуют идею сокрытия информации. Один раз, создав метод, мы можем использовать его неограниченное количество раз, не думая о его внутренней работе. Поэтому методы можно ассоциировать с механизмами принимающими (необязательно) какие-то данные и делающими определённые инструкции, например как продемонстрировано на рисунке ниже.
Как видно из рисунка, методу передаётся определённое значение, а он в конце своей работы возвращает пользователю результат своей работы. Исходя из переданного значения методу (1) на рисунке и полученного значения (2) в качестве результате его работы можно предположить, что метод увеличивает полученное значение на 1, и соответственно сам метод может выглядеть следующим образом:
В некоторых языках программирования (но не в C#!) методы делят на две категории: функции – это методы, что в результате своей работы что-то возвращают (как и различные математические функции в реальной жизни), и процедуры – это методы, выполняющие указанный им ряд инструкций и в качестве результата своей работы ничего не возвращают.
Причиной не разделения методов на две категории состоит в следующем: C# является объектно-ориентированным языком пытающемся переместить различные законы и правила из реальной жизни в объективную (виртуальную) реальность, а в реальной жизни мы не называем различные наши действия процедурами или функциями, а ассоциируем их с способами (методами) достижения нужного результата. Как и в реальной жизни один и тот же результат можно добиться разными путями, так и в объектной реальности можно добиться не одним способом (методом). Например, переместить ручку лежащую на столе из позиции А в позицию Б, мы можем несколько способами: переместить ручку левой/правой рукой, переместить её приподняв стол под углом, что бы она скатилась самостоятельно и т.д. И это всё методы достижения необходимого результата.
Выделение фрагмента кода в отдельный, удачно названый метод, является одним из способов документирования целей данного метода.
Методы позволяют выполнять оптимизацию кода в одном месте. Это облегчает профилирование кода, направленное на определение неэффективных фрагментов.
Очень важно, чтобы каждый метод эффективно решал только одну задачу и больше ничего не делал. Например, метод Console.WriteLine(“Hello”) – имеет четко определенную цель.
Источник: видеоурок Александра Шевчука "МЕТОДЫ"