Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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


Недавно столкнулся в примере программы. Сначало public, а потом private. Ужасно неудобно читать такую программу. Начинал с конца.
Так вот, действительно, ли является хорошим тоном так писать программы? Или это извращение какое-то?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2014, 16:50     Рекомендация: сначало public, потом protected/private #2
Цитата Сообщение от kylroma Посмотреть сообщение
Ужасно неудобно читать такую программу

Все правильно, сначала public секция, затем все остальное. В идеале вообще в private секцию не нужно смотреть. Инкапсюлация же
zss
Модератор
Эксперт С++
6244 / 5847 / 1891
Регистрация: 18.12.2011
Сообщений: 14,980
Завершенные тесты: 1
10.07.2014, 17:02     Рекомендация: сначало public, потом protected/private #3
И все же - это дело программиста.
На мой взгляд, если программу документируем, то сначала надо ознакомиться
с данными класса, а уж потом - что с ними можно делать.
Да и зачем тогда придумали class, осталась бы struct!
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2014, 17:07     Рекомендация: сначало public, потом protected/private #4
Цитата Сообщение от zss Посмотреть сообщение
сначала надо ознакомиться
с данными класса
Зачем? Как тебе это информация поможет?
zss
Модератор
Эксперт С++
6244 / 5847 / 1891
Регистрация: 18.12.2011
Сообщений: 14,980
Завершенные тесты: 1
10.07.2014, 17:13     Рекомендация: сначало public, потом protected/private #5
Цитата Сообщение от Voivoid Посмотреть сообщение
Зачем?
Например, собираемся создать производный класс:
В первую очередь надо определить, какие данные уже есть и какие надо добавить.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2014, 17:17     Рекомендация: сначало public, потом protected/private #6
Цитата Сообщение от zss Посмотреть сообщение
В первую очередь надо определить, какие данные уже есть и какие надо добавить.
Какая разница, если они все равно в private секции. Ты до них сможешь добраться только через public или protected интерфейс. А значит опять смысла смотреть в private секцию нет
Renji
1793 / 1211 / 282
Регистрация: 05.06.2014
Сообщений: 3,480
10.07.2014, 17:42     Рекомендация: сначало public, потом protected/private #7
Зачем? Как тебе это информация поможет?
Скажем, выяснится что very_slow_method() на самом деле кеширует свои результаты и very slow лишь при первом вызове. Хотя, конечно, по хорошему это должно быть подписано где-то рядышком с объявлением метода.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
10.07.2014, 17:58     Рекомендация: сначало public, потом protected/private #8
Цитата Сообщение от Renji Посмотреть сообщение
Скажем, выяснится что very_slow_method() на самом деле кеширует свои результаты
1) Такие вещи обычно пишут в документации к библиотеке
2) Преждевременная оптимизация - корень всех зол
3) Если все же нужна ультра-производительность, то конечно не грех и в реализацию посмотреть что там да как, но это, согласитесь уж, довольно редкий случай. Имеет смысл только после того, как профайлер показал там узкое место
Jupiter
Каратель
Эксперт С++
6549 / 3969 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
10.07.2014, 19:06     Рекомендация: сначало public, потом protected/private #9
Цитата Сообщение от zss Посмотреть сообщение
И все же - это дело программиста.
это дело guidelines компании
Убежденный
Системный программист
Эксперт С++
15099 / 6794 / 1073
Регистрация: 02.05.2013
Сообщений: 11,105
Завершенные тесты: 1
11.07.2014, 08:21     Рекомендация: сначало public, потом protected/private #10
Цитата Сообщение от kylroma Посмотреть сообщение
На хабре есть статья "90 рекомендаций по стилю написания программ на C++". Интересует вот этот пункт:
44. Разделы класса public, protected и private должны быть отсортированы. Все разделы должны быть явно указаны.
Сперва должен идти раздел public, что избавит желающих ознакомиться с классом от чтения разделов protected/private.
Опять этот Хабр ! Чего, спрашивается, люди туда лезут как в источник абсолютной истины ?
По поводу сортировки членов класса по уровню доступа - ну бред же ! Быстрый пример:
если у меня некопируемый класс, в котором копирующий конструктор и оператор присваивания
помещены в private-секцию и не имеют реализаций, я помещу эту секцию повыше, чтобы она
бросалась в глаза и читающий сразу понял, что класс копировать нельзя.

И вообще, группировать члены класса лучше по каким-то концептуальным или логически
общим признакам, чем просто по спецификаторам доступа. Ну например: конструкторы-деструкторы,
затем public-интерфейс, дальше перегруженные операторы, потом какие-нибудь там internal-методы, и
потом private-данные. Если у меня какой-то член данных будет в паблике, я не буду его
совать на самый верх из-за того, что так типа правильно. Лучше я сделаю для него отдельную
public-секцию в правильном месте, скажем, сразу над private-данными, и помещу его туда.
Renji
1793 / 1211 / 282
Регистрация: 05.06.2014
Сообщений: 3,480
11.07.2014, 09:10     Рекомендация: сначало public, потом protected/private #11
Быстрый пример:
если у меня некопируемый класс, в котором копирующий конструктор и оператор присваивания
помещены в private-секцию и не имеют реализаций, я помещу эту секцию повыше, чтобы она
бросалась в глаза и читающий сразу понял, что класс копировать нельзя.
В C++11 не нужно уже.
C++
1
2
3
4
5
struct my_struct
{
    my_struct(const my_struct&)=delete;
    void operator=(const my_struct&)const=delete;
};
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.07.2014, 09:44     Рекомендация: сначало public, потом protected/private #12
Renji, всё же Убежденный (если я правильно понял) сделал акцент на расположении к началу объявления класса, а не на том, в какой конкретно секции это размещать. Потому что в случае с =delete их всё равно есть смысл разместить повыше (опять-таки опираясь на логику Убежденный, с которой я, в принципе, согласен).
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
11.07.2014, 09:53     Рекомендация: сначало public, потом protected/private #13
Еще в линуксовых исходниках часто встречаю такое
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
public:
    // что-нибудь
protected:
    // что-нибудь
public:
    // что-нибудь
private:
    // что-нибудь
protected:
    // что-нибудь
public:
    // что-нибудь
// и т.д.
вот это реально жесть, глаза вместе с мозгом ломаются)
Tulosba
:)
Эксперт С++
4390 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
11.07.2014, 09:57     Рекомендация: сначало public, потом protected/private #14
Цитата Сообщение от Kastaneda Посмотреть сообщение
Еще в линуксовых исходниках
Я что-то сразу подумал про ядро, но оно ж на С.
А подобное расположение тоже встречал, только вот ассоциировать это именно с линуксом, по-моему, немного странно.
Croessmah
Модератор
Эксперт CЭксперт С++
12878 / 7264 / 810
Регистрация: 27.09.2012
Сообщений: 17,945
Записей в блоге: 2
Завершенные тесты: 1
11.07.2014, 10:02     Рекомендация: сначало public, потом protected/private #15
Цитата Сообщение от Kastaneda Посмотреть сообщение
Еще в линуксовых исходниках часто встречаю такое
наткнулся на такое:
C++
1
2
3
4
5
6
7
8
class EnumSet {
public:
   //...
private:
    //...
private:
    //...
};
Kastaneda
11.07.2014, 10:33
  #16

Не по теме:

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

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

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

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

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

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

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

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



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

Цитата Сообщение от Renji Посмотреть сообщение
В C++11 не нужно уже.
Есть еще boost::noncopyable
John Prick
764 / 697 / 126
Регистрация: 27.07.2012
Сообщений: 1,988
Завершенные тесты: 3
11.07.2014, 12:32     Рекомендация: сначало public, потом protected/private #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, как минимум.
Voivoid
672 / 275 / 12
Регистрация: 31.03.2013
Сообщений: 1,339
11.07.2014, 12:48     Рекомендация: сначало public, потом protected/private #19
Цитата Сообщение от John Prick Посмотреть сообщение
Ну какой-то смысл в этом есть (хотя можно было бы просто пустой строкой отдлять).
По-моему фигня какая-то. Вот внутри секции доступа имеет смысл разбивать объявления на логические группы ( скажем сначала typedef'ы, потом enum'ы, потом виртуальные функции и т. д. )

Цитата Сообщение от John Prick Посмотреть сообщение
Неужели? По-моему, 50/50, как минимум.
Не знаю как у тебя такие числа получились. Разве что за счет некопируемых классов. В этом случае да, имеет смысл воткнуть private конструктор на самый верх ( сам я кстати предпочитаю boost::noncopyable ), но это на мой взгляд скорее исключение подтверждающее правило. Ведь никто не писал, что надо отключать голову и тупо следовать рекомендациям, нет ведь?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.07.2014, 12:52     Рекомендация: сначало public, потом protected/private
Еще ссылки по теме:

C++ Private и public члены класса
Public и Private C++
Public, Private, Protected (смысл применения) C++
C++ LNK2019: о private и public в классе
Перевод class из public в private C++

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

Или воспользуйтесь поиском по форуму:
John Prick
764 / 697 / 126
Регистрация: 27.07.2012
Сообщений: 1,988
Завершенные тесты: 3
11.07.2014, 12:52     Рекомендация: сначало public, потом protected/private #20
Цитата Сообщение от Voivoid Посмотреть сообщение
Не знаю как у тебя такие числа получились.
Я о том, что конструкторы и деструкторы, по твоему же собственному выражению, "как правило всегда" public. Это далеко не так, на мой взгляд.
Yandex
Объявления
11.07.2014, 12:52     Рекомендация: сначало public, потом protected/private
Ответ Создать тему
Опции темы

Текущее время: 00:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru