Как уменьшить объявление класса, находящееся далеко от объявления пространства имен его владельца в файле? - PullRequest
1 голос
/ 01 декабря 2009

Итак, я видел, насколько полезными могут быть пространства имен для организации объявлений в соответствующие группы, но теперь возникает проблема с этим.

Разница между созданием библиотеки в C и библиотекой в ​​C ++ заключается в C, вы должны добавить к своим объявлениям префикс того, к чему они принадлежат, например, библиотека, которую мы дублируем MyMath, может иметь векторный класс, а имя может быть MM_Vector.

В C ++ у вас будет пространство имен MyMath с классом Vector, объявленным как его часть.

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

Что люди сделали, чтобы уменьшить это раздражение?

Ответы [ 5 ]

2 голосов
/ 01 декабря 2009

В главе 8 своей книги Страуструп рекомендует такой стиль:

MyMath.h

namespace MyMath {
  class Vector;
};

vector.h

#include "MyMath.h"

class MyMath::Vector {
  public:
  Vector();
  // ...
};

Vector.cc

#include "Vector.h"

MyMath::Vector::Vector() { /* ... */ }

Ограничение открытых деклараций пространства имен объявлениями их содержимого дает краткие резюме. Полностью определенные определения позволяют компилятору ловить опечатки.

Применительно к вашей проблеме, объявления и определения классов в этом стиле делают понятным родительское пространство имен каждого класса - за счет того, что люди Go называют заиканием .

2 голосов
/ 01 декабря 2009

"проблема только в файлах, где объявление не находится рядом с объявлением пространства имен, что может быть распространено, если между ними объявлены константы и перечисления)."

Если это вас беспокоит, сделайте следующее:

namespace MyMath {
    constants and enumerations go here
}

namespace MyMath {
    class goes here
}

namespace MyMath {
    another class goes here
}

В отличие от класса, вам не нужно определять пространство имен все вместе. Скобки не означают «это все, что есть», они просто обозначают область, в которой все определения находятся в этом пространстве имен, а все символы ищутся в пространстве имен.

2 голосов
/ 01 декабря 2009

Используйте IDE, которая предоставляет быстрые советы и навигацию по символам, и / или используйте генераторы документов (например, Doxygen).

0 голосов
/ 01 декабря 2009

Проблема, которую вы описываете, сводится к умонастроению, в котором вы находитесь. При разработке кода вы прекрасно понимаете, что используете MyMath::Vector, поэтому вам интересно видеть как можно меньше помех и добавить предложение using namespace MyMath; или using MyMath::Vector;.

Через пару месяцев кто-то заглядывает в ваш код, и не не знает, из какого пространства имен исходит Vector. Он может утверждать (как и вы), что это объявление using делает код менее понятным.

И вот тут-то и появляется хорошая IDE: вы можете оставить пространство имен (которое может стать довольно большим для больших систем), но при отладке / редактировании кода IDE может совершенно точно подсказать вам, где был символ объявлен, определен, на него есть ссылки и т. д. *

0 голосов
/ 01 декабря 2009

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

...