Олег Блохин, Контракт с дьяволом

35
Контракт с дьяволом Олег Блохин SmartStepGroup

Upload: scrumtrek

Post on 07-Jan-2017

173 views

Category:

Business


0 download

TRANSCRIPT

Page 1: Олег Блохин, Контракт с дьяволом

Контракт с дьяволом

Олег БлохинSmartStepGroup

Page 2: Олег Блохин, Контракт с дьяволом

SmartStepGroupВнедряем инженерные практики XPСтавим процессы

Page 3: Олег Блохин, Контракт с дьяволом
Page 4: Олег Блохин, Контракт с дьяволом

Предположения – источник ошибок в коде

Page 5: Олег Блохин, Контракт с дьяволом
Page 6: Олег Блохин, Контракт с дьяволом
Page 7: Олег Блохин, Контракт с дьяволом
Page 8: Олег Блохин, Контракт с дьяволом
Page 9: Олег Блохин, Контракт с дьяволом
Page 10: Олег Блохин, Контракт с дьяволом
Page 11: Олег Блохин, Контракт с дьяволом
Page 12: Олег Блохин, Контракт с дьяволом

Утвержденияwhile( thereIsEnemyUnitsAround() ) {

gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); unit.Kill()

}

Page 13: Олег Блохин, Контракт с дьяволом

Утвержденияwhile( thereIsEnemyUnitsAround() ) {

gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); if (unit != null) {

unit.Kill() }

}

Page 14: Олег Блохин, Контракт с дьяволом

Утвержденияwhile( thereIsEnemyUnitsAround() ) {

gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); if (unit == null) {

throw new BusinessException(“…”);} unit.Kill()

}

Page 15: Олег Блохин, Контракт с дьяволом

Утвержденияwhile( thereIsEnemyUnitsAround() ) {

gameContext.SelectUnit(killingStrategy);var unit = gameContext.GetSelectedUnit(); Assert.NotNull(unit); unit.Kill()

}

Page 16: Олег Блохин, Контракт с дьяволом

Контракты ≠ Assert

Page 17: Олег Блохин, Контракт с дьяволом
Page 18: Олег Блохин, Контракт с дьяволом

Корректность не существует без спецификации

Page 19: Олег Блохин, Контракт с дьяволом
Page 20: Олег Блохин, Контракт с дьяволом

Контракты методовметод(параметры):

Условия применимости (параметры, состояние)

Тело методаГарантии

Page 21: Олег Блохин, Контракт с дьяволом
Page 22: Олег Блохин, Контракт с дьяволом

Контракты методовpublic void MoveUnit(player, unit, destination) Require {

playerCanMove(player); unitIsOnBoard(unit);

} { /* код вашего метода */ } Ensure {

getDestination(unit) == destination; }

Page 23: Олег Блохин, Контракт с дьяволом

Контракты методовpublic void MoveUnit(player, unit, destination) Require {

playerCanMove(player); unitIsOnBoard(unit); unitIsAbleToMove(player, unit); destinationIsAchievable(unit, destination);

} { //… } Ensure {

!playerCanMove(player); getDestination(unit) == destination;

}

Page 24: Олег Блохин, Контракт с дьяволом

Контракты – не защитное программирование

Page 25: Олег Блохин, Контракт с дьяволом
Page 26: Олег Блохин, Контракт с дьяволом
Page 27: Олег Блохин, Контракт с дьяволом

Инварианты классов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

} }

Page 28: Олег Блохин, Контракт с дьяволом

Документация, исполняемая вместе с

кодом –

не устаревает

Page 29: Олег Блохин, Контракт с дьяволом

ПреимуществаНеустаревающая спецификацияКорректностьОсознанность решенийУменьшение страхаОтказ от защитного программирования

Page 30: Олег Блохин, Контракт с дьяволом

НедостаткиНадо больше думатьПоддержка корректности спецификацииНадо явно обеспечить надёжностьТребует внедрения

Page 31: Олег Блохин, Контракт с дьяволом

Как применить?Контракты есть для вашего языкаЕсли нет – вы всё равно можете их использоватьЕсли боитесь – выберите ту часть, которая вам кажется безопасной

Page 32: Олег Блохин, Контракт с дьяволом

Уровни срабатывания Машина разработчикаСборка для тестированияПродакшн

Page 33: Олег Блохин, Контракт с дьяволом

ИтогКорректность не существует без спецификацииКонтракт – исполняемая спецификация в кодеУровни контрактов:

Реализация - утверждения (Assert)Интерфейс - контракты методаСемантика - инварианты класса

Page 34: Олег Блохин, Контракт с дьяволом

СсылкиБертран Мейер, Основы ООПHunt & Thomas, Pragmatic ProgrammerТепляков Сергей, «Проектирование по контракту»

Page 35: Олег Блохин, Контракт с дьяволом

КонтактыОлег

[email protected], VK, twitter, instagram, linkedin