Олег Блохин, Контракт с дьяволом
TRANSCRIPT
Контракт с дьяволом
Олег БлохинSmartStepGroup
SmartStepGroupВнедряем инженерные практики XPСтавим процессы
Предположения – источник ошибок в коде
Утвержденияwhile( thereIsEnemyUnitsAround() ) {
gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); unit.Kill()
}
Утвержденияwhile( thereIsEnemyUnitsAround() ) {
gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); if (unit != null) {
unit.Kill() }
}
Утвержденияwhile( thereIsEnemyUnitsAround() ) {
gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); if (unit == null) {
throw new BusinessException(“…”);} unit.Kill()
}
Утвержденияwhile( thereIsEnemyUnitsAround() ) {
gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); Assert.NotNull(unit); unit.Kill()
}
Контракты ≠ Assert
Корректность не существует без спецификации
Контракты методовметод(параметры):
Условия применимости (параметры, состояние)
Тело методаГарантии
Контракты методовpublic void MoveUnit(player, unit, destination) Require {
playerCanMove(player); unitIsOnBoard(unit);
} { /* код вашего метода */ } Ensure {
getDestination(unit) == destination; }
Контракты методовpublic void MoveUnit(player, unit, destination) Require {
playerCanMove(player); unitIsOnBoard(unit); unitIsAbleToMove(player, unit); destinationIsAchievable(unit, destination);
} { //… } Ensure {
!playerCanMove(player); getDestination(unit) == destination;
}
Контракты – не защитное программирование
Инварианты классовclass Board {
private Player player1; private Player player2; private Player currentPlayer;
Board(player1, player2) { this.player1 = player1; this.player2 = player2; this.currentPlayer = player1;
}
public MakeTurn(...){...}
Invariant { CurrentPlayerAlwaysGameParticipant: currentPlayer == player1 || currentPlayer == player2
} }
Документация, исполняемая вместе с
кодом –
не устаревает
ПреимуществаНеустаревающая спецификацияКорректностьОсознанность решенийУменьшение страхаОтказ от защитного программирования
НедостаткиНадо больше думатьПоддержка корректности спецификацииНадо явно обеспечить надёжностьТребует внедрения
Как применить?Контракты есть для вашего языкаЕсли нет – вы всё равно можете их использоватьЕсли боитесь – выберите ту часть, которая вам кажется безопасной
Уровни срабатывания Машина разработчикаСборка для тестированияПродакшн
ИтогКорректность не существует без спецификацииКонтракт – исполняемая спецификация в кодеУровни контрактов:
Реализация - утверждения (Assert)Интерфейс - контракты методаСемантика - инварианты класса
СсылкиБертран Мейер, Основы ООПHunt & Thomas, Pragmatic ProgrammerТепляков Сергей, «Проектирование по контракту»
КонтактыОлег
[email protected], VK, twitter, instagram, linkedin