2010-03-12 4 views
18

SA1124 DoNotUseRegions предлагает не использовать регион нигде. Это действительно разумно?StyleCop SA1124 DoNotUseRegions разумно?

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

Я хотел бы удалить это правило, проверяя стиль кода. Могу ли я узнать ваше мнение по этому правилу?

+1

http://programmers.stackexchange.com/questions/53086/are-regions-an-antipattern-or-code-smell – Console

ответ

13

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

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

+3

Не так ли? Это те, которые * написали * это, кто-то еще неназванный должен прочитать его. И регионы * определенно * делают это неудобно. Мое личное предпочтение - ненавидеть их, когда я должен читать код. –

+1

@nobugz - В настоящее время они занимаются этим каждый день, возвращаются для исправления ошибок и т. Д. Я бы сказал, что они читают его больше, чем кто-либо другой. В общем, я все равно считаю это второстепенной проблемой, так как при необходимости вы можете вывести все регионы с быстрым регулярным выражением. Это и Ctrl + M + L делает это, поэтому я могу использовать или игнорировать их довольно легко, но, вероятно, личные предпочтения там. –

+0

Ну, меня не интересует чтение багги кода. Наверняка SA1124 является напоминанием. Пункт стиля копа заключается в том, чтобы * избегать личных предпочтений, влияющих на продукт. –

5

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

Однако я бы избегал слишком много уровней гнездования.

+0

Злоупотребление в использовании региона может сделать код просмотра недружественным. В моей практике я не использую ни одного региона гнезда и только области «Поля», «Свойства», «Конструктор», «Интерфейс», «Общедоступные методы», «Частный» и «Помощь»). – Yanhua

2

Интересно, является ли это правило побочным эффектом других более общепринятых правил, таких как заказ частных/защищенных/публичных членов. Следуя этим правилам упорядочения, во многих случаях обязательно будет ломаться логическая группировка #regions, поэтому они станут взаимоисключающими.

16

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

+3

Чтобы дополнить этот ответ, я хотел бы отметить, что для разделения машинного кода в отдельном файле можно использовать классы «partial». –

+1

+1 Кажется, каждый раз, когда я сталкиваюсь с регионами при чтении чужого кода, я думаю, было бы лучше, если бы они вместо этого направили свою тенденцию OCD во что-то более архитектурное, такое как Extract Class, а что нет. Это то, чем я занимаюсь! – BrandonLWhite

3

По моему мнению, существует исключение где # область/# endregion имеет смысл: При реализации интерфейсов!

например.

#region Implementation of IDisposable 
public void Dispose() 
{ 
    // implementation here ... 
} 
#endregion 

Во всех остальных случаях вы не должны использовать #region, как они устарели (я предполагаю, где созданы для сокрытия сгенерированного кода - .net-1.0 и .net-1.1, но теперь есть частичные классы для этого)

--Harald-Рене Flasch (ака hfrmobile)

2

Мне нравится регионы и моя команда, и я чувствую код более читаемым с ними.

Вот те времена, когда я их люблю ...

Если у вас есть стандарт компании, чтобы писать модульные тесты с Устройте Act Assert (AAA), то вам может потребоваться юнит-тесты, чтобы выглядеть следующим образом

[test] 
public void MyFunction_Test 
{ 
#region Arrange 
#endregion  

#region Act 
#endregion 

#region Assert 
#endregion 
} 

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

Другое место, где мне нравится регион, это код, когда вы знаете, что скоро собираетесь удалить код.

#region Drop this region next version when we drop 2003 support 
public void DoSomeThingWithWindowsServer2003() 
{ 
    // code the is for Windows 2003 only 
} 
#endregion 

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

#region Constructors 
#endregion 

#region Properties 
#endregion 

#region Events 
#endregion 

#region Methods 
#endregion 

#region Enums 
#endregion 

Обычно класс не будет иметь все из них (если это вы можете удивиться, если вы делаете слишком много в одном классе), но я думаю, что если вы ищете один метод или свойство, его приятно иметь одно место для просмотра. Не говоря уже о свойствах в ViewModel (MVVM anybody?), Использующем INotifyPropertyChanged, это 10 строк (9 строк плюс пробел), поэтому хорошо продуманный и хорошо написанный объект ViewModel с только 5 свойствами означает, что раздел свойств имеет не менее 50 строк кода.

Мне также особенно нравятся они при использовании плохо написанного кода другого человека. Глупо предположить, что вы всегда можете реорганизовать, чтобы использовать идеальный дизайн. Например, у вас есть класс с 2500 строк и более. Уверен, что это, вероятно, могло быть написано лучше, но вы этого не сделали, оно работает, и оно проверено, и ваш бизнес имеет код в «фиксированной» блокировке, поэтому рефакторинг не разрешен. Вы можете сделать слишком большой класс (плохо написанный или нет) гораздо более читаемым с помощью операторов #region. Вы получаете много преимуществ чтения от разделения проблем без фактического разделения класса, а затем, как только код выходит из строя, и вы можете реорганизовать, большая часть работы по разделению уже может быть выполнена с помощью #regions, и вы можете конвертировать ваши регионов в отдельный класс.

4

Из моего опыта они не должны использоваться вообще. Младшие разработчики склонны злоупотреблять ими и создавать слишком сложные классы, сложность которых «умственно» скрыта за многочисленными регионами.

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