В книге Прагматичный программист авторы предполагают, что все входные данные метода должны быть проверены. Это позволяет рано обнаруживать проблемы с методом и легко отслеживать их источники.
В своем приложении Mac я достиг этого, создав класс Assert
. Этот класс имеет несколько методов класса. Эти методы определяют, выполняется ли какое-либо предварительное условие, а если нет, то выдается исключение. Типичное утверждение может выглядеть примерно так:
-(void) setWidth: (int) theWidth {
[Assert integer: width isGreaterThanInteger: 0];
width = theWidth;
}
Это работает очень хорошо, и значительно сокращает время, которое я трачу на поиск ошибок. Однако в последнее время я заметил, что некоторые из методов утверждения очень полезны в качестве предикатов. Например, мои integer:isGreaterThanInteger:andLessThanInteger:
и мои stringIsNotEmpty:
методы одинаково полезны. С этой целью я создал второй класс Predicate
, который я заполнил несколькими из моих более полезных методов предикатов. Поэтому я взял логику из методов assert и переместил ее в Predicate
, а затем переписал мои Assert
методы, подобные следующим:
if ![Predicate predicateMethod]
throw exception
Это превратилось в кошмар обслуживания. Если я изменю имя метода в Predicate
, я также должен изменить его в Assert
, чтобы он оставался последовательным. Если я обновлю документацию по методу Assert
, то я должен сделать то же самое с методом Predicate
.
В идеале я хотел бы восстановить класс Assert
так, чтобы при вызове любого метода он перехватывал селектор. Затем класс Predicate
можно проверить, чтобы узнать, отвечает ли он на селектор, и, если это так, метод вызывается на Predicate
с теми же аргументами, которые были переданы в метод Assert
. Если метод Predicate
возвращает false, генерируется исключение.
Есть ли способ сделать это в Objective-C?
Спасибо.