C++ 在STL中给类成员起名字的错误做法?
除了保留字之外,给成员函数或变量指定与STL或C标准库名称相同(或类似)的标识符是否有问题?使用这样的名称有什么缺点?在哪些情况下,这种做法是不可接受的 为了更好地说明:C++ 在STL中给类成员起名字的错误做法?,c++,naming-conventions,C++,Naming Conventions,除了保留字之外,给成员函数或变量指定与STL或C标准库名称相同(或类似)的标识符是否有问题?使用这样的名称有什么缺点?在哪些情况下,这种做法是不可接受的 为了更好地说明: class Example { public: size_t size(); bool empty(); void erase(ctype end); int memset(const Example &); private: typedef int lower_bound;
class Example
{
public:
size_t size();
bool empty();
void erase(ctype end);
int memset(const Example &);
private:
typedef int lower_bound;
std::vector<lower_bound> stack;
};
类示例
{
公众:
size_t size();
bool empty();
无效擦除(ctype end);
int memset(常量示例&);
私人:
typedef int下限;
std::向量堆栈;
};
这可能被视为良好实践的原因是一致性。您希望用户能够拥有一个熟悉的界面,并且可以说不“妨碍他们”。换句话说,您可以继续按照标准库对类进行建模。在我看来,库的问题在于冗长的名称和接口。除非您污染了全局名称空间,否则它实际上是没有必要的,您无论如何都不应该这样做。如果您的函数有意外的副作用,或者做了与用户通常期望的实现方式相反的事情,那么您只希望偏离命名约定。有关用户如何尝试使用擦除功能并期望它以这种方式工作的示例,请参阅。将其视为良好做法的原因是一致性。您希望用户能够拥有一个熟悉的界面,并且可以说不“妨碍他们”。换句话说,您可以继续按照标准库对类进行建模。在我看来,库的问题在于冗长的名称和接口。除非您污染了全局名称空间,否则它实际上是没有必要的,您无论如何都不应该这样做。如果您的函数有意外的副作用,或者做了与用户通常期望的实现方式相反的事情,那么您只希望偏离命名约定。有关用户如何尝试使用擦除
功能并期望它以这种方式工作的示例,请参见。在您提供的示例代码中,唯一值得怀疑的名称选择是memset
,因为用户不清楚e.memset(b)
的含义。如果不清楚这意味着什么,那么只要用户清楚名称,这就是一件好事
现在问题来了,众所周知的名字可能比这个词的实际意思传达更多的含义。例如,您可以编写如下容器类型:
class MyContainer {
// ...
void add(const Element& e);
// Adds 'e' to the container
bool isEmpty() const;
// Returns true if the container is empty
void empty();
// Removes all elements from the container
};
虽然名称的选择本身并没有什么问题,但在容器中,人们希望empty()
是返回容器是否为空的检查。对于一个函数来说,这将是一个糟糕的选择,因为它会产生混乱,并且做任何不同的事情
因此,基本上使用相同的标识符是可以的,只要使用不冲突并且不会让其他开发人员感到困惑。在您提供的示例代码中,唯一值得怀疑的名称选择是memset
,因为用户不清楚e.memset(b)
的含义。如果不清楚这意味着什么,那么只要用户清楚名称,这就是一件好事
现在问题来了,众所周知的名字可能比这个词的实际意思传达更多的含义。例如,您可以编写如下容器类型:
class MyContainer {
// ...
void add(const Element& e);
// Adds 'e' to the container
bool isEmpty() const;
// Returns true if the container is empty
void empty();
// Removes all elements from the container
};
虽然名称的选择本身并没有什么问题,但在容器中,人们希望empty()
是返回容器是否为空的检查。对于一个函数来说,这将是一个糟糕的选择,因为它会产生混乱,并且做任何不同的事情
因此,基本上,使用相同的标识符是可以的,只要使用不冲突并且不会让其他开发人员感到困惑。STL并不真正与您的类相交,如果您不能混淆它们,那么就没有问题。此外,对于执行基本相同操作的函数,使用相同的名称是非常合乎逻辑的。如果有什么区别的话,这实际上是一种很好的做法。很好,只需使用名称空间s来防止名称冲突。@JesseGood,名称空间应用于全局名称(类、结构,…)但不是对member names.STL实际上并不与您的类相交,如果您不能混淆它们,那么就没有问题了。此外,对于执行基本相同操作的函数,使用相同的名称是非常合乎逻辑的。如果有什么区别的话,这实际上是一种很好的做法。很好,只需使用名称空间s来防止名称冲突。@JesseGood,名称空间适用于全局名称(类、结构等),而不是成员名称。