Использование частичных классов для управления кодом, хорошее решение? - PullRequest
1 голос
/ 28 января 2012

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

Но в ситуациях, когда классы действительнобольшой, например, когда класс расширяется для реализации функциональности элемента управления (например, Canvas), и есть много разных вещей, таких как тестирование попаданий, рисование, управление нарисованными элементами и т. д. Является ли это хорошим решением для использования частичногоклассы в таких случаях, чтобы отделить «разные» вещи от большего контейнера (например, пользовательский элемент управления)?

Во-вторых, как более общее и более широкое решение, что следует учитывать перед переходом к частичным классам?

Ответы [ 3 ]

6 голосов
/ 28 января 2012

Это иллюзия.Это просто разделение класса на два физических файла.Вы все еще нарушаете Принцип единой ответственности , низкий сплоченность и т. Д.

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

Композиция - один из нескольких способов избежать больших классов.Класс A имеет экземпляр класса B и делегирует ему часть своей функциональности.Во многих случаях внедрение зависимостей может использоваться для разделения двух классов (классу A передается интерфейс, который реализует класс B, обычно в конструкторе A).

4 голосов
/ 28 января 2012

Да, если класс естественно большой, использование частичных классов может помочь вам управлять исходным кодом. Я использовал это раньше, чтобы разделить тесты для одного production файла на несколько исходных тестовых файлов. Аналогично, при переопределении LINQ to Objects я использовал частичные классы, чтобы поместить каждый «оператор» LINQ в свой собственный файл - даже если они все внесли свой вклад в класс с именем Enumerable.

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

3 голосов
/ 28 января 2012

Тестирование попаданий, похоже, не является задачей для canvas, и его легко можно делегировать другому классу, реализующему интерфейс, такой как

public interface IHitTester
{
    List<Shape> GetHits(List<Shape> allShapes, Point point);
}

Улучшает тестируемость, позволяет вам экспериментировать с различными реализациями тестирования на попадание (шаблон стратегии) ​​и улучшает читабельность вашего кода.

Я уверен, что вы можете извлекать другие задачи в другие классы таким же образом, если переосмыслите свой класс холста.

...