Это зависит от того, является ли это условие (writeCommand != null
в данном случае) обязательным как для метода CommandConsumerCount, так и для метода IsOwnerOf, или же оно является требованием только для метода IsOwnerOf.
Если это условие действительно требуется только для метода IsOwnerOf, то было бы нормально пропустить его из метода CommandConsumerCount.
Однако, если это условие требуется обоими методами, я придерживаюсь своего первоначального ответа ниже:
Я думаю, что, поскольку оба ваших метода общедоступны, требования контракта следует повторить. Если у вас был закрытый метод, который выполнял реальную работу, которую вызывали как метод IsOwnerOf, так и метод CommandConsumerCount (вместо метода CommandConsumerCount, вызывающего метод IsOwnerOf), то было бы хорошо пропустить вызов Contract.Requires внутри приватный метод.
Что касается производительности ... Меня не беспокоит влияние этих проверок на производительность, если только логика самих проверок не очень сложна. Вы можете настроить компилятор на исключение этих вызовов к Contract.Requires из скомпилированного вывода в разделе «Code Contracts» свойств проекта (при условии, что у вас установлен необходимый плагин).
Возможно, я упускаю суть вашего вопроса, хотя. Вы спрашиваете, нормально ли полностью опускать вызов IsOwnerOf внутри метода CommandConsumerCount? В этом случае я бы оставил вызов на месте, но если это касается производительности, я бы сконфигурировал проект так, чтобы исключить этот вызов для сборок Release, предполагая, что я выполнил достаточное тестирование со сборкой Debug, чтобы убедиться, что это условие выполняется. удовлетворены.
РЕДАКТИРОВАТЬ: после перечитывания вопроса становится ясно, что вы спрашиваете о проверке writeCommand != null
, поэтому я вычеркнул вышеприведенный абзац.
Пример кода ниже добавления частного метода, который выполняет фактическую работу метода IsOwnerOf.
// you may want to choose a different name for this method
private bool _IsOwnerOf(IWriteCommand)
{
// actual work is done here in this private method
return default(bool);
}
public bool IsOwnerOf(IWriteCommand writeCommand)
{
Contract.Requires(writeCommand != null);
// call the private method to perform the actual work
return _IsOwnerOf(writeCommand);
}
public int CommandConsumerCount(IWriteCommand writeCommand)
{
Contract.Requires(writeCommand != null);
Contract.Requires(_IsOwnerOf(writeCommand)); // call the private _IsOwnerOf method instead of the public method
Contract.Ensures(Contract.Result<int>() >= 0);
return default(int);
}