Интересности      Книги      Утилиты    

11 мая 2012 г.

Regions в коде


Регионы в С# коде не есть зло. Когда они в умеренном количестве. Тем не менее я заметил, что люди с достаточным опытом в программирование выработали свой стиль, при котором такие вещи не нужны.
Но ниже есть пример того как регионы превращаются в зло. Реальный кусок кода за который автора надо отправить в ссылку и запретить писать на С#.
// Листинг 1
#region Constants
public TestClass()
{
  base.mstrContant = Constants.TYPE;
}
#endregion

#region Constructors

#endregion

#region Properties

#endregion

#region Public Methods

#endregion

#region private Methoden
//private void CallIndex(IndexType objIndexType, string strArea)
//{
//IndexState objState = new IndexState();
//objState = IndexState.INITAL;
//callIndexModulobjIndexType, strArea, objState);
//}
//
//private void callIndexModul(IndexType objIndexType, string strArea, SearchState objIndexState)
//{
//switch (objIndexState)
//{
//    case SearchState.INITAL:
//        objIndexState = IndexState.AREA;
//        break;
//    default:
//        break;
//}
//if (strArea.Equals(""))
#endregion

Решил все таки дописать пост. Время от времени встречаю регионы в разных проектах. Это даже могут быть вполне себе известные проекты у всех на слуху, например как log4net. Итак как все таки научится с этим жить. Дело в том что при открытии они все свернуты. И однозначно ничего не видно:

Изображение 1

Figure 2 [VB.NET]

Такое положение дел мне не нравится и открывать их все вручную бесполезная трата времени. Чтобы такое меньше бесило необходимо знать стандартные для студии клавиатурные сочетания для работы с регионами или блоками кода:

Блоки:
Ctrl+M, Ctrl+M Развернуть/свернуть текущий блок
Ctrl+M, Ctrl+O Свернуть все блоки в файле до определений
Ctrl+M, Ctrl+L Развернуть все блоки в файле
Ctrl+M, Ctrl+P Выключить outlining mode (Ctrl+M, Ctrl+O его включает)
Регионы:
Ctrl+M, Ctrl+А Свернуть все блоки
Ctrl+M, Ctrl+Х Развернуть все блоку
Не могу сказать что регионы меня раздражают очень, кроме случая отображенного в Листинг 1. Когда я захожу в класс с ними я почти автоматом наживаю сочетание клавиш чтобы развернуть их все.
Но чрезмерное использование регионов, по моему мнению – признак плохого кода. По моему наблюдению регионы используют люди у которых их собственный стиль написания кода еще не выработался. Зачем группировать элементы кода по их типу в регионы?! Я и так вижу с какого типа элементами я работаю. Не скрою что выпадающие списки с членами класса в Text Editor студии мне не нравятся. Когда то, еще в 2005, 2008-й студиях, я использовал плагин Source Outliner, потом его не стало. На замену ему есть отличное расширение к студии – vs10x Code Map (Изображение 2). С помощью него легче охватывать один взглядом все члены класса быстрым взглядом. Но даже без этого аддона, регионы абсолютно не нужны.
Изображение 2
VS10x Code Map v2
Я знаю только одно хорошее их назначение – спрятать автоматически сгенерированный код. Но с partial классами, проще выносить такой код в отдельно сгенерированный файл.
Тогда, когда регионы используются для того, чтобы группировать члены класса по типу (свойства, приватные, protected методы…) всегда возникают двойственные ситуации вроде есть публичный метод, который использует приватный helper метод. Так как этот метод используется например только в этом методе, куда его разместить? Под методом который его использует или в какой то регион?!
Все, что попадает в регионы, которые не сгруппированы по типу, – прямые кандидаты на вынос в отдельный классы. На Изображении 3 ниже показаны такие регионы:
Изображение 3
Тут явно видно, что части кода сгруппированы в регионы по их ответственности. В данном случае вообще ужас, так как все в одном методе, представляю сколько у него строчек кода. Значить класс этот просто на глазах распадается на отдельные части с разной ответственностью. Т.е. нужно выносить функционал в отельные классы.

Из того кода, что я видел регионы чаще всего используются как “зло”, потому что:


  1. В регионы прячут большое количество кода, который явно стоило бы выделить в отдельные классы

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

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

  4. Регионы, которые группируют классы по типам их членов как на Изображении 1, скорее недоработка редактора кода или умением его использовать. Если очистить приватные и протектед члены класса от бесполезные XML комментариев, то возможно легче будет в обычном редакторе визуально их идентифицировать, а чаще всего они бесполезные, и некоторые разработчики генерят их автоматически с помощью Resharper Code Clean-up или GhostDoc… да и зачем он для непубличных членов класса. Если вам не хватает возможностей стандартного студийного редактора, поищите аддоны или альтернативы.

В качестве вывода – картина из блога coding horror by Jeff Atwood:

image












2 комментария:

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

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

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

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

    ОтветитьУдалить