Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在STL中给类成员起名字的错误做法?_C++_Naming Conventions - Fatal编程技术网

C++ 在STL中给类成员起名字的错误做法?

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;

除了保留字之外,给成员函数或变量指定与STL或C标准库名称相同(或类似)的标识符是否有问题?使用这样的名称有什么缺点?在哪些情况下,这种做法是不可接受的

为了更好地说明:

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,
名称空间
适用于全局名称(类、结构等),而不是成员名称。