Прячьте приведение типов внутрь метода!

пятница, 15 мая 2009 г. ·

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

GetSelectedObject() as Order

После того, как класс ордер перестал использоваться и стал использоваться другой класс, по всему коду стали возникать ошибки. Т.к. исключение не происходит, но в то же время и работает все неправильно. Проблема оказалась в том, что неправильное приведение типа превращалось в null значение переменной, которое вызывало проблемы (или необычное певедение) в других частях системы. Чтобы потом не выискивать все такие места рекомендую сделать слеющий рефаторинг:

Order GetSelectedOrder()
{
return (Order)GetSelectedObject();
}

Метод получение выделенного ордера использовать повсеместно. Если тип объекта поменяется сразу возникает исключение и исправлять придется в одном месте.

Примечания:

Оператор AS является довольно опасным. Т.к. может прятать настоящие ошибки и порождать совсем другие. Чаще всего NullReferenceException в других местах приложения, где их быть не должно. Я уже вижу возражения, что он быстрее чем оператор приведения типа (Cast). Так вот, хочу вас расстроить, последние версии .NET Framework хорошо улучшили скорость работы оператора приведения типов. Особого выигрыша от использования операбота AS вы не почувствуете.

Дальнейшим развитием идееи может служить добавление строго типизированного метода добавление элементров в коллекцию:

AddOrder(Order order)
{
AddObject(order)
}

При таком подходе будет трудно добавить объект неправильного типа в коллекцию.

Обо мне

Моя фотография
Кто к нам с чем и зачем, тот от того и того!