Подтвердить что ты не робот

Частные функции класса vs Функции в неназванном пространстве имен

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

Каково ваше мнение - это правильная практика?

4b9b3361

Ответ 1

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

Просто скажите "нет" этому и скройте, что личное в файле cpp.

Если бы я начал новый проект на большом проекте С++, я бы использовал PIMPL Idiom: http://c2.com/cgi/wiki?PimplIdiom, чтобы переместить еще более частные детали в cpp файл.

Ответ 2

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

Нижняя строка: это похоже на идею, которая может работать там, где реализация "модуль" имеет специальный доступ к классу, но это не так в С++.

Ответ 3

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

Ответ 4

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