Як ви зазвичай компонуєте регіони класу?


17

Мені було цікаво, чи існує стандарт для розміщення регіонів класу.

Я зараз використовую

Fields
Constructor
Properties
Public Methods
Private Methods

Fieldsбути приватною власністю та Propertiesбути публічною. Зазвичай я буду використовувати підрегіони в межах цього, якщо потрібно, або інколи додаватиму інші регіони нижче (наприклад, інтерфейс або baseClass).


1
Ви взагалі говорите про макет або використовуєте "#regions"?
snmcdonald

1
@snmcdonald Я використовую #regionтеги для визначення розділу
Рейчел

Це не повинно бути питанням вікі-спільноти? Я не вірю, що існує один стандарт, і відповідь може змінюватися залежно від мов.
Raveline

7
Я починаю з видалення всіх #regions
Ed S.

3
@Ed S. +1 тому, що регіони - диявол. Все, що вони дозволяють вам зробити - це затьмарити той факт, що файл вашого коду занадто великий і його потрібно переробити.
MattDavey

Відповіді:


4

Переліки, пов'язані з класом, або періодично створюються / класи чистих даних (вище фактичного визначення класу)

--- Визначення класу ---

Приватні члени

CTOR / DTOR, якщо мова має DTORs

Громадські властивості

Утилітні методи (приватні або захищені методи з малим масштабом)

Функціональність класу (може бути поділена на кілька регіонів залежно від сфери класу).


17

Підрегіони? Чи має ваш клас єдину відповідальність ? (мається на увазі в тому, що моя відповідь: "Рідко будь-які регіони, за винятком, можливо, групування властивостей, конструкторів та методів" ... але навіть тоді я не дуже його використовую)


2
Я зараз програмую в WPF зараз, і прикладом деяких підрегіонів, які я б використовував, є ViewModel, який має свої загальнодоступні властивості, розділені на властивості, пов'язані з інтерфейсом користувача, команди, дані тощо. Це значно полегшує пошук того, що я шукаємо швидко
Рейчел

2
Чому б не використовувати великі банери коментарів замість регіонів? // ----------ViewModel Properties---------- Таким чином, ви все ще можете бачити код (або згортати його з окресленням і бачити членів). Регіони - для приховування речей. Код не слід приховувати, якщо він не створений автоматично або щось подібне.
Kyralessa

1
@Rachel корисний склад.
MattDavey

10

Я просто хотів підтвердити, що ви маєте на увазі "#regions", а не макет класу взагалі.

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

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

Чому я ненавиджу регіони? CTRL+M,Lі CTRL+M,Oпереключить складання коду. Однак при руйнуванні він приховує весь регіон. Мені потрібно лише згортати методи / властивості / коментарі.

Якщо регіонів занадто багато, можливо, його код запах, і ваш клас робить занадто багато роботи. Джефф Етвуд пропонує хороший пост у регіонах, який варто прочитати.

Моя улюблена цитата на #regions:

Ні, я не буду використовувати #regions. І ні, я НЕ СПРАВУЮТЬ З ТЕРРИСТИКАМИ. Заткнися.

- Джефф Етвуд

Попри це, я знаю, що багато програмістів наполягають на їх використанні. Це питання є суб'єктивним. Я просто думав, що запропоную альтернативу.


1
Ось макрос, щоб розгорнутись до визначень, але розширити регіони, якщо ви зациклюєтесь на роботі з людьми, закоханими у регіони: stackoverflow.com/questions/523220/awesome-visual-studio-macros/… Це добре працює, якщо ви не робота з дійсно хворими людьми, які вкладають регіони в методи .
Kyralessa

Дуже корисний макрос! Я не впевнений, чому вони не вбудували його у візуальну студію, тим більше спасибі.
snmcdonald

Мій начальник обожнює регіони, любить їх. Він також любить приватні внутрішні класи та величезні методи. У нашому коді є один клас, який розділяє його близько десятка регіонів, 3 внутрішні класи, і деякі методи настільки довгі, що в них є десяток регіонів верхнього рівня, з ними - підрегіони.
CodexArcanum

4

Він варіюється від мови до мови. Оскільки я кодер Delphi, я схильний дотримуватися стандартної конвенції Delphi, яка виглядає приблизно так:

type
  TMyClass = class(TBaseClass)
  private
    private fields
    private methods
  protected
    protected fields
    protected methods
    protected properties
  public
    constructor(s)
    destructor
    public methods
    public properties
  end;

Я вважаю хорошим способом організувати інформацію, яку легко читати та розуміти.


3
Мені здається дивним, що приватні, захищені, публічні та опубліковані впорядковані за алфавітом та інкапсуляцією, і всі вони починаються з P!
Пітер Тернер

забавно, я не хочу. Я завжди вважав, що більш природним є перелік publicперших, оскільки більшість користувачів дбають лише про publicречі.
Маттьє М.

Я завжди вважав цю умову справді дурною ідеєю. Яка видимість пов'язана з функціональністю? У будь-якому випадку, я завжди використовував Інтерфейси для визначення публічної функціональності, але реалізував Інтерфейс як захищений у класі. Єдині елементи, які я послідовно групую, - це опубліковані методи та властивості компонентів, інакше я завжди групуюсь за інтерфейсами та успадкуванням, використовуючи кілька ключових слів видимості за необхідності. Ті елементи, які є унікальними для реалізації класу (тобто: не переосмислюються), дійсно повинні бути перелічені першими.
S.Robins

3

Я схильний їх викладати таким чином:

Public fields (usually static constants)
Constructors
Public methods
Private methods
Private fields

Не використовував мову, яка використовує Properties, тому вони не викладені. Я розміщую приватні методи та поля внизу, тому що якщо хтось інший використовує цей файл у своєму коді, їм слід лише стосуватися API, який є загальнодоступним. І всі текстові редактори, про які я знаю, і навіть IDE встановлюють курсор вгорі під час відкриття файлів.


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

2

Це заклик суду для мене. Я використовую регіони, коли вони потрібні для читання.

Я також використовую інший колір у своїй кольоровій гамі Visual Studio (зараз темно-червоний), щоб вони виділялися з решти коду.


Приклад того, де я можу використовувати #region: Якщо я напишу метод тесту для одиничного тесту, який вимагає багаторядкового фрагмента XML, рядок XML порушить звичайний відступ (оскільки він починається уздовж лівої межі поля вікно коду. Щоб приховати неподобство, я загорну його в #region, щоб я міг його згортати.


2

Книга « Чистий код» Боб Мартіна присвячує форматуванню всю п'яту главу. Є кілька ключових моментів, які, як мені здається, це добре підсумовують.

  • Більшість спроб групувати змінні та методи за видимістю та чистотою Не має великого сенсу, і змушує вас багато орієнтуватися навколо коду.
  • Утримання методів, які дзвонять один одному вертикально, зменшує кількість навігації, яку вам потрібно зробити, і полегшує пошук речей.
  • Ваш потяг думок не буде порушений, якщо вам доведеться зупинитися і подумати, "до якого регіону належить цей біт коду?" кожні кілька хвилин.
  • Змінні екземплярів, як правило, мають бути небагато, і, ймовірно, будуть використовуватися всюди, тому вони належать у верхній частині класу, де їх буде найлегше знайти. Змінні та декларації, які будуть використовуватися лише одним методом, повинні існувати всередині цього методу. Якщо вони використовуються лише декількома методами, то вони повинні бути вертикально близькими, але вище кількох методів, які їх використовують.

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

Якщо вам потрібно "приховати" код, оскільки він занадто довгий або занадто "некрасивий", то, мабуть, у вас виникнуть більші проблеми, ніж використовувати регіони чи ні. Особисто мені ніколи не потрібно їх використовувати, і коли я працюю над чужим кодом, я вважаю, що мені завжди потрібно все-таки відкрити їх, так навіщо турбуватися?


1
+1 - Я здивований, що про це не було сказано більш помітно. Принцип згуртованості також застосовується до того, як ви викладете свій код, а групування за модифікатором доступу (частіше за все) є протидіючим продуктивним.
Даніель Б

0

В даний час я розміщую такі класи:

class types
constructors
destructor
accessors
methods
properties (where properties are present in the language)
member variables

а потім префікс рівня доступу до кожної декларації (сортування, іноді групування за доступом). Раніше я групував верхній рівень за доступом, але в якийсь момент я не знаю, коли це не спрацювало так само, як вище. Наприклад, в C ++ / CLI (який я змушений використовувати на даний момент :-() ви можете це зробити, що заплутує групування за доступом:

public: property int SomeProperty
{
private: void set (int value) { ... }
public: int get () { ... }
}

Що таке "члени" внизу? Для мене це терміновий термін для всіх творів класу.
Мейсон Уілер

@Mason: має бути "змінними членів", щоб уникнути плутанини.
Skizz

Я дійсно не отримую групування речей за таким типом. Яка різниця між методом та властивістю насправді? Я ніколи не ходив шукати властивості класу, однак шукатиму логічно пов'язаний код, будь то властивості, методи і будь-які інші.
Ед С.

0

Лунатична бахрома відповідає: Мені це не принаймні, якщо мова йде про C #. Між Visual Studio та R # я магічно можу перейти до будь-якого учасника чи впровадження, щоб не було жодного сенсу нав’язуватися щодо цього матеріалу; просто почніть вводити місце, де знаходиться курсор.


0

Як і Wyatt та ще кілька відповідей, я також взагалі уникаю використання регіонів. Регіони мають одну мету; щоб приховати код, який ви не хочете шукати. Якщо у вас дуже багато коду в класі, на який ви не хочете дивитися, і тому вам потрібно багато регіонів, щоб дозволити згортання згаданого коду, то, ймовірно, у вас занадто багато коду в класі. ReSharper не поважає регіони, коли вирішує, де розмістити новий код, якщо тільки він не створив регіон (що він робить для реалізації інтерфейсу).

Єдине використання регіонів, які я вважаю прийнятним, - це приховати "неминуче негарний" код; код, який стосується конкретних деталей впровадження, які не можуть бути добре зосереджені у відповідності до діючих стандартів. Це, як правило, розширений езотеричний код, який, як правило, не повинен переплутати середній молодший програміст після написання. Це такі речі, як:

  • Деякі вбудовані інтерфейсні реалізації (IDisposable, IConvertible, іноді IEnumerable або IComparable, оскільки їм потрібні загальні та негенеричні реалізації)
  • Вбудовані зовнішні елементи P / Invoke та споріднені структури.
  • Фіналізатори / деструктори (зазвичай постачаються з IDisposable)
  • Гачки для керованої пам'яті / покажчиків / "небезпечних" код.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.