gpt4 book ai didi

c++ - 一个已经存在的注册表类的包装器类是一个好方法吗?

转载 作者:行者123 更新时间:2023-11-28 06:02:13 25 4
gpt4 key购买 nike

在 Qt 中,显然有一个类可以读取和写入 QSettings 注册表(我只是从 Windows 的角度来看)。正常的本能是在我们需要向注册表读取/写入值时使用该类,但它真的是“面向对象的”吗?

我觉得(以及我所做的)是为我的应用程序编写我自己的注册表类,它在内部使用“QSettings”。我禁止我的应用程序直接使用 QSettings 并要求所有注册表都应通过我自己的类处理,我将其命名为“Registry”。

考虑我旧代码中的以下示例:

void MainWindow::on_actionSettings_triggered()
{
SettingsDialog * settings = new SettingsDialog;

settings->exec();

if ( settings->result() == QDialog::Accepted)
{
IP = QSettings().value( IP_ADDRESS, DEFAULT_IP_ADDRESS).toString();
emit ui->actionRefresh_Devices->triggered();
}

delete settings;
}

在我的新代码中,这个函数略有变化:

void MainWindow::on_actionSettings_triggered()
{
SettingsDialog * settings = new SettingsDialog;

settings->exec();

if ( settings->result() == QDialog::Accepted)
{
IP = Registry().getLastIP();
emit ui->actionRefresh_Devices->triggered();
}

delete settings;
}

尽管它的变化很小,但对我来说感觉更加面向对象。你同意吗?

沿着同一条线,我为每个数量设置了单独的函数,即使它们都是字符串。您同意这是好的做法还是只是添加额外的代码?这是我的小型 Registry 类。

class Registry
{
public:
Registry();
~Registry();

protected:
QSettings settings;

public:
QString getSyncPath();
void setSyncPath(QString syncPath);

QString getLastIP();
void setLastIP(QString ip);

void writeCustomIPs(const QStringList& customIPs );
QStringList readCustomIPs();

};

总而言之,面向对象就是使用类,我们确实有一个用于注册的类,所以请勾选它,但它仍然太通用了。通过组合将此类通用类包装在另一个更具体的类中通常是一种好的做法吗?

最佳答案

您所做的事情的术语是外观。您在事件方法和与注册表的交互之间放置了一个抽象层。

使用外观的最大好处之一是您可以通过仅对外观进行更改来更改程序与注册表交互方式的底层实现 - 即如果将来您决定使用不同的读取方式注册表而不是 QSettings,那么调用 Registry().getLastIP() 的事件方法不必更改,只需更改 getLastIP 方法中的实现,这是一件好事。

无缘无故地添加额外的抽象层不是一个好主意——它会使代码更难维护(更难理解和更难调试)。因此,请始终评估您是否在增加不必要的复杂性。但总的来说,您所做的并不是一个糟糕的设计。

关于c++ - 一个已经存在的注册表类的包装器类是一个好方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33046705/

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