gpt4 book ai didi

c++ - 什么是正确的设计方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:01:28 25 4
gpt4 key购买 nike

我有以下现有场景。

我有一个包含 validate( Command* ) 函数的 Validator 类,该函数验证传递给它的命令。

class Validator
{
public:
validate(Command* cmd)
{
// common validation logic
}

}

我有三个类:WindowsExecute、SolarisExecute 和 AIXExecute。 SolarisExecute 和 AIXExecute 中的成员函数 execute() 直接创建 Validator 对象,并使用 validate( Comman* ) 函数在执行前验证 Command。

class SolarisExecute
{
public:
execute(Command *cmd)
{
Validator v;
bool valid = v.validate(cmd);

// some processing depending on 'valid'
}
}

class AIXExecute
{
public:
execute(Command *cmd)
{
Validator v;
bool valid = v.validate(cmd);

// some processing depending on 'valid'
}
}

WindowsExecute 完全不同,没有任何命令。相反,它需要验证一些字符串数据。为此,有一个单独的类,称为 WindowsValidator,它继承自 Validator。 WindowsExecute::execute() 使用 WindowsValidator 而不是 Validator。

class WindowsValidator : Validator
{
public:
validate(const string &xmlData)
{
// specific validation logic
}
}

class WindowsExecute
{
public:
execute(const string &data)
{
WindowsValidate v;
bool valid = v.validate(data);

// some processing depending on 'valid'
}
}

这是现有代码。

现在我需要对 Solaris 进行一些特定的验证,因此不能使用 Validator::validate( Command* )。按照当前的设计,我需要创建名为 SolarisValidator 的新类,并拥有我自己的 validate(Command*) 实现。

我不喜欢这种方法。我认为的一些问题/意见:

  1. 验证器类只能由 AIXExecute 使用。那么,如果没有任何共同的逻辑,为什么还要有一个基类呢?只需要三个类 SolarisValidator、AIXValidator、WindowsValidator。

  2. Validator::validate( Command* ) 不必要地继承到 WindowsValidate 类中。请注意 WindowsValidate::validate(string) 和 Validator::validate( Command* ) 的签名不同。

  3. 如果我引入 SolarisValidator::validate( Command* ),我应该将 Validator::validate( Command* ) 虚拟化。这意味着即使我没有使用任何动态多态性,我也会引入虚拟指针的开销。那么,为什么不按照上面的 #1 创建三个单独的类呢?

对于这种情况,将来也可以扩展的最佳解决方案是什么?我正在使用 C++ 进行实现。

提前致谢。

-全科医生

最佳答案

看起来你有命令的概念,不管它是否有效。根据您的平台,该命令以不同的形式表示。

所以我想知道:为什么不创建一个带有函数“isValid”的 ICommand 接口(interface),并让您的平台包装代码为该平台创建适当的 ICommand 对象。这将使您的“执行”调用无需创建验证器,从而使其与平台无关。

注意:这个平台包装器子系统是最适合使用工厂模式设计的。

关于c++ - 什么是正确的设计方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1176617/

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