Skip to content

header, cpp file and namespace structure / library organisation #1259

Open
@adam-ce

Description

@adam-ce

This partly overlaps with #497, but imo it's broader, so opening another issue.

I wonder whether it would make sense to make guidelines for structuring the headers and cpp files of libraries. For instance currently

  • the stl has toplevel headers (<vector>), but a std:: namespace
  • opencv uses <opencv2/core/mat.hpp> and <opencv2/core.hpp>, and a cv:: namespace
  • qt uses toplevel <QString> but alternatively also <QtCore/QString>, and the Q prefix (the prefix afaik for historical reasons)

Imo there should be guidelines for:

  1. Where to put the header files (top directory (stl) vs. library dir (opencv)? That's mainly a packaging and project setup thing, but why not provide guidelines?
  2. Should there be a general namespace for the company, or the library? Should it be long and descriptive or short (2-3 letters)?
  3. How to organise functionality?
    3.1 Should namespace names follow the directory structure?
    3.2 When should i put a group of classes into a subdirectory?
    3.3 When should i use namespaces, separate classes or subclasses?
  4. Build systems, specifying that there should be no conflicts when building two .cpp files with the same name but a different path (out of scope?)

Examples for 3.:

  1. Say, i have an abstract base class and many derived classes. Should the derived classes go into a subdirectory? What about the base class? What about naming? E.g. for shapes, should it be "abstract_shape, circle_shape, triangle_shape, etc.", "shape, circle, triangle", or rather "shape::base, shape::circle, shape::triangle" etc with a namespace and directory shape? There are implications for instance for code completion (when typing I don't remember which shapes exist and which not, I'd like to have suggestions).
  2. Say i have building blocks, each with certain repetitive classes "shape::object, shape::settings, shape::factory etc.". Should there be a namespace shape as in the example, separate classes "shape, shape_settings, shape_factory etc.", or subclasses of shape "shape, shape::settings, shape::factory etc."?

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions