Частичные методы считаются вредными? - PullRequest
3 голосов
/ 26 ноября 2009

В C # 3.0 Microsoft ввела поддержку так называемых частичных методов .

Вы их используете? Можете ли вы описать, как и почему?

Считаете ли вы использование частичных методов хорошей практикой программирования или нет?

Ответы [ 6 ]

10 голосов
/ 26 ноября 2009

Частичные методы в первую очередь полезны для расширения поведения кода, сгенерированного инструментом, без затрат на оценку времени выполнения или на код, видимый пользователю, где такая расширяемость не используется.

Как таковое, их использование целесообразно и поощряется там, где это необходимо, но такие случаи будут относительно редкими для большинства пользователей (которые не пишут инструменты для генерации кода). Если вы пишете такой инструмент, то следует подумать о том, где люди могут взаимодействовать с потоком вашего сгенерированного кода, и не может ли такое использование быть легко обработано с помощью механизмов, подобных событиям, при достижении запланированных целей производительности и удобства использования. События по сути являются многоадресными, и такая структура может по своей сути противоречить предполагаемому дизайну API. В качестве альтернативы может потребоваться сложное возвращаемое значение или взаимодействие с параметрами ref / out, и, наконец, расширение может быть сложным / хрупким, несмотря на свою полезность, и, таким образом, только частичный разработчик класса может быть в состоянии адекватно справиться с этим. Все эти причины имеют свою нишу, если не являются общими, а частичные методы могут эффективно их решить.

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

1 голос
/ 26 ноября 2009

У меня была возможность использовать частичный метод в библиотеке классов, которую я написал. Было возможно скомпилировать библиотеку в одну из нескольких различных версий с использованием определенных констант, которые будут компилировать или компилировать различные блоки функций.

Но засорение кода с помощью #if / #endif для всех комбинаций опций, в сочетании с Compact Framework, а также с настольным фреймворком, привело к некоторым путаницам.

Я использовал частичные методы, чтобы упростить этот фрагмент - как невидимый или неявный # if / # endif. Это похоже на то, как они используются в LINQ, насколько я понимаю.

С другой стороны, во время выполнения я не добавляю эти методы, как это делает или делает LINQ. В отличие от модели linq, где есть отдельные сборки и когда вы комбинируете, вы получаете дополнительную функцию, в моем классе lib есть отдельная DLL, созданная для каждой комбинации опций. Это облегчает развертывание и потребление.

1 голос
/ 26 ноября 2009

Как и сами частичные классы, они полезны только в сочетании с кодом, созданным инструментом (дизайнером). И там они предоставляют простую, легкую альтернативу событиям.

0 голосов
/ 26 ноября 2009

Частичные классы - очень полезная функция, например, когда у вас есть клиент и сервер, и им обоим необходимо совместно использовать типы данных для сохранения бизнес-объекта. У вас есть серверная часть вашего обычного класса, вы выставляете ее на стороне клиента с вашим веб-сервисом, и если вы хотите украсить вещи на стороне клиента, очень красиво, вы можете сделать частичную версию вашего класса (на стороне клиента у вас есть сгенерированная кодом версия версия сервера через генерацию прокси и т. д.).

Я просто хотел сказать этот пример, так как сейчас я широко использую частичную функцию, работая над проектом silverlight, сохраняя отключенные объекты:)

// Извините, что не заметил, что вопрос явно относится к методам. Частичные методы очень полезны для создания функций кода в обработчиках событий, автоматически генерируемых в определенных сценариях.

0 голосов
/ 26 ноября 2009

Частичные классы делают C # и VB более похожими на C и C ++, где вы можете разбросать код, который реализует класс, по разным файлам, как считаете нужным. Их основная цель - поддержка визуальных дизайнеров для таких вещей, как WPF. Я считаю, что это хорошее применение для частичных классов.

Другое использование, которое я видел, - это разбиение большого исходного файла на логические части. Например, class BigForm может охватывать файлы BigForm-BillingInfo.cs, BigForm-ShippingInfo.cs и BigForm-LineItems.cs. Обычно это плохое использование частичных классов, потому что рефакторинг на несколько классов или элементов управления лучше проектирование ООП (для повторного использования и т. Д.).

0 голосов
/ 26 ноября 2009

Культура программирования Microsoft всегда отдавала предпочтение более свободному подходу «клейкой ленты». Это восходит, по крайней мере, к Быстром Бейсику против Турбо Паскаля. Языки Microsoft позволяют использовать ярлыки. Возьмем, к примеру, делегатов: делегат - это, по сути, интерфейс, который вы забыли спроектировать. Частичные методы - это всего лишь одно и то же.

Название вашего вопроса относится к печально известному письму Эдсгер Дейкстры в CACM, и это очень уместно. Письмо Дейкстры было официальным стартовым оружием для войн структурированного программирования. Лично я не думаю, что ты найдешь мудрость, отстаивая или сложный, или неструктурированный путь во всех ситуациях.

Я всегда думал, что этот конфликт был результатом различий в ракурсе инженерии и информатики. Все программисты Microsoft весь день программировали голое железо. После того, как вы написали достаточно ассемблера, требования структурированного программирования кажутся немного глупыми.

Компромисс сводится к следующему: хотите ли вы достаточно веревки, чтобы повеситься, или вы хотели бы быть вынуждены переписать части вашей архитектуры, чтобы удовлетворить негибкость языка? Дисциплинированная команда может написать хороший код в любой среде, и универсального правильного ответа не существует.

Возвращаясь к заданию: я не думаю, что частичные методы - это отличная языковая функция, но если они необходимы для работы LINQ, их определенно стоит терпеть.

...