n Принцип подстановки Барбары Лисковой
l Пусть q(x) является свойством, верным относительно объектов x некоторого типа T. Тогда q(y) должно быть верным для объектов y типа S, где S является подтипом типа T
l (Р.С. Мартин) Использующие базовый тип функции должны иметь возможность использовать подтипы базового типа не зная об этом
l (Б. Мейер) Дочерний класс не должен нарушать контракт родительского класса
n Требования к сигнатурам операций дочерних классов
l Типы аргументов не должны быть уже
l Типы возвращаемых значений не должны быть шире
l Не должны выбрасываться новые типы исключений, кроме случаев, когда новое исключение является подтипом исключения из родительской сигнатуры
l Область доступа операции не должна сужаться
ТАК МОЖНО
public class Rectangle{
double height, width;
// методы set и get
}
public class MyClass {
public static Rectangle zoomRectangle(Rectangle rect,
double zoomHeight, double zoomWidth) {
rect.setHeight(rect.getHeight() * zoomHeight);
rect.setWidth(rect.getWidth() * zoomWidth);
return rect;
}
public static void main(String[] args) {
Rectangle r1 = new Rectangle();
r1.setHeight(5);
r1.setWidth(2);
zoomRectangle(r1, 1, 2);
System.out.println("Area: " + r1.getHeight() * r1.getWidth());
}
}
ТАК НЕЛЬЗЯ!
public class Square extends Rectangle{
public void setHeight(double h) {height = width = h;}
public void setWidth(double w) {height = width = w;}
}
public class MyClass {
public static Rectangle zoomRectangle(Rectangle rect,
double zoomHeight, double zoomWidth) {
rect.setHeight(rect.getHeight() * zoomHeight);
rect.setWidth(rect.getWidth() * zoomWidth);
return rect;
}
public static void main(String[] args) {
Rectangle r1 = new Square();
r1.setHeight(5);
r1.setWidth(2);
zoomRectangle(r1, 1, 2);
System.out.println("Area: " + r1.getHeight() * r1.getWidth());
}
}
Вопрос 32 Закон Деметры, принципы KISS и YAGNI. 40-42 Отношения между типами и особенности разработки
Law of Demeter
n Закон Деметры (принцип наименьшего знания)
l Каждый модуль должен обладать ограниченным знанием о других модулях: должен знать только о модулях, которые имеют к нему непосредственное отношение
l Каждый модуль должен взаимодействовать только с известными ему модулями и не должен «разговаривать с незнакомыми»
l Каждый модуль должен обращаться только к своим непосредственным друзьям
n Объект A может вызвать сервис (метод) объекта B, но не может использовать объект B для получения доступа к объекту C, чтобы использовать его методы
n Метод m() объекта O может вызывать только
методы следующих объектов
l Сам объект O
l Объекты-параметры метода m()
l Любые объекты, созданные в ходе выполнения m()
l Объектов, непосредственно ассоциированных с O
l Глобальные переменные, доступные O в контексте m()
Принцип YAGNI
n You ain’t gonna need it
l Реализуйте что-то, только если оно вам действительно нужно
l Не реализуйте что-то, использование чего вытолько предвидите
n Требуется разумный баланс со здравым смыслом
Принцип KISS
n Keep it simple, stupid
l Keep it simple and stupid
l Keep it short and simple
n Простота должна быть одной из основных целей в ходе разработки
n Следует уходить от необоснованных сложностей
Вопрос 33 Понятие исключения, причины возникновения, механизм обработки. 2-8 Классификация исключений. Лекция Исключительные ситуации и их обработка
Э… Проблемы
n В процессе выполнения программные приложения встречаются с ситуациями, приводящими к возникновению ошибок
l Ошибки бывают различной степени тяжести
l Ошибки необходимо каким-либо
способом учитывать
и обрабатывать
n Ошибки возникают в случае:
l некорректного ввода данных
l сбоев оборудования
l нарушения ограничений среды
l выполнения программного кода
Обработка ошибок
n Обеспечение стабильности и надежности работы программы
n Дружественное поведение конечного программного продукта
n Безопасность в процессе выполнения
n Удобство при написании программного кода (ПРОТИВОРЕЧИЕ)
Подходы к обработке ошибок
n Возвращение методом кода ошибки
l Возвращается только код ошибки
int errNum = firstMethod();
if (errNum == -1) {
// обработка 1- ой ошибки
}
else if(errNum == -2) {
// обработка 2- ой ошибки
}
n Используются «свободные» значения возвращаемого типа
if (( ans = sqrt ( val )) < 0) {
// Обработка ошибки
}
else {
// Продолжение вычислений
}
n Встроенный в язык механизм проверки и обработки
try {
someBusinessLogic();
...
anotherBusinessLogic()
}
catch(Exception1 e1) {
// обработка 1- ой ошибки
}
...
catch(ExceptionN eN) {
// обработка N- ой ошибки
}
finally {
// выполнение завершающих
// работу действий
}
Механизм обработки
n Создается и «выбрасывается» объект исключения, содержащий информацию об ошибке
n Выполнение текущего потока вычислений приостанавливается
n Завершается выполнение блоков и методов в цепочке вызовов, пока не будет найден код, отлавливающий исключение
n Выполнение потока вычислений возобновляется, причем выполняется код обработчика исключения
Дата: 2019-07-30, просмотров: 263.