2012-01-28 4 views
1

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

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

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

ответ

4

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

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

+1

Собирался сказать то же самое о рефакторинге. – perfectionist

6

Это иллюзия. Это просто разделение класса на два физических файла. Вы все еще сталкиваетесь с Single Responsibility Principle, низким cohesion и т. Д.

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

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

3

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

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

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^