Я не так много сделал с Контрактами на код, но вот некоторые наблюдения:
Одним из преимуществ контрактов на код является возможность взглянуть на контракт для конкретного метода и узнать, что ожидается.Наблюдение CarContractHelper.Validate(Contract.Result<Car>())
на самом деле ничего не говорит мне, поэтому мне пришлось бы детализировать, чтобы узнать, что (например) возвращаемое значение CarId
больше нуля.Так что в одном случае я бы предпочел Contract.Ensure(Contract.Result<Car>().CarId > 0)
и, возможно, несколько других требований.С другой стороны, я вижу, как это может создать много повторяющегося кода контракта, с которым будет трудно работать, если (например) вы добавите новое свойство в класс Car
.
Еще одним потенциальным преимуществом контрактов с кодами является возможность проверки ваших требований во время компиляции.Например, рассмотрим следующий код:
var car = _carService.GetCar();
_crashTestUtil.TestCar(car);
Если в контракте TestCar требуется, чтобы car.CarId > 0
и GetCar()
не удалось обеспечить это, компилятор может предупредить вас об этом факте.Для того чтобы это работало с вспомогательным классом проверки, я полагаю, что вам нужно убедиться, что ваш вспомогательный класс проверки также использует методы контракта кода для выполнения проверок контракта.
Несмотря на то, что вы выполняете проверки для установщиков свойств класса Car, я думаю, что все же имеет смысл проверить, что все необходимые значения были установлены до того, как этот метод вернется.