На самом деле это довольно хороший вопрос, потому что читаемость оказывает большое влияние на того, кто будет читать код после вас.
Есть 3 вида людей, которые будут читать код класса:
- тех, кто желает использовать его (и не очень заботится о его внутренностях)
- тех, кто хочет унаследовать от вашего класса (и не очень заботится о его внутренностях)
- тех, кто хочет взломать ваш класс и, таким образом, действительно заботиться о его внутренностях
По этой причине я пытаюсь упорядочить заголовки так, чтобы любой пользователь мог остановиться, как только получил то, что искал, что означает:
class Foo
{
public:
// types
// static methods
// methods (usually constructors,
// then simple accessors,
// then more complicated stuff)
protected:
// same pattern
private:
// same pattern
// attributes
};
// Free functions about this class
// Implementation of inline / template methods
Иногда мне нужно заранее объявить некоторые типы, даже если они закрытые, но это редко. Цель этого порядка - абсолютно минимизировать количество вещей, которые читатель должен прочитать, прежде чем он получит то, что хочет (и прекратит чтение, и вернется к тому, что делал, прежде чем прерывать себя, чтобы посмотреть на ваш код). *
Тогда, что касается "вспомогательных" методов, это зависит от типа кода:
- для кода шаблона, я использую пространство имен «details», читателю ясно, что он не должен беспокоиться об этом, и он изолирует имена в их собственном пространстве имен, чтобы они не появлялись в инструментах завершения кода
- для обычного кода я использую анонимное пространство имен в исходном файле, что даже лучше, так как тогда он фактически генерирует невидимые символы, и я не рискую нарушить ODR .
Если для какого-то кода может потребоваться много помощников, я склонен создавать выделенный заголовочный файл в исходном каталоге, давая следующую структуру:
include/
foo.hpp
src/
fooImpl.hpp --> #include "foo.hpp"
foo.cpp --> #include "fooImpl.hpp"
для того, чтобы предоставить читателю список объявлений, потому что просматривать список объявлений проще, чем извлекать объявления из списка определений, независимо от отступа и стиля.
И, конечно, всегда, чтобы было проще, я всегда одинаково упорядочиваю список объявлений и список определений ...