这个问题的要点是关于扩展类,最大程度地减少将所有内容打包到一个类中,并最大程度地提高代码重用性。阅读此问题后,请随时编辑标题或描述以使其更加简洁。尽管该帖子看起来很长,但我只是通过使用许多示例来使内容更加详尽。

假设我有一个类:

class UsedByManyPeople
{
  // ...has many fields
};

顾名思义,此类被许多开发人员使用。我必须向此类添加2个功能:
  • 一个convert(),用于将UsedByManyPeople转换为SomeOtherType
  • 一个getFileName(),它返回一个字符串

  • 两者都是我部门的特定需求。

    首次尝试解决方案

    起初我考虑过简单地向UsedByManyPeople添加2个新方法,因此该类现在看起来像:
    class UsedByManyPeople
    {
      // ...has many fields
    
      public:
        SomeOtherType const convert() const;
        std::string   const getFileName() const;
    };
    

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

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

    您将如何扩展这个类?

    我想到的替代方法是:

    子类UsedByManyPeople并创建我自己的类。
  • 将数据和方法结合在一起

  • 例如,
    class ExtUsedByManyPeople : public UsedByManyPeople
    {
      public:
        SomeOtherType const convert() const;
        std::string   const getFileName() const;
    };
    

    创建Helper类,每个方法一个(喜欢!),然后将其实现为静态方法。
  • 从方法中分离数据,单个一类责任

  • 例如,
    class UsedByManyPeopleToSomeOtherTypeConverter
    {
      public:
        static SomeOtherType const convert(UsedByManyPeople const&);
    };
    class UsedByManyPeopleFileName
    {
      public:
        static std::string const getFileName(UsedByManyPeople const&);
    };
    

    创建一个包含所有方法的单个Helper类。
  • 将数据与方法分开,单个类承担许多责任

  • 例如,
    class UsedByManyPeopleHelper
    {
      public:
        static SomeOtherType const convert(UsedByManyPeople const&);
        static std::string   const getFileName(UsedByManyPeople const&);
    };
    

    最佳答案

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

    有几个原因:

  • 单个帮助程序类可以是
    位于另一个逻辑项目中
    结构
  • 如果您的新方法不需要访问类的内部状态,则会清楚地表示出来。它提供了更好的封装。 (您在const ref的基础上进行了补充,这被认为是一种不错的样式)
  • UsedByManyPeople不应该
    负责自我转换
    变成另一种类型。这违反了
    固体
  • 关于c++ - 类设计建议: extending a class and code reuse,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2320847/

    10-09 13:38