MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Безопасность использования методов расширения"
Answer 948204
Получается, методы расширения — это опасная штука?
Да, это несомненно так. Методы расширения — грубый хак, нарушающий принципы объектно-ориентированного программирования, и помимо проблемы неконтролируемого скрытия членами расширяемого класса они также страдают от проблемы конфликтов между самими собой (ведь разные библиотеки могут создавать методы расширения для одного класса). Чрезмерно использовать их не стоит.
Framework Design Guidelines явно не рекомендуют это:
AVOID frivolously defining extension methods, especially on types you don’t own.
Там же упоминают два случая, когда использование методов расширения оправдано:
Добавление какого-либо функционала во все типы, реализующие определенный интерфейс. В этом случае опасность несколько ниже, ведь в интерфейсы обычно не добавляют новые методы (так как это требовало бы переписывания кода кучи классов, которые уже реализуют этот интерфейс). Именно таким образом работает LINQ.
Методы, завязанные на типы, определенные в вашем собственном коде. Допустим, вы создаете метод расширения к классу
String
, принимающий аргумент типаPerson
, определенного в вашем проекте. В этом случае описанного конфликта также не будет, ведь даже если MS добавят новый метод в классString
, он точно никак не будет использовать класс из вашего кода.К сожалению, следование этим рекомендациям все равно полностью не решает проблемы, так как остаются конфликты между самими методами расширений из разных библиотек. Именно с этой проблемой столкнулись разработчики библиотеки MoreLinq.
Конечно, Framework Design Guidelines — это рекомендации для разработчиков публичных API библиотек, а не любого кода в приложениях. Но сути это мало меняет, так как нужно стремиться делать любой код пригодным к повторному использованию. Проекты имеют тенденцию расти, разделяться и т.п; какой-то код, который раньше использовался только в одном проекте, впоследствии захочется вынести в общую библиотеку. Поэтому эти рекомендации во многом можно распространить и на код приложений.
Обновление. В C# 8.0 появилась новая возможность - методы интерфейсов по умолчанию. Благодаря ей, библиотеки могут добавлять новые методы в интерфейс, не нарушая обратной совместимости. Поэтому, для методов расширения интерфейсов теперь также существует проблема потенциального скрытия методом расширяемого интерфейса.
С другой стороны, это нововведение уменьшает необходимость писать методы расширения для добавления функционала в интерфейсы, так как этот функционал можно теперь реализовать в виде методов по умолчанию.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.