【问题标题】:Namespace or Class, which is better for encapsulation of only function members命名空间或类,更适合仅封装函数成员
【发布时间】:2012-02-21 23:49:09
【问题描述】:

所以,假设我有几个函数来处理文件的打开/关闭。

用静态声明的所有这些函数创建一个类会更好吗 还是干脆把“public”函数放在namespace“file”的头文件中,剩下的“实现细节”放在.cc文件中?

以下是代码示例。

名称空间有点长,因为我想尽可能清楚。

谢谢!!


类实现

标题:

#ifndef FILE_H
#define FILE_H

#include <iostream>
#include <fstream>

include "common.h"

enum Errorcode {
    FILE_CANNOT_OPEN,
    FILE_CANNOT_CLOSE
};

class file {

public:
    static common::Lines toLines(std::string filename);

private:
    static void err(Errorcode e, std::string msg);
    static void toLines(std::ifstream &ifs, common::Lines &lines);

};

#endif

.cc 文件:

/*just the implementation details of above class.*/

命名空间实现

标题:

#ifndef FILE_H
#define FILE_H

#include <iostream>
#include <fstream>

#include "common.h"

namespace file {

common::Lines toLines(std::string filename);

}

#endif    

.cc 文件:

namespace file {

enum Errorcode {
    FILE_CANNOT_OPEN,
    FILE_CANNOT_CLOSE
};

void err(Errorcode e, std::string msg);
void toLines(std::ifstream& ifs, common::Lines &lines);

common::Lines toLines(std::string filename)
{
    std::vector<std::string> lines;

    try {
        std::ifstream ifs(filename.c_str());
        if (ifs.fail()) throw FILE_CANNOT_OPEN;

        toLines(ifs, lines);

        ifs.close();
        if (ifs.fail()) throw FILE_CANNOT_CLOSE;
    }
    catch (Errorcode e) {
        err(e, filename);
    }

    return lines;
}

void err(Errorcode e, std::string msg)
{
    switch (e) {
        default:
            std::cerr << "Unknown error.\n";
            break;
        case FILE_CANNOT_OPEN:          
            std::cerr << "file \"" << msg   
                << "\" could not be opened.\n"; 
            break;
        case FILE_CANNOT_CLOSE:         
            std::cerr << "file \"" << msg   
                << "\" could not be closed.\n"; 
            break;
    }
    std::exit(-1);
}

void toLines(std::ifstream& ifs, common::Lines &lines)
{
    std::string line;

    while(std::getline(ifs, line)) {
        lines.push_back(line);
    }

    ifs.clear();    // clear error bit set by getline()
}

}                    

【问题讨论】:

  • 任何一种方式都可以很好地工作,但命名空间是更常见的 C++ 风格。

标签: c++ class namespaces encapsulation


【解决方案1】:

从表面上看,静态类函数和命名空间函数几乎是相同的,实际上类在命名空间支持普及之前的早期就已使用。

如今,您应该做最能表达程序逻辑结构(即心智模型)的事情。如果要对相关函数进行分组,则它是一个命名空间。

但是,简而言之,技术差异在于命名空间参与参数相关查找 (ADL),而类成员函数不参与,但类可以转换为模板并专门化。如果这些语义差异中的任何一个对您很重要,那么这种考虑可能会帮助您做出正确的选择。

【讨论】:

  • @BeyondSora:给你:ADL - Koenig Lookup
  • 现在我知道 ADL 是什么了。我认为在我的情况下,使用命名空间而不是类可能会更好。谢谢!!
【解决方案2】:

有一个涵盖大多数情况的简单问题:如果您将其设为一个类,该类的实例是否有意义并完成一些有用的事情?

如果一个实例有用,那么你需要一个类。否则,命名空间可能是更好的选择。

【讨论】:

  • 就我而言,根本不需要实例。所以看起来命名空间是适合我的。
【解决方案3】:

随着 oop 越来越流行,当你开发一个只有 1 个程序员的小项目时,Class 是一个更好的选择。 当你开发一个复杂的应用程序时,结合类和命名空间会更好。

【讨论】:

  • 这篇文章是推测性的、主观的,大部分是虚构的,其余的是一厢情愿。
  • 是的,类非常适合面向对象编程,因为它们对对象进行建模。但是这个问题具体说他有一组相关的功能,只需要封装,而不是它们建模一个对象。他问是静态类还是命名空间更好。静态类没有什么特别的 OOP,在这种情况下,使用命名空间可能是更好的选择。我不知道它是简单还是复杂的应用程序为什么重要;好的设计就是好的设计,不管是简单的还是复杂的,一个程序员还是一千个。
  • oop 是如何越来越流行的?在过去的 10 年里,它的受欢迎程度不是已经趋于平稳,甚至随着功能特性被主流语言采用而下降?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
相关资源
最近更新 更多