Цитата(Lomir @ 12.6.2009, 09:55 ) | По 10-15 уж точно не передаються, а вот по 4-6 довольно часто. 6 обьеков это 24 строчки безсмысленного кода. В случае когда какие то парамерты могут быть null утчен, работает немного измененный выриант. |
Цитата(Lomir @ 12.6.2009, 09:55 ) | Если какой-то параметр может быть null, мы его просто не передаем в ValidateNotNull и он не проверяется. При этом этот вариант не будет иметь никаких проблем с производительность, так как тут используется рефлексия тока в случаенеправильного использования, и оно будет исправленно. |
Этот вариант лучше, но тоже хромает - т.к. упирается в ту же проблему - достать значения из чужого стэка, что проблематично без отладочных символов. Может быть что-то этого, в качестве компромиса
Код | void ValidateNotNull(Dictionary<string, object> parameters) { foreach(var param in parameters) { if (param.Value == null) { throw new ArgumentNullException(param.Key); } } }
void SomeFunction(object someObj1, object someObj2) { ValidateNotNull(new Dictionary<string, object>() { { "someObj1", someObj1 }, { "someObj2", someObj2 } }); }
|
Цитата(Lomir @ 12.6.2009, 09:55 ) | Это не uber-хак, а просто обощение стандартный действий програмиста. По такой логике можно сказать что generic'и и мета-програмирование это тоже uber-хаки. |
generic'и не пытаются вывести тип из имени переменной. хотя было бы неплохо - var intStringDictionary = new(); вот когда научатся - тоже станут убер-хаками.
Цитата(Lomir @ 12.6.2009, 09:55 ) | ИМХО проверка параметров не является частью логики функции, так как не является полезной работой функции (а в конечной версии програмы этот код вопше не используется). В особо критических ко времени приложениях обычно вопше ничего не проверяют, а просто пишут в документации и в случае неправильных параметров получают Undefined Behavior. |
Для критических ко времени приложений существуют Trace/Debug.Assert, которые можно вырезать из релиза.
Цитата(Lomir @ 12.6.2009, 09:55 ) | Как обьекты могут быть не на стеке? Они же могут (и даже будут) использоваться после успешного окончания функции ValidateNotNull(). |
Зато значения (теоретически) могут быть не те. Например, проц/jit могут переставить местами строки 4 и 5. Причем вылезет это только в release configuration.
Код | void SomeFunction(object someObj1, object someObj2) { var someNewValue = new object(); ValidateNotNull(); someObj1 = someNewValue; }
|
Добавлено через 12 минут и 1 секунду archeg, да, интерсепторы вполне решают проблему, довольно красиво. Но велосипеды - интереснее ;) |