具有许多方法的C++类

mwg9r5ms  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在设计一个分布式文件系统,其中一个核心类是FileSystem类,如下所示:

class FileSystem {
public:
  exists(Path*);
  insert_file(File*);
  insert_block(Block*);
  remove(Path*);
  list();
  update_file(File*);
  update_block(Block*);
  get_file(Path*);
  get_block(Block*);
  move(Path*, Path*);
  copy(Path*, Path*);
  ...
  ... // More and more methods
};

我成功地重构了这个项目,但是,我不能重构这个类,每当我需要添加一个行为(装饰器或子类型),我最终使我的设计更加复杂。另一个问题是这个类的依赖数量(路径,块,文件等不包括在代码片段中)。
主要原因是这个FS类有太多的职责,但我仍然找不到一种方法来将这个文件系统类拆分成不同的类。我想知道是否有任何模式来处理这种情况,如果没有,你会如何处理这个巨大的类?

8wigbo56

8wigbo561#

请看一下C++核心准则C.4:
仅当函数需要直接访问类的表示形式时,才使其成为成员
在上面的例子中,不清楚Filesystem有什么内部状态,但我猜是最小的。任何可以由其公共接口表达的函数都应该是自由函数。另一种说法是,任何不涉及保持类不变的函数都不应该是接口的一部分。
我猜文件系统仅由其当前文件夹表示。

class FileSystem {
  private:
    Path* directory_;
  public:
    FileSystem(Path *directory) : directory_ {directory};
    Path* directory() { return directory_; };
};

一个成员函数维护一个不变式的例子是chdir,如果你对它感兴趣的话,它也可以是一个自由函数,返回一个新的FileSystem,使得类基本上是不可变的,这是非常可取的,参见Guideline Con.1。

class FileSystem {
...
    chdir(Path* subpath) { /* checks */ ... }
};

以上其他函数都可以用公共接口表示,所以应该是非成员函数:

exists(FileSystem*, Path*);
insert_file(FileSystem*, File*);
insert_block(FileSystem*, Block*);
remove(FileSystem*, Path*);
list(FileSystem*);
update_file(FileSystem*, File*);
update_block(FileSystem*, Block*);
get_file(FileSystem*, Path*);
get_block(FileSystem*, Block*);
move(FileSystem*, Path*, Path*);
copy(FileSystem*, Path*, Path*);

相关问题