Группирование одинаковых типов переменных-членов вместе

При написании класса вы группируете вместе переменные-члены одного типа? Есть ли в этом польза? Например:

class Foo
{
private:
    bool a_;
    bool b_;
    int c_;
    int d_;
    std::string e_;
    std::string f_;
    ...
};

В отличие от:

class Bar
{
private:
    std::string e_;    
    bool a_;
    int d_;
    bool b_;
    std::string f_;
    int c_;    
    .

.. };

Или вы просто располагаете их в том порядке, в котором они были добавлены?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 274
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

+1, но лучше разрабатывать классы таким образом, чтобы порядок инициализации не имел значения - именно потому, что слишком легко ошибиться без даже предупреждения.

atzz 28.11.2008 16:28
Ответ принят как подходящий

Я группирую их по семантике, т.е.

class Foo
{
private:
    std::string peach;
    bool banana;
    int apple;

    int red;
    std::string green;
    std::string blue;
    ...
};

Чем читабельнее, тем лучше.

Просто хочу добавить небольшой указатель на ответ Алистера ниже! Члены будут инициализированы в том порядке, в котором они появляются в определении класса, а не в том порядке, в котором они появляются в списке инициализаторов ctor! Так что вы должны иметь это в виду и не можете заказать их полностью по своему вкусу!

AndreasT 27.08.2009 11:40

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

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

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

В большинстве случаев у вас не должно быть слишком много членов в структуре.

Если да, может, стоит подумать о подструктурах ...

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

В порядке эффективного приоритета:

0) Члены ЕСЛИ имеют зависимости между собой при построении ИЛИ, если члены должны быть построены в определенном порядке: объявите их в порядке построения, который вы хотите выполнить. При построении единственный порядок построения членов - это порядок объявления членов в классе.

0.5) ЕСЛИ размер объекта экземпляра класса имеет значение (вам нужен минимальный размер для этого типа, но не выполняйте раннюю оптимизацию!), С некоторыми компиляторами лучше упорядочить ваши члены в порядке размера, чем больше первый, для выравнивания байтов или другое подобное поведение при компиляции.

1) В первую очередь установите ЯСНОСТЬ: сначала напишите для читателя (будьте ясны, упорядочивайте тематические / целевые группы и т. д.), Затем для компилятора (возможно, следуя предыдущим советам).

Почти во всех случаях важен только 1). Предпочитайте тематические, целевые и «составные части одной системы» для группировки членов, а не группировки по типу.

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

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

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

Из Кодекса Стива МакКоннелла, стр. 762: -

Order declarations sensibly: ... Grouping by types is usually sensible since variables of the same type tend to be used in related operations ... If your list of variables is so long that alphabetical ordering helps, your routine is probably too big.

Кроме того, на предыдущей странице он применяет стиль из моего предыдущего ответа, показывающий, что несколько объявлений "скопились" в одной строке ...

bool a_, b_, c_;

... со значком "Coding Horror". Так что я пересматриваю этот подход. Спасибо комментаторам за то, что заставили меня переоценить это.

Другие вопросы по теме