Передовая практика: упорядочение публичного / защищенного / частного в рамках определения класса?


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

на : 1) методы 2) частные методы 3) общественные Варс 4) частная Варс

б : 1) государственные Варс 2) частная Варс 3) методы 4) частные методы

с : 1) государственным Варс 2) методы 3) частные методы 4)частная Варс

Я вообще как поставить public static vars наверху, но тогда будет ли публичный статический метод указан перед вашим конструктором, или конструктор всегда должен быть указан первым? Что-то в этом роде...

Я знаю, что это финский, но мне просто интересно: каковы лучшие практики для этого?

PS: нет, я не использую Cc#. Я знаю. Я луддит.

10 61

10 ответов:

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

лучшая практика-это будьте последовательны.

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

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

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

Я думаю, что у меня другая философия по этому, чем большинство. Я предпочитаю группировать связанные элементы вместе. Я не люблю прыгать, работать с классом. Код должен течь и использовать довольно искусственное упорядочение, основанное на доступности (публичной, частной, защищенной и т. д. ) или экземпляр против статического или член против свойства против функции не помогает сохранить хороший поток. Так что если я неф публичный метод Method это реализовано частными вспомогательными методами HelperMethodA,HelperMethodB etc. затем а чем эти метода далеки друг от друга в файле, я буду держать их близко друг к другу. Аналогично, если у меня есть метод экземпляра, который реализуется статическим методом, я также сгруппирую их вместе.

Итак, мои занятия часто выглядят так:

class MyClass {
    public string Method(int a) {
        return HelperMethodA(a) + HelperMethodB(this.SomeStringMember);
    }

    string HelperMethodA(int a) { // returns some string }

    string HelperMethodB(string s) { // returns some string }

    public bool Equals(MyClass other) { return MyClass.Equals(this, other); }

    public static bool Equals(MyClass left, MyClass right) { // return some bool }

    public double SomeCalculation(double x, double y) {
        if(x < 0) throw new ArgumentOutOfRangeException("x");
        return DoSomeCalculation(x, y); 
    }

    const double aConstant;
    const double anotherConstant;
    double DoSomeCalculation(double x, double y) {
        return Math.Pow(aConstant, x) * Math.Sin(y) 
            + this.SomeDoubleMember * anotherConstant;
    }       
}

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

раньше мне было очень не все равно. За последние несколько лет, используя современные IDE, почти все находится всего в 1 или 2 нажатиях клавиш, я позволил своим стандартам существенно расслабиться. Теперь я начинаю со статики, переменных-членов, а затем конструкторов, после чего я не очень беспокоюсь об этом.

В C# я позволяю Resharper организовать вещи автоматически.

Это будет мой заказ

  1. Статические Переменные
  2. Статические Методы
  3. Общие Переменные
  4. Защищенные Переменные
  5. Частные Переменные
  6. конструкторы
  7. Методы
  8. Защищенные Методы
  9. Частные Методы

Я использую следующие правила:

  • статический прежде чем что-либо
  • переменные перед конструкторами перед методы (я считаю конструкторы в категорию методы)
  • public before protected before private

идея заключается в том, что вы определяете объект (данные), прежде чем поведение (методы). Статика должна быть разделена, потому что они на самом деле не являются частью объекта, и это не поведение.

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

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

Мне также нравится выстраивать данные / функции вертикально. I вкладка / пробел справа достаточно, чтобы все имена были выровнены в одном столбце.

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

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

Итак, если это синглтон, я ставлю семантику (статический класс getInstance ()) первым.

Если это бетонный завод, я ставлю getNew() функция и регистр / инициализировать функции в первую очередь.

... и так далее. Когда я говорю "первый", я имею в виду вскоре после c'tors и d'Tor - поскольку они являются способом создания экземпляра любого класса по умолчанию.

следующие функции находятся в:

  1. логический порядок вызова (например, initialize (), preProcess (), process (), postProcess ()) или
  2. связанные функции вместе (например, аксессоры, утилиты, манипуляторы и т. д.),

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

некоторые редакторы, такие как Eclipse и его потомство, позволяют вам переупорядочивать в представлении структуры vars и методы в алфавитном порядке или как на странице.

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

Я использую Qt c++ на некоторое время и вижу некоторые новые ключевые слова, такие как signal и slot Я предпочитаю держать заказ, как выше, и поделиться своей идеей с вами здесь.

#ifndef TEMPLATE_H
#define TEMPLATE_H


class ClassName
{
    Q_OBJECT
    Q_PROPERTY(qreal startValue READ startValue WRITE setStartValue)
    Q_ENUMS(MyEnum)

public:

    enum MyEnum {
        Hello = 0x0,
        World = 0x1
    };

    // constructors

    explicit ClassName(QObject *parent = Q_NULLPTR);
    ~ClassName();

    // getter and setters of member variables

    // public functions (normal & virtual) -> orderby logic

public slots:

signals:

protected:

    // protected functions it's rule followed like public functions


private slots:

private:

    // methods

    // members

};

#endif // TEMPLATE_H