пространство имен против соглашения об именах

0

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

мое внимание уделяется наследованию.

Пример Google:

class MyClassInterface {
  int some_stuff() = 0;
};

class MyClassA : MyClassInterface {
  int some_stuff() { return 1; }
};

class MyClassB : MyClassInterface {
  int some_stuff() { return 2; }
};

теперь моя идея заключалась в использовании пространств имен:

namespace my {

namespace interface {
class Class {
  int some_stuff() = 0;
};
} // namespace interface

namespace a {
class Class : interface::Class {
  int some_stuff() { return 1; }
};
} // namespace a

namespace b {
class Class : interface::Class {
  int some_stuff() { return 2; }
};
} // namespace b

} // namespace my

преимущество такого рода именования можно увидеть в этом примере:

using namepsace my;

void foo(interface::Class lala) {
  // do something;
}

// ...
int main() {
  using namespace a;

  Class bar;
  foo(bar);

  b::Class bar2;
  foo(bar2);
}

теперь я могу напечатать using namespace и он всегда будет использовать предпочтительный, но все остальные дочерние классы по-прежнему доступны там, где есть пространства имен.

теперь мой вопрос: это хорошая идея, или есть некоторые недостатки, о которых я еще не упоминал?

редактировать:

я также мог бы использовать

namespace my {

namespace interface {
class Class {
  int some_stuff() = 0;
};
} // namespace interface

class ClassA : interface::Class {
  int some_stuff() { return 1; }
};

class ClassB : interface::Class {
  int some_stuff() { return 2; }
};

} // namespace my

чтобы не было гнездо на многие пространства имен.

добавление

Я не уверен, что stackoverflow - это подходящее место для постановки вопроса, но у программистов нет даже соглашения об именах (но именования). и на самом деле не очень много обсуждений об пространствах имен и соглашениях об именах. если это неправильно, я мог бы переложить мой вопрос.

Теги:
namespaces
naming-conventions

1 ответ

2
Лучший ответ

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

Примером этого может служить стандартная библиотека: она предоставляет свои функции через пространство имен std и (например) предоставляет библиотеку хроно (ее можно рассматривать как сама библиотека) через пространство имен std::chrono. Другим примером может быть Boost и его библиотеки.

  • 1
    повышение именно поэтому я и спрашиваю. например, глядя на boost :: asio, есть много вложенных пространств имен (boost :: asio :: ip :: udp), что дает преимущество замены, например, udp на tcp . также всегда detail_ использовать пространство имен detail_ для некоторых внутренних вещей. я подумал использовать namespace interface вместо detail_, потому что 1-й используется наиболее внутренним 2-й, более приятно иметь его в пространстве имен, как будто в имени (classInterface). мой первый совет был, пожалуйста, см. мое редактирование. Единственная проблема, которую я вижу сейчас, - это то, что ADL упомянул в своем комментарии.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню