Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 5.00
kylroma
Одессит
204 / 75 / 23
Регистрация: 30.12.2013
Сообщений: 277
Записей в блоге: 1
Завершенные тесты: 2
#1

Рекомендация: сначало public, потом protected/private - C++

10.07.2014, 16:15. Просмотров 1692. Ответов 28
Метки нет (Все метки)

На хабре есть статья "90 рекомендаций по стилю написания программ на C++". Интересует вот этот пункт:
44. Разделы класса public, protected и private должны быть отсортированы. Все разделы должны быть явно указаны.
Сперва должен идти раздел public, что избавит желающих ознакомиться с классом от чтения разделов protected/private.


Недавно столкнулся в примере программы. Сначало public, а потом private. Ужасно неудобно читать такую программу. Начинал с конца.
Так вот, действительно, ли является хорошим тоном так писать программы? Или это извращение какое-то?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2014, 16:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Рекомендация: сначало public, потом protected/private (C++):

Protected Private Public - C++
Возник вопрос, немного наверное бредовый и на практике наврятли применимый, но всё же интересно, а возможно поменять модификатор доступа в...

private, protected, public - C++
class test { public: test(); int getPrivate(); int vpublic; protected: int vprotected; private: int vprivate;

Public, Private, Protected (смысл применения) - C++
Прошу Вас пояснить реальный смысл ключевых слов, перечисленных в теме. С уважением

Ключевые слова private, public, protected - C++
Смысл ключевых слов private, public, protected в списке базовых классов при декларации производного класса?

Наследования класса как public, private и protected - C++
Ну допустим у нас есть класс который наследуется как public: class Cylinder : public Point { // ...здесь код } Класс...

Наследование. Помогите с этими public, protected. private - C++
Вот код, в нем вылетает ошибка Unit2.cpp(16): E2251 Cannot find default constructor to initialize base class 'My' в файле unit2.cpp во...

28
Kastaneda
11.07.2014, 10:33     Рекомендация: сначало public, потом protected/private
  #16

Не по теме:

Цитата Сообщение от Tulosba Посмотреть сообщение
только вот ассоциировать это именно с линуксом, по-моему, немного странно.
это да, просто говорю, что там это часто встречается. Еще по долгу службы сейчас OpenJDK ковыряю, там это тоже практикуется. В OpenJDK вообще много странностей)

0
Voivoid
677 / 280 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
11.07.2014, 12:09 #17
Цитата Сообщение от Убежденный Посмотреть сообщение
группировать члены класса лучше по каким-то концептуальным или логически
общим признакам
А чем уровень доступа не признак?

Цитата Сообщение от Убежденный Посмотреть сообщение
конструкторы-деструкторы
Они как правило всегда public

Цитата Сообщение от Убежденный Посмотреть сообщение
затем public-интерфейс
public

Цитата Сообщение от Убежденный Посмотреть сообщение
дальше перегруженные операторы
Тоже как правило public

Цитата Сообщение от Убежденный Посмотреть сообщение
потом какие-нибудь там internal-методы
начался protected/private

Цитата Сообщение от Убежденный Посмотреть сообщение
потом private-данные
private

Цитата Сообщение от Убежденный Посмотреть сообщение
Если у меня какой-то член данных будет в паблике
Ну-у-у, похоже на весьма редкий случай. Обычно или все члены в public или все в private.



Итого по сути и получается сначала public потом private ( ну и protected если уж куда пихать, так между ними ). По-моему все логично и нисколько не противоречит рекомендации с хабра. Не знаю уж где ты нашел намеки на какую-то абсолютную истину. Разве кто-то утверждает, что данной рекомендации стоит следовать абсолютно всегда? Вроде нет

Цитата Сообщение от Renji Посмотреть сообщение
В C++11 не нужно уже.
Есть еще boost::noncopyable
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
11.07.2014, 12:32 #18
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
public:
* * // что-нибудь
protected:
* * // что-нибудь
public:
* * // что-нибудь
private:
* * // что-нибудь
protected:
* * // что-нибудь
public:
* * // что-нибудь
// и т.д.
Некто Мэтью Уилсон обожает подобный стиль написания. Каждая логически отдельная секция (например, внутренние тайпдефы, конструкторы, изменяющие/константные методы и т.д.) отделяется через public/private. Ну какой-то смысл в этом есть (хотя можно было бы просто пустой строкой отдлять).

Добавлено через 2 минуты
Цитата Сообщение от Voivoid Посмотреть сообщение
конструкторы-деструкторы
Они как правило всегда public
Неужели? По-моему, 50/50, как минимум.
0
Voivoid
677 / 280 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
11.07.2014, 12:48 #19
Цитата Сообщение от John Prick Посмотреть сообщение
Ну какой-то смысл в этом есть (хотя можно было бы просто пустой строкой отдлять).
По-моему фигня какая-то. Вот внутри секции доступа имеет смысл разбивать объявления на логические группы ( скажем сначала typedef'ы, потом enum'ы, потом виртуальные функции и т. д. )

Цитата Сообщение от John Prick Посмотреть сообщение
Неужели? По-моему, 50/50, как минимум.
Не знаю как у тебя такие числа получились. Разве что за счет некопируемых классов. В этом случае да, имеет смысл воткнуть private конструктор на самый верх ( сам я кстати предпочитаю boost::noncopyable ), но это на мой взгляд скорее исключение подтверждающее правило. Ведь никто не писал, что надо отключать голову и тупо следовать рекомендациям, нет ведь?
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
11.07.2014, 12:52 #20
Цитата Сообщение от Voivoid Посмотреть сообщение
Не знаю как у тебя такие числа получились.
Я о том, что конструкторы и деструкторы, по твоему же собственному выражению, "как правило всегда" public. Это далеко не так, на мой взгляд.
0
Voivoid
677 / 280 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
11.07.2014, 12:54 #21
Цитата Сообщение от John Prick Посмотреть сообщение
Я о том, что конструкторы и деструкторы, по твоему же собственному выражению, "как правило всегда" public. Это далеко не так, на мой взгляд.
Ну вот мне и интересно как у тебя такие числа получились. В моей практике ( как я уже писал за исключением noncopyable классов ) приватные конструкторы и деструкторы это весьма редкий случай.
0
SatanaXIII
Супер-модератор
Эксперт С++
5689 / 2744 / 258
Регистрация: 01.11.2011
Сообщений: 6,699
Завершенные тесты: 1
11.07.2014, 12:59 #22
Voivoid, John Prick, ключевое место в ваших рассуждениях:
Цитата Сообщение от Voivoid Посмотреть сообщение
По-моему
и
Цитата Сообщение от John Prick Посмотреть сообщение
на мой взгляд

Мое персональное предвзятое мнение, что следует группировать методы по определенным, свойственным именно для этого класса (в другом можно и по другому), признакам, и ближе к началу писать основное - методы, ради которых класс и пишется. А всякие дополнительные внутренние плюшки уже можно и в конец писать. Что до фарша из public/private секций, то тут уж личное дело каждого. Ну или как говорит Jupiter.
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
11.07.2014, 13:00 #23
Цитата Сообщение от Voivoid Посмотреть сообщение
В моей практике
Видимо, здесь мы и расходимся. Я тоже не буду говорить "за всю Одессу", но я, например, располагаю конструкторы абстрактных классов в protected секции. Бывают и другие случаи. Ну если не 50/50, то всё равно не "почти всегда".

Добавлено через 51 секунду
SatanaXIII, да, согласен.
0
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,493
Записей в блоге: 2
Завершенные тесты: 1
11.07.2014, 13:04 #24
В Java кстати очень часто вот так пишут
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Klass {
    private int field1;
    private int field2;
    private int field3;
    ...
    private int fieldN;
 
    public int getField1() {
        return field1;
    }
 
    public int getField2() {
        return field2;
    }
    // etc
}
как в книгах "С++ для начинающих" , но в Java это считается нормальным.
0
John Prick
831 / 764 / 154
Регистрация: 27.07.2012
Сообщений: 2,176
Завершенные тесты: 3
11.07.2014, 13:13 #25
Таже шляпа в C#.
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
11.07.2014, 14:04 #26
Цитата Сообщение от Kastaneda Посмотреть сообщение
В Java кстати очень часто вот так пишут
Так что в Java, что в шарпах уровень доступа указывается для каждой сущности отдельно, а не задается группами как в плюсах.
Цитата Сообщение от John Prick Посмотреть сообщение
располагаю конструкторы абстрактных классов в protected секции
Если класс абстрактный (имеет чисто виртуальный метод), то его всё равно инстанцировать не получится.
0
Kastaneda
Jesus loves me
Эксперт С++
4749 / 2953 / 242
Регистрация: 12.12.2009
Сообщений: 7,493
Записей в блоге: 2
Завершенные тесты: 1
11.07.2014, 14:19 #27
Цитата Сообщение от Tulosba Посмотреть сообщение
Так что в Java, что в шарпах уровень доступа указывается для каждой сущности отдельно, а не задается группами как в плюсах.
все равно группировать по уровням доступа то можно. Всмысле сначала public, потом private.
0
Tulosba
:)
Эксперт С++
4705 / 3240 / 297
Регистрация: 19.02.2013
Сообщений: 9,046
11.07.2014, 14:28 #28
Цитата Сообщение от Kastaneda Посмотреть сообщение
все равно группировать по уровням доступа то можно. Всмысле сначала public, потом private.
Можно конечно. Но если в плюсах достаточно перенести сущность в нужную группу, то в жабе/шарпах нужно поменять модификатор доступа. А так как в процессе разработки это может произойти несколько раз, то в итоге может получиться класс с любопытным чередованием модификаторов доступа
0
Avazart
Эксперт С++
7574 / 5559 / 327
Регистрация: 10.12.2010
Сообщений: 24,934
Записей в блоге: 17
11.07.2014, 15:38 #29

Не по теме:

Цитата Сообщение от John Prick Посмотреть сообщение
Таже шляпа в C#.
Вот именно шляпа...
Не зря говорят что С++ более лаконичен.



Сортировать/группировать нужно, хотя бы для собственного удобства, но по каким параметрам это от ситуации, благо С++ в этом не ограничивает.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 15:38
Привет! Вот еще темы с ответами:

Для чего нужны модификаторы protected, private, public - C++
подскажите, кто в курсе, зачем вообще нужны эти модификаторы доступа? ведь, все их можно обойти... сейчас курю Страуструпа "Дизайн и...

Public и Private - C++
Доброго времени суток! Написал код и понял, что некоторые методы должны быть private, а не public. Если переношу их в private, то...

Предложите примеры деклараций классов с protected и private членами - C++
Только декларации. Как пишутся спецификаторы, я знаю. Просто надо сделать примеры деклараций классов со спецификаторами - и #, а я что то...

Зачем нужен тип private, если есть protected? - C++
зачем нужен тип private если есть protected??? одного не достаточно? ведь свойства те же. и даже лучше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru