Функции закрытого класса против функций в безымянном пространстве имен - PullRequest
42 голосов
/ 13 августа 2010

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

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

Ответы [ 4 ]

17 голосов
/ 13 августа 2010

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

Просто скажите «нет» и спрячьте то, что скрыто в файле cpp.

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

11 голосов
/ 13 августа 2010

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

Итог: это звучит как идея, которая может сработать, когда «модуль» реализации имеет некоторый особый доступ к классу, но этоэто не так в C ++.

5 голосов
/ 13 августа 2010

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

3 голосов
/ 13 августа 2010

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

...