每次我写标题时,我都会做这样的事情:
#ifndef D723E2D5_1943_4166_87CC_73F5C9C47544
#define D723E2D5_1943_4166_87CC_73F5C9C47544
#include "RandomIntegers.hpp"
...
#include "IRenderer.hpp"
namespace Pathfinding::Core { class ApplicationBuilder; }
namespace Pathfinding::Datastructures { struct Node; }
namespace Pathfinding::Core
{
class Application final : public Pathfinding::Abstract::IApplication
{
friend Pathfinding::Core::ApplicationBuilder;
private:
using PAIMenu = Pathfinding::Abstract::IMenu;
using PAIEventManager = Pathfinding::Abstract::IEventManager;
using PAAIncrementalInformedAlgorithm = Pathfinding::Abstract::AIncrementalInformedAlgorithm;
using PAIGraphOperations = Pathfinding::Abstract::IGraphOperations;
using PCApplicationState = Pathfinding::Core::ApplicationState;
using PAALatGraphWr = Pathfinding::Abstract::ALatGraphWr;
using PAIAStar = Pathfinding::Abstract::IAStar;
using PDPathfinderCachee = Pathfinding::Datastructures::PathfinderCache;
using PEMouseData = Pathfinding::Events::MouseData;
using PEBindingsContainer = Pathfinding::Events::BindingsContainer;
using PRDrawablePath = Pathfinding::Rendering::DrawablePath;
using PDNode = Pathfinding::Datastructures::Node;
using PADSFMazeGenerator = Pathfinding::Algorithms::DFSMazeGenerator;
using PRNodeStateColors = Pathfinding::Rendering::NodeStateColors;
using PAIFontLoader = Pathfinding::Abstract::IFontLoader;
using PRGradientChanger = Pathfinding::Rendering::GradientChanger;
using PAIRenderer = Pathfinding::Abstract::IRenderer;
public:
...
private:
std::unique_ptr<PAIMenu> menuUPtr = nullptr;
...
PEBindingsContainer bindings;
};
}
#endif /* D723E2D5_1943_4166_87CC_73F5C9C47544 */但我不确定using的东西,有没有更好的方法,还是这是可以接受的?据我所知,它肯定比使用Foo::Bar::Class在名称空间范围内的使用更好,那么还有哪些其他选择呢?
PS:我发现了一个类似的问题,但它有八年的历史,有些也许有新的东西。
发布于 2022-03-30 19:43:30
类型别名或命名空间别名 using NewName = OldName或using Qualified::Name或namespace NewName = OldName只是用于类型胡枝子或#define宏的更好的语法,是完全可以接受的。它没有实质性的负面影响。如果它增加了代码的可读性,特别是当它帮助您避免深度嵌套的限定标识符Foo::Bar::Baz时,请使用它。
这与using namespace Foo使用指令完全不同。这会将名称空间中的每个名称引入当前范围。有时,这是适当的,特别是为了方便或由于有关参数依赖的查找规则,但至少在头,这是一个非常糟糕的做法。这就是你的问题所在。头文件中的using namespace被C++核心指南规则SF.7禁止,但在本地作用域中被接受。
就我个人而言,我不认为你的别名那么好,因为它们有一个不必要的前缀。例如,
using PAIMenu = Pathfinding::Abstract::IMenu;在名称中保留不必要的名称空间缩写,这也掩盖了名称中的I接口标记。相反,我会考虑:
首先,也可能没有必要使用这样的别名。如果名称只使用一两次,那么每次只拼写出完全限定的名称可能是合适的。然而,精心选择的缩写也有助于提高复杂类型的可读性,特别是在模板或函数签名的上下文中。
https://softwareengineering.stackexchange.com/questions/437730
复制相似问题