Чрезмерное использование методов расширения плохо по той же причине, что чрезмерное использование перегруженных операторов плохо. Позвольте мне объяснить.
Давайте сначала посмотрим на пример перегрузки операторов. Когда вы видите код:
var result = myFoo + myBar;
Вы хотели бы надеяться, что myFoo
и myBar
являются числовыми типами, а operator +
выполняет сложение. Это логично, интуитивно понятно, легко понять. Но как только перегрузка оператора входит в картину, вы больше не можете быть уверены в том, что на самом деле делает myFoo + myBar
- оператор + может быть перегружен на , что означает что-то . Вы не можете просто прочитать код и понять, что происходит, не читая весь код, лежащий в основе типов, участвующих в выражении. Теперь operator +
уже перегружен для таких типов, как String
или DateTime
, однако существует интуитивно понятное толкование того, что означает добавление в этих случаях. Что еще более важно, в этих распространенных случаях это добавляет много выразительной силы в код. Так что это стоит потенциальной путаницы.
Так, что все это имеет отношение к методам расширения? Ну, методы расширения создают похожую ситуацию. Без методов расширения, когда вы видите:
var result = myFoo.DoSomething();
Вы можете предположить, что DoSomething()
является либо методом myFoo
, либо одним из его базовых классов. Это просто, легко понять, даже интуитивно понятно. Но с помощью методов расширения DoSomething()
может быть определено где угодно - и, что еще хуже, определение зависит от набора using
операторов в файле кода и может включать в себя потенциально много классов, любой из который может содержать реализацию DoSomething()
.
Теперь не поймите меня неправильно. Как перегрузка операторов, так и методы расширения являются полезными и мощными языковыми функциями. Но помните - с великой силой приходит большая ответственность . Вы должны использовать эти функции, когда они улучшают ясность или возможности реализации. Если вы начнете использовать их без разбора, они добавят путаницы, сложности и, возможно, дефектов в то, что вы пытаетесь создать.