83.13K
Category: programmingprogramming

презентация_перегрузка_методов_новый_дизайн (1)

1.

Перегрузка
Методов
Разработка программных модулей
Выполнил: Лужиков Михаил Николаевич 1415-Исо
Сыктывкарский Государственный Университет им.
Питирима Сорокина
Колледж Экономики Права и Информатики
Преподаватель: Хохлов Роман Николаевич

2.

Зачем нужна перегрузка методов
Без перегрузки
• много похожих имён методов
• пользователь запоминает
лишние названия
• интерфейс класса
становится шумным
printInt(value)
printString(text
)
printDouble(num)
С перегрузкой
• одно имя для одной идеи
• параметры уточняют вариант
• компилятор выбирает
нужный метод
print(int)
print(String)
print(double)
Главная польза
Код становится ближе к
естественному языку:
действие одно, а форма
входных данных может быть
разной.
читабельность
меньше
имён
2

3.

Метод, параметры и сигнатура
Метод
Параметры
Сигнатура
именованный блок команд,
который выполняет действие
входные данные метода:
количество, типы и порядок
имя метода + список параметров
area(int side)
area(int width, int height)
area(double radius)
количество параметров
да
тип параметра
да
порядок параметров
да, но осторожно
только возвращаемый тип
нет
3

4.

Перегрузка как статический полиморфизм
Вызов
sum(2, 3)
Методы
кандидаты
Применимые
по параметрам
Лучший
sum(int,int)
Почему статический?
Плюс
Риск
выбор зависит от объявленных типов
аргументов и выполняется при
компиляции
ошибки с неподходящими
аргументами видны до запуска
программы
похожие типы и преобразования
могут сделать выбор
неочевидным
4

5.

Перегрузка и переопределение
Перегрузка
Переопределение
• одно имя, разные параметры
• наследование не обязательно
• выбор на этапе компиляции
• цель: удобство вызова
• тот же метод в подклассе
• наследование обязательно
• часто выбор во время выполнения
• цель: специализация поведения
print(int value)
print(String text)
class Dog extends Animal {
speak() { ... }
}
5

6.

Правила объявления перегруженных методов
Можно различать
Нельзя различать только по
• количество параметров
• типы параметров
• порядок параметров — осторожно
• возвращаемому типу
• именам параметров
• модификаторам доступа
• списку исключений
void log(String text)
void log(Exception error)
int read()
String read()
Главный критерий качества: все варианты должны сохранять общий смысл операции.
6

7.

Пример Java: метод sum
class Calculator {
int sum(int a, int b) {
return a + b;
}
int sum(int a, int b, int c) {
return a + b + c;
}
sum(2, 3)
sum(int, int)
sum(2, 3, 4)
sum(int, int, int)
sum(2.5, 3.1)
sum(double, double)
double sum(double a, double b) {
return a + b;
}
}
Смысл: компилятор выбирает нужный метод по
числу и типам аргументов.
7

8.

Пример C#: форматирование сообщений
Что показывает код
class MessageFormatter {
string Format(string text) {
return $"Сообщение: {text}";
}
string Format(int number) {
return $"Число: {number}";
}
string Format(string name, int score) {
return $"{name}: {score}";
}
один смысл — формирование текста; входные
данные разные
Важно
перегрузки должны оставаться понятными, особенно
вместе с необязательными параметрами
}
Когда полезно
• форматирование и логирование
• конструкторы и фабрики
• работа с файлами и коллекциями
8

9.

Конструкторы, операторы и параметры по умолчанию
class Rectangle {
Rectangle() {
this(1, 1);
}
Rectangle(int side) {
this(side, side);
}
Rectangle(int w, int h) {
...
}
}
Rectangle()
Rectangle(side)
Rectangle(w,h)
Идея: короткие варианты часто делегируют работу полному
варианту. Так меньше дублирования и меньше ошибок.
Параметры по умолчанию частично заменяют перегрузку, но не всегда
делают интерфейс понятнее.
9

10.

Как компилятор выбирает перегрузку
1
Найти методы
2
с нужным именем
Оставить
доступные
3
и подходящие по числу
Проверить типы
и преобразования
точное совпадение
обычно лучший выбор
int → long / double
возможно расширение типа
null подходит к нескольким типам
может быть неоднозначность
несколько одинаково подходящих методов
ошибка компиляции
4
Выбрать наиболее
точный вариант
10

11.

Типичные ошибки при перегрузке
Неоднозначность null
Только результат
show(String) и show(Integer): вызов show(null) непонятен
компилятору.
int get() и String get() не являются корректными перегрузками.
Разный смысл
Слишком много вариантов
open(path) и open(port) могут запутать: лучше уточнить имена.
длинный список перегрузок усложняет выбор и документацию.
void show(String text)
void show(Integer number)
show(null);
// какой метод?
show((String) null);
11

12.

Практическое применение
Конструкторы
Форматирование
создание объектов разными способами
один метод для разных типов данных
Логирование
Чтение файлов
сообщение, ошибка или оба параметра
путь, файл, поток или массив байтов
Перегрузка полезна там, где одна логическая операция принимает разные формы входных
данных.
12

13.

Чек-лист хорошей перегрузки
1
единый смысл
2
все варианты относятся к одной операции
3
единый порядок
различие видно по типам или количеству
4
аргументы не меняются местами без причины
5
меньше дублирования
короткие методы вызывают более полный вариант
ясные параметры
нет неоднозначности
null, числа и varargs не создают спорных вызовов
6
документация
пользователь понимает, когда какой вариант нужен
13

14.

Вывод
Что даёт перегрузка
• одно имя для одной логической операции
• удобные варианты вызова
• меньше искусственных названий методов
• ранняя проверка ошибок компилятором
Что важно помнить
Перегрузки должны быть понятными, не
создавать неоднозначности и сохранять
общий смысл операции.
14
English     Русский Rules