gpt4 book ai didi

c++ - 这种设计是否过度工程化?

转载 作者:可可西里 更新时间:2023-11-01 18:08:31 26 4
gpt4 key购买 nike

您会考虑使用接口(interface)和多态性来扩展这种过度工程化的设计吗?

优点

  • 可扩展
  • 封装
  • 自动魔法

缺点

  • 更多代码
  • 使用起来有点笨重(您必须使用不同的类型名称才能获得不同的行为)
  • 可能由于虚函数调用而使用效率较低。

我的直觉是,对于这种特殊情况,单个 if 语句和一个 bool 标志是更好的选择,但并不是每个人都同意我的看法。

怎么想?


原创

// Connects to a local pipe, and naturally
// owns that connection
struct CommandWriter
{
CommandWriter() {
fd = open("/path/to/fifo", O_WRONLY);
if (fd == -1)
throw std::runtime_error("Could not establish connection to FIFO");
};

~CommandWriter() {
close(fd);
};

// (Has useful member functions here)

private:
CommandWriter(CommandWriter const&); // Not relevant to question

int fd;
};

使用 bool 标志扩展

// Adds a constructor where an FD can be specified
// from the call site, and no ownership is taken
struct CommandWriter
{
CommandWriter() : owns_fd(true) {
fd = open("/path/to/fifo", O_WRONLY);
if (fd == -1)
throw std::runtime_error("Could not establish connection to FIFO");
};

CommandWriter(int fd) : fd(fd), owns_fd(false) {};

~CommandWriter() {
if (owns_fd)
close(fd);
};

// (Has useful member functions here)

private:
CommandWriter(CommandWriter const&); // Not relevant to question

int fd;
bool owns_fd;
};

多态性扩展

// Sorry for the poor type names!
struct ICommandWriter
{
virtual ICommandWriter() {}

// (Has useful member functions here)

private:
ICommandWriter(ICommandWriter const&); // Not relevant to question
};

struct CommandWriter_Connects : ICommandWriter
{
CommandWriter_Connects() {
fd = open("/path/to/fifo", O_WRONLY);
if (fd == -1)
throw std::runtime_error("Could not establish connection to FIFO");
};

~CommandWriter_Connects() {
close(fd);
};

// (Has useful member functions here)

private:
int fd;
};

struct CommandWriter_Uses : ICommandWriter
{
CommandWriter_Uses(int fd) : fd(fd) {};

~CommandWriter_Uses() {};

// (Has useful member functions here)

private:
int fd;
};

最佳答案

这取决于你要用它做什么。如果您有一个大项目并且将多次使用该类的变体,那么让它变得灵活当然是有意义的。

经验法则:

  1. 使用一次 - 保持简单。
  2. 使用两次 - 保持简单并根据需要制作拷贝和更改
  3. 三个或更多 - 推广它并使其适用于所有情况。

当然有很多异常(exception),但这是一个起点。

关于c++ - 这种设计是否过度工程化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5403927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com