类设计建议:扩展类和代码重用

siv*_*udh 6 c++ oop class-design

这个问题的要点是扩展一个类,最大限度地减少堵塞 - 将所有内容打包到一个类中,并最大化代码重用.阅读完这个问题后,请随时编辑标题或说明,使其更加简洁.虽然帖子看起来很长,但我只是想通过使用大量的例子来彻底解决.

假设我有一个班级:

class UsedByManyPeople
{
  // ...has many fields
};
Run Code Online (Sandbox Code Playgroud)

顾名思义,这个类被许多开发人员使用.我必须为这个类添加2个功能:

  1. 将UsedByManyPeople转换为SomeOtherType的convert()
  2. 一个返回字符串的getFileName()

它们都是我部门需要的.


首次尝试解决方案

起初我想过简单地向UsedByManyPeople添加两个新方法.因此,该类现在看起来像:

class UsedByManyPeople
{
  // ...has many fields

  public:
    SomeOtherType const convert() const;
    std::string   const getFileName() const;
};
Run Code Online (Sandbox Code Playgroud)

但是,这2个功能实际上是特定于我部门的用例,而其他部门甚至没有SomeOtherType的类定义,也不关心getFileName().

显然,上述方法不是一个好方法(?).

你会如何扩展这门课程?

我想到的替代方案:


Subclass UsedByManyPeople并创建我自己的类.

  • 将数据和方法结合在一起

例如,

class ExtUsedByManyPeople : public UsedByManyPeople
{
  public:
    SomeOtherType const convert() const;
    std::string   const getFileName() const;
};
Run Code Online (Sandbox Code Playgroud)

创建Helper类,每个方法一个(yikes!),并将其实现为静态方法.

  • 从方法中分离数据,单一责任

例如,

class UsedByManyPeopleToSomeOtherTypeConverter
{    
  public:
    static SomeOtherType const convert(UsedByManyPeople const&);
};
class UsedByManyPeopleFileName
{
  public:
    static std::string const getFileName(UsedByManyPeople const&);
};
Run Code Online (Sandbox Code Playgroud)

创建一个Helper类,其中包含所有方法.

  • 从方法中分离数据,单个类有很多责任

例如,

class UsedByManyPeopleHelper
{
  public:
    static SomeOtherType const convert(UsedByManyPeople const&);
    static std::string   const getFileName(UsedByManyPeople const&);
};
Run Code Online (Sandbox Code Playgroud)

Joh*_*lph 4

特别是如果这些方法特定于您的部门使用该类,您应该按以下方式实现它们:创建一个 Helper 类,其中包含所有方法。

有几个原因:

  • 单个帮助程序类可以位于另一个逻辑项目结构中
  • 如果您的新方法不需要访问类的内部状态,那么这一点就会清楚地表达出来。它提供了更好的封装。(您补充了 const ref,认为这是一个很好的风格)
  • UsedByManyPeople不应该负责将自身转换为另一种类型。这违反了 SOLID