5

Методы

Продолжаем улучшать читабельность и информативность программного кода.

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

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

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

  • Распределить написание кода между командой программистов, где каждый пишет свой модуль, блок программного кода. Затем эти модули соединяются в единую конструкцию.

  • Упрощается отладка и поиск ошибок в программе, потому как найти неверно работающий модуль легче, чем найти ошибку среди тысяч строк программного кода в методе Main.

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

Наименьшим выделенным блоком программного кода в языке C# является — метод. К примеру, точка входа в программу метод— Main, или методы вывода на экран — Write и WriteLine.

Методы делятся на две группы. Методы, возвращающие значение и методы невозвращение значение. Аналогами методов в других языках программирования, являются функции и процедуры

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

static void Metod()

{

Тело цикла. Здесь пишется блок исполняемого кода.

}

Где,

  • static — этот параметр примите как необходимость. Его обсуждение не входит в тему этой лекции

  • void — ключевое слово, указывающее, что метод не возвращает значение, которое может изменить ход выполнения программы

  • Metod — имя метода. По правилам пишется с большой буквы и имеет описательное содержание, которое описывает выполняемую функцию.

  • () — круглые скобки. Формат записи, указывающий на метод. Круглые скобки могут быть пустыми или содержать параметр.

  • {} — между фигурных скобок пишется исполняемый код.

Самая распространенная операция, которая не влияет на ход выполнения программы, а значит не возвращает никакого значения, является вывод информации на экран.  Очень часто, таким сообщением бывает сообщение — Ошибка.

Выделим сообщение об ошибке в отдельный блок — метод, и вызовем этот метод в методе Main. Все операции производятся в class Program

class Program

{

static void Main(string[] args)

{

MessageError();

}


static void MessageError()

{

Console.WriteLine("Ошибка");

}

}

На первый взгляд, здесь происходит нарушение основного принципа программирования — следование. Метод MessageError() находится ниже метода Main. На самом деле это не так. Найдя строку MessageError();,  компилятор находит в программе этот метод, выполняет его, и затем передает управление назад в метод Main. Поэтому нет разницы, где будет находится метод, ниже выше или в другом классе, или в другом файле, метод будет выполнен, в противном случае программа закончится ошибкой. При расположении метода за пределами базового класса Program, обязательно указывается путь к этому методу. Об этом поговорим чуть позже.

Как видно из вышеприведенного программного кода, использование методов очень похоже на применение переменных. По большому счету, операция Console.WriteLine("Ошибка"); как некое значение, была помещена в отдельный блок с именем, и теперь по имени можно вызвать эту операцию на выполнение.

Помимо разнообразных сообщений, методы, не возвращающие значение, могут выводить результаты вычислений. Для этого в круглых скобках метода объявляется переменная, называемая —параметром метода.

Напишем метод, умножающий значение переменной «х» на два.

static void Sum(int x)

{

Console.WriteLine(x * 2);

}

Здесь, в строке static void Sum(int x), параметр метода, метод Sum ожидает значение с типом данных int, которым будет инициализирована переменная int x.

Для того, чтобы воспользоваться методом достаточно вызвать метод по имени в методе Main, и в круглые скобки поместить значение. Значение в круглых скобках называется — аргумент. Аргумент должен иметь идентичный, с параметром тип данных.

class Program

{

static void Sum(int x)

{

Console.WriteLine(x * 2);

}


static void Main(string[] args)

{

Sum(30); //ПЕРЕДАЧА аргумента

// ОТВЕТ. Невидимая операция

}

}

Число «30» в строке Sum(30); является аргументом метода Sum. Саму же операцию передачи значения аргумента в параметр метода, можно представит как операцию инициализации переменной, в которой правым операндом является аргумент, а левым параметр.

В познавательном процессе о методах, встречаются ситуацию, когда обучающийся, написав свой метод не может к нему обратится. Это связано с тем, что ученик привык к мысли «одна операция — одно действие». Здесь же в строке Sum(30); происходит две операции — передача аргумента и получение ответа от метода в виде результата вычисления. Дабы избавится от визуальной зависимости «одна операция — одно действие», представьте, что ниже строки Sum(30); находится невидимая операция, принимающая ОТВЕТ.

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

class Program

{

static void Sum(int x)

{

Console.WriteLine(x * 2);

}

static void Main(string[] args)

{

int a = 30;

Sum(a); //ПЕРЕДАЧА аргумента

//ОТВЕТ. Невидимая операция

}

}

Здесь в качестве аргумента выступает значение переменной «а», которое инициализирует переменную «х», параметр метода Sum. После выполнения программного кода в теле метода Sum, результат вычисления возвращается методу Main.

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

class Program

{

static void Data(int x, string text)

{

Console.WriteLine($"Имя: {text}, возраст: {x}");

}


static void Main(string[] args)

{

int age = 30;

string name= "Bill";

Data(age, name); //ПЕРЕДАЧА аргумента

//ОТВЕТ. Невидимая операция

}

}

Здесь, аргументами выступают переменные age и name которые инициализируют переменные int x, string text метода Data.

В случаях, когда у метода два и более параметра необходимо соблюдать два правила.

  • 1.  Количество аргументов должно быть идентичным количеству параметров.

  • 2.  Типы данных параметров должны соответствовать по своему расположению типам данных аргументов. Т.е. первый параметр и аргумент должны иметь идентичные типы данных.

    Помимо переменных, в качестве параметров могут выступать структуры.

    Нижеприведен код программы, где метод ShowMany выводит на экран все элементы массива, а ShowOne — единственный.

    class Program

    {

    static void ShowMany(int[] arr)

    {

    for(int i=0; i<arr.Length; i++)

    {

    Console.Write( arr[i] + " ");

    }

    }

    static void ShowOne(int[] arr, int i)

    {

    Console.Write(arr[i]);

    }

    static void Main(string[] args)

    {

    int[] little = { 3, 6, 8, 9 };

    int[] big = { 1, 2, 3, 6, 5, 4, 9, 8, 25 };

    ShowMany(big); //ПЕРЕДАЧА аргумента

    //ОТВЕТ. Невидимая операция

    Console.WriteLine();

    ShowOne(little, 1); //ПЕРЕДАЧА аргумента

    //ОТВЕТ. Невидимая операция

    }

    }

    Здесь, параметром ShowMany является массив, поэтому аргументом для этого метода будет массив. Метод ShowOne, позволяет обратится к отдельному элементу массива, но операция по выводу отдельного элемента массива происходит внутри метода, поэтому прежде, чем обратится к конкретному элементу, необходимо в метод ShowOne передать все элементы массива. Таким образом метод ShowOne имеет два параметра — массив и переменную инициализируемую индексом

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

    Такие методы легко отличить от методов с «void». Так как метод возвращает значение, а значение имеет тип данных, то ключевое слово «void» заменяется на один из принятых типов данных. Само значение возвращается с помощью оператор — return.

    static string Name()

    {

    return "Bill";

    }

    Где, string — тип данных метода Text. Типом данных определены характеристики обрабатываемых значений.

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

    class Program

    {

    static string Text()

    {

    return "Bill";

    }


    static void Main(string[] args)

    {

    string name=Text();

    Console.WriteLine($"Имя {name}");

    }

    }

    Оператор return выполняет две функции, возвращает значение и прекращает работу метода.

    class Program

    {

    static string Text()

    {

    string name = "Bill";

    return name;

    string message = "Error";

    }


    static void Main(string[] args)

    {

    string name=Text();

    Console.WriteLine($"Имя {name}");

    }

    }

    Так как оператор «return» завершает работу метода, то операция с этим методом должна находится на последней строчке метода.

    Используя параметры и аргументы методы могут обмениваться значениями.

    class Program

    {

    static string Text(string name)

    {

    return name;

    }

    static int Number(int years)

    {

    return years;

    }

    static void Main(string[] args)

    {

    string name = Text("Bill");

    int age = Number(36);

    Console.WriteLine($"Имя {name}, возраст {age}");

    }

    }

    Здесь, аргументами "Bill" и 36, были инициализированы переменные в методах Text и Number соответственно.

В заключении.

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

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

На этом занятие закончено.

Вы можете самостоятельно найти задачи для закрепления теоретического материала или для получения задач с ответами отправьте письмо на basicprog@mail.ru

Удачи в выполнении практических заданий!