Подтвердить что ты не робот

Рекомендации: когда нет/использовать частичные классы

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

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

Как вы думаете? Есть ли проблема с использованием частичных классов, подобных этому, или она сводится к предпочтению?

Например, у меня обычно есть что-то вроде этого:

  • MainClass.cs
  • MainClass.Helper1.cs
  • MainClass.Helper2.cs

...

// Inside of MainClass.cs I have code like this:

public abstract partial class MainClass
{
    // ...
}

// Then in the MainClass.Helper1.cs I have:

partial class MainClass
{
   private class Helper1
   {
       // ...
   }
}
4b9b3361

Ответ 1

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

Ответ 2

Лично я не вижу ничего плохого в использовании частичных классов, подобных этому, но это только мое собственное мнение. Единственное, что может показаться "плохой практикой", это назвать ваши классы "Helper1" и "Helper2" (но это может быть примером только для разъяснения).

Если вы используете частичные классы, подобные этому, проверьте (бесплатно) addin vsCommands (для Visual Studio 2008), что делает очень легко группировать файлы в explorer (как и файлы дизайнера) без редактирования файла проекта.

Ответ 3

Короткий ответ: Если все классы являются вашим кодом, вам действительно не нужны вспомогательные классы, что делает ненужными ваши частичные части.

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

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

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

Я не очень большой поклонник частичных занятий и не использую их сам.

Когда-то я нахожу их полезными и использую ОК, однако, когда вы хотите добавить что-то в код конструктора LINQ to SQL, но кроме того, я нахожу, что вы распространяете код в разные файлы только для ради этого, это может сделать его очень трудным для чтения и управления.

Может быть, если у вас есть классы, разделенные на многие файлы, возможно, ваши классы делают много... просто мысль:)

Ответ 7

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

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

Смотрите эту статью для веселого примера того, что не делать с частичными классами.

Ответ 8

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

Но! Хотя я не часто встречался, я иногда обнаружил, что экстенсивно модульное тестирование класса (обычно внешних классов) приводит к гигантским классам unit test. Разделение класса unit test на частичные классы делает его немного легче для глаз и для понимания.

Как и идея группировки при наследовании от нескольких интерфейсов, unit test можно сгруппировать для функций.

Ответ 9

Я думаю, что хорошо помнить, что ваше поведение по умолчанию для вашего инструмента заключается в создании низкоуровневой формы Coupling Not Cohesion; и рассматривать его скептически и переопределять, если это не имеет смысла по некоторым из перечисленных выше причин. Но это не очень хорошее поведение по умолчанию.

Ответ 10

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