Сведения о вопросе

FUTER

16:46, 23rd August, 2020

Теги

Работает Ли Для Вас Дизайн По Контракту?

Просмотров: 425   Ответов: 10

Используете ли Вы дизайн по контракту профессионально? Это то, что вы должны сделать с самого начала проекта, или вы можете переключить передачу и начать включать ее в свой жизненный цикл разработки программного обеспечения? Что вы нашли в качестве плюсов / минусов подхода к дизайну?

Я столкнулся с подходом проектирования по контракту в курсе аспирантуры. В академической среде это казалось довольно полезным приемом. Но в настоящее время я не использую дизайн по контракту профессионально, и я не знаю других разработчиков, которые используют его. Было бы неплохо услышать о его фактическом использовании от толпы SO.



  Сведения об ответе

FAriza

02:59, 5th August, 2020

Я не могу рекомендовать его достаточно высоко. Это особенно приятно, если у вас есть набор, который принимает встроенные спецификации контрактов документации, например:

// @returns null iff x = 0
public foo(int x) {
  ...
}

и превращает их в генерируемые модульные тесты, вот так:

public test_foo_returns_null_iff_x_equals_0() {
  assertNull foo(0);
}

Таким образом, вы можете видеть выполняемые тесты, но они автоматически генерируются. Кстати, сгенерированные тесты не следует проверять в системе управления версиями.


  Сведения об ответе

PIRLO

08:27, 21st August, 2020

Вы действительно можете оценить дизайн по контракту, когда у вас есть интерфейс между приложениями, которые должны разговаривать друг с другом.

Без контрактов эта ситуация быстро превращается в игру в большой теннис. Команды продолжают стучать обвинениями туда-сюда, и огромное количество времени тратится впустую.

С контрактом вина очевидна.

Удовлетворил ли звонивший предварительные условия? Если нет, то команда клиента должна это исправить.

Учитывая действительный запрос, удовлетворил ли получатель почтовые условия? Если нет, то команда сервера должна это исправить.

Соблюдали ли обе стороны договор, но результат оказался неудовлетворительным? Контракт является недостаточным, и этот вопрос необходимо обострить.

Для этого вам не нужно, чтобы контракты были реализованы в форме утверждений, вам просто нужно убедиться, что они задокументированы и согласованы всеми сторонами.


  Сведения об ответе

piter

06:01, 25th August, 2020

Если вы посмотрите на STL, boost, MFC, ATL и многие проекты с открытым исходным кодом, вы можете увидеть, что существует так много утверждений ASSERTION, и это делает проект более безопасным.

Design-By-Contract! Это действительно работает в реальном продукте.


  Сведения об ответе

nYU

15:53, 26th August, 2020

Фрэнк Крюгер пишет::

Gaius: исключение указателя Null автоматически выбрасывается для вас средой выполнения, нет никакой пользы в тестировании этого материала в прологе функции.

У меня есть два ответа на это:

  1. Null был просто примером. Для квадрата (x) я бы хотел проверить, что квадратный корень из результата является (приблизительно) значением параметра. Для сеттеров я бы хотел проверить, что значение действительно изменилось. Для атомарных операций я бы хотел проверить, что все операции компонентов завершились успешно или все потерпели неудачу (на самом деле один тест на успех и n тестов на неудачу). Для фабричных методов в слабо типизированных языках я хочу проверить, что возвращается правильный тип объекта. Этот список можно продолжать и продолжать. В принципе, все, что может быть протестировано в одной строке кода, является очень хорошим кандидатом для контракта кода в комментарии пролога.

  2. Я не согласен с тем, что вы не должны тестировать вещи, потому что они генерируют исключения времени выполнения. Во всяком случае, вы должны протестировать вещи, которые могут генерировать исключения среды выполнения. Мне нравятся исключения времени выполнения, потому что они заставляют систему быстро отказывать , что помогает отладке. Но null в этом примере было результирующим значением для некоторых возможных входных данных. Есть аргумент, чтобы никогда не возвращаться null , но если вы собираетесь это сделать, вы должны проверить его.


  Сведения об ответе

JUST___

02:08, 8th August, 2020

Совершенно глупо не проектировать по контракту, когда вы делаете что-либо в SOA realm, и это всегда полезно, если вы работаете над какой-либо модульной работой, где биты & частей могут быть заменены позже, особенно если задействованы какие-либо черные ящики.


  Сведения об ответе

ASSembler

07:21, 27th August, 2020

Как модульное тестирование, так и проектирование по контракту являются ценными тестовыми подходами в моем опыте.

Я пробовал использовать Design by Contract в рамках системы автоматического тестирования, и мой опыт показывает, что это дает гибкость и возможности, которые нелегко получить с помощью модульного тестирования. Например, можно запустить более длинную последовательность и проверить, что время ответа находится в пределах допустимых значений при каждом выполнении действия.

Глядя на презентации на InfoQ, можно сделать вывод, что проектирование по контракту является ценным дополнением к обычным модульным тестам на этапе интеграции компонентов. Например, можно сначала создать макет интерфейса, а затем использовать компонент после- или когда выпускается новая версия компонента.

Я не нашел инструментария, охватывающего все мои требования к дизайну для проектирования путем контрактного тестирования в платформе .Net/Microsoft.


  Сведения об ответе

$DOLLAR

11:58, 13th August, 2020

Вместо более выразительных систем типа я бы абсолютно использовал дизайн по контракту для проектов военного класса.

Для слабо типизированных языков или языков с динамической областью видимости (PHP, JavaScript) функциональные контракты также очень удобны.

Для всего остального я бы отбросил его в сторону, полагаясь на бета-тестеры и юнит-тесты.

Gaius : исключение указателя Null автоматически выбрасывается для вас средой выполнения, нет никакой пользы в тестировании этого материала в прологе функции. Если вас больше интересует документация, то я бы использовал аннотации, которые можно использовать со статическими анализаторами и тому подобное (чтобы убедиться, что код не нарушает ваши аннотации, например).

Более сильная типовая система в сочетании с проектированием по контракту, по-видимому, является правильным путем. Посмотрите на Spec# для примера:

Язык программирования Spec#. Spec# является продолжением объектно-ориентированного язык C#. он расширяет тип система для включения не-null типов и отмеченное исключение. Он обеспечивает способ заключения договоров в форме пре- и постусловия, а также объект инварианты.


  Сведения об ответе

KOMP

04:50, 26th August, 2020

Я считаю, что это говорит о том, что язык программирования Go не имеет конструкций, которые делают возможным проектирование по контракту. panic/defer/recover не совсем так, поскольку логика отсрочки и восстановления позволяет игнорировать панику, IOW-игнорировать разорванный контракт. По крайней мере, нужна какая-то форма безвозвратной паники, которая на самом деле есть. Или, в лучшем случае, прямая языковая поддержка проектирования контрактными конструкциями (пред-и постусловия, реализация и инварианты классов). Но учитывая твердолобость языковых пуристов за штурвалом корабля Go, я даю мало изменений в любом из этих дел.

Можно реализовать поведение типа assert, проверив наличие специальной ошибки assert в функции last defer в паникующей функции и вызвав runtime.Breakpoint() для сброса стека во время восстановления. Чтобы быть уверенным, подобное поведение должно быть условным. Конечно, этот подход разваливается, когда новая функция defer добавляется после той, что делает assert. Что произойдет в большом проекте точно в неподходящее время, что приведет к пропущенным ошибкам.

Моя точка зрения заключается в том, что утверждение полезно во многих отношениях, так что необходимость танцевать вокруг него может быть головной болью.


  Сведения об ответе

nYU

13:07, 15th August, 2020

Да, это так! На самом деле несколько лет назад я разработал небольшую структуру для проверки аргументов. Я делал проект SOA, в котором различные внутренние системы выполняли все виды проверки и проверки. Но чтобы увеличить время отклика (в тех случаях, когда ввод был недействительным, и уменьшить нагрузку на эти внутренние системы), мы начали проверять входные параметры предоставляемых услуг. Не только для Not Null, но и для строковых шаблонов. Или значения внутри наборов. А также случаи, когда параметры имели зависимости между собой.

Теперь я понимаю, что мы реализовали в то время небольшой проект по контракту. :)

Вот ссылка для тех, кто заинтересован в небольшой структуре проверки аргументов Java . Который реализован как простое решение Java.


  Сведения об ответе

COOL

00:15, 5th August, 2020

На самом деле я не использую дизайн по контракту, на ежедневной основе. Однако я знаю, что он был включен в язык D , как часть языка.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться