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

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

A: 1) открытые методы 2) частные методы 3) открытые переменные 4) частные переменные

B: 1) публичные переменные 2) частные переменные 3) открытые методы 4) закрытые методы

C: 1) публичные переменные 2) открытые методы 3) частные методы 4) частные переменные

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

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

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

66

Решение

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

107

Другие решения

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

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

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

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

43

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

Поэтому мои занятия часто выглядят так:

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;
}
}
7

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

7

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

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

3

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

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

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

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

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

2

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

Хотя я иногда группирую как участников (получателей) & сеттеры) Я обычно предпочитаю перечислять участников в группе АЛФАВЕТИЧЕСКИ, чтобы их было легче найти.

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

2

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

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

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

Если это конкретная фабрика, я сначала ставлю функцию getNew () и функции register / initialize.

… и так далее. Когда я говорю сначала, я имею в виду вскоре после c’ors и d’tor — так как они являются стандартным способом создания экземпляров любого класса.

Далее следуют следующие функции:

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

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

1