на самом деле я начинаю новый небольшой проект для себя и читаю что-то о соглашениях об именах. независимо от того, какой стиль кодирования предпочтительнее, стиль кодирования 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 - это подходящее место для постановки вопроса, но у программистов нет даже соглашения об именах (но именования). и на самом деле не очень много обсуждений об пространствах имен и соглашениях об именах. если это неправильно, я мог бы переложить мой вопрос.
Я считаю, что хорошим правилом является использование пространств имен для идентификации библиотеки (содержимое библиотеки). Используйте вложенные пространства имен в очень специфических случаях (случаи, когда содержимое этого вложенного пространства имен можно считать самой библиотекой).
Примером этого может служить стандартная библиотека: она предоставляет свои функции через пространство имен std
и (например) предоставляет библиотеку хроно (ее можно рассматривать как сама библиотека) через пространство имен std::chrono
. Другим примером может быть Boost и его библиотеки.
udp
наtcp
. также всегдаdetail_
использовать пространство именdetail_
для некоторых внутренних вещей. я подумал использоватьnamespace interface
вместо detail_, потому что 1-й используется наиболее внутренним 2-й, более приятно иметь его в пространстве имен, как будто в имени (classInterface). мой первый совет был, пожалуйста, см. мое редактирование. Единственная проблема, которую я вижу сейчас, - это то, что ADL упомянул в своем комментарии.