Вы находитесь на странице: 1из 52

Урок 3: Методы

• Подпрограмма, процедура, функция, метод


• Объявление методов
• Проектирование методов
• Хорошие и плохие названия
• Видимость методов
• Статические методы
• Передача параметров
• Переменное число параметров
• Перегрузка методов
• Инкапсуляция данных и логики
• Get и Set
• Рекурсия
• Практическое занятие
Подпрограмма
• Имеет имя
• Может вызываться многократно из других
частей программы
Выделение логически целостной
подзадачи
• Легко менять
• Легко понимать
Подпрограммы
• Процедуры
• Функции
Функция
• Значение
• Побочный эффект
Функции
• Math.Pow(x, y)
• Console.ReadLine()
• Console.ReadKey()
Процедуры?
int main()
{
return 0;
}
void
void main()
{
}
C#
• Процедуры
• Функции
• Методы
Методы

class Program
{
static void Main(string[] args)
{
}
}

внутри класса
Объявление метода
public static double Sqrt(double x)
{

• модификаторы
• тип результата
• имя
• параметры
• тело
Проектирование метода
• Четкое назначение
• Одно действие
• Минимальная связанность
Имя
• глагол
• сделай!

Хорошие примеры:

– Напечатай таблицу! PrintTable()


– Построй дом! BuildHouse()

Плохие примеры:

– Вывод таблицы TablePrinting()


– Строительство Building()
Тип результата
• void
• любой тип данных

– Console.WriteLine()
– Console.ReadLine()
Модификаторы
• public
• private
• static
Видимость методов
class CarFactory
{
public Car MakeCar()
{
return MakeEngine() + MakeWheel() * 4;
}

private Engine MakeEngine()


{

}

private Wheel MakeWheel()


{

}
}
Видимость методов

по умолчанию

private
Обычные и статические методы

double x2 = Math.Pow(x, 2);


Console.WriteLine(“{0}^2 = {1}”, x, x2);

Random random = new Random();


int surprise = random.Next(10);
return
public bool DoJob()
{
if (какая-то проверка)
return false;

какая-то работа public void DoJob()


return true; {
} if (какая-то проверка)
return;

какая-то работа
}
Параметры
• Фактические
• Формальные
Фактические параметры

Console.WriteLine(“Привет!”);
Формальные параметры

public void WriteLine(string value)


{

}
Передача параметров через стек
static void Main()
{
int step = 10;
step = GetNext(step);

}

static int GetNext(int step)


{
int delta = 1;
return step + delta; step
}
Передача параметров через стек
static void Main()
{
int step = 10;
step = GetNext(step);

}
delta
static int GetNext(int step)
{ step
int delta = 1;
return step + delta; step
}
Передача параметров через стек
static void Main()
{
int step = 10;
step = GetNext(step);

}

static int GetNext(int step)


{ RESULT
int delta = 1;
return step + delta; step
}
Передача параметров через стек
static void Main()
{
int step = 10;
step = GetNext(step);

}

static int GetNext(int step)


{
int delta = 1;
return step + delta; step
}
Передача параметров по значению
void Main()
{
int x = 10;
Inc(x);
Console.WriteLine(x);
}

void Inc(int x)
{
x++;
}
Передача параметров по значению
void Main()
{
int x = 10;
Inc(x);
Console.WriteLine(x); // 10
}

void Inc(int x)
{
x++;
}
Передача параметров по ссылке
• ref
• out
ref
void Main()
{
int x = 10;
Inc(ref x);
Console.WriteLine(x); // 11
}

void Inc(ref int x)


{
x++;
}
out
void Main()
{
int x = 10;
Inc(out x);
Console.WriteLine(x);
}

void Inc(out int x)


{
x++; // так нельзя, ошибка
}
out
void Main()
{
int x;
Init(out x);
Console.WriteLine(x); // 777
}

void Init(out int x)


{
x = 777;
}
out
static void Main()
{
string s = Console.ReadLine();
int i;

if (!int.TryParse(s, out i))


{
Console.WriteLine(“Ошибка ввода!”);
return;
}

… static bool TryParse(string value, out int result)


} {

}
Переменное число параметров

Console.WriteLine(“x = {0}”, x);

Console.WriteLine(“{0}^2= {1}”, x, x * x);

Console.WriteLine(
“{0} , {1} , {2}, {3}, {4}, {5}, {6}”,
a, b, c, d, e, f, g);
Переменное число параметров
void Main()
{
Console.WriteLine(GetSum()); // 0
Console.WriteLine(GetSum(1)); // 1
Console.WriteLine(GetSum(1, 2, 3)); // 6
}

int GetSum(params int[] p)


{
int sum = 0;

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


sum += p[i];

return sum;
}
Переменное число параметров

string Format(string format, params object args)


{

} Допустимо

string Format(params object args, string format)


{

} Так нельзя
Метод
1) Пространство имен
2) Имя класса
3) Имя метода
4) Параметры
Перегрузка методов

пример
Console.WriteLine
Инкапсуляция

Сокрытие данных
Сокрытие логики
Сокрытие сложности
get и set
private int mSomeValue;

public int SomeValue


{
get { return mSomeValue; }
set { mSomeValue = value; }
}
Рекурсия

Вызов функции самой себя


Пример рекурсии

n! = 1 * 2 * 3 * … * n
int GetFactorial(int n)
{
return (n == 1) ? 1 : n * GetFactorial(n – 1);
}
Урок 3: Методы
• Подпрограмма, процедура, функция, метод
• Объявление методов
• Проектирование методов
• Хорошие и плохие названия
• Видимость методов
• Статические методы
• Передача параметров
• Переменное число параметров
• Перегрузка методов
• Инкапсуляция данных и логики
• Get и Set
• Рекурсия
• Практическое занятие
Практическое занятие

игра
Крестики-нолики
Задачи
• Показ игрового поля
• Прием команд пользователя
• Реализация игровой логики
Игра
Program

GameInput GameEngine GameOutput

GameField
GameField
• Записать символ
• Прочитать символ
GameEngine
• Запустить игру
• Компьютер, сделай ход!
• Обработать ход пользователя
• Окончена ли игра?
• Кто победитель?
GameOutput
• Показать игровое поле
• Показать исход игры
GameInput
• Запрос команды
Игровой цикл
Пока пользователь не пожелает завершить игру
или же она не будет окончена:
- Показать поле
- Выполнить ход компьютера
- Если игра не окончена:
- Показать поле
- Запросить ход пользователя
- Если пользователь не пожелал завершить
игру:
- Выполнить ход пользователя
Проблемы
• Определение победителя
• Ход компьютера
• Вывод игрового поля
• Игровой цикл