小编use*_*399的帖子

为什么我们将对象而不是对象成员传递给函数?

FOO()在类A中有一个方法,它从类的数据成员中获取其参数输入B(假设它们是两个浮点数和一个int).我理解这一点的方式,通常更好地实现这一点,如:

A->FOO1(B, other_data_x)
Run Code Online (Sandbox Code Playgroud)

而不是

A->FOO2(B.member1, B.member2, B.member3, other_data_x).
Run Code Online (Sandbox Code Playgroud)

我收集了一个,但不是唯一的优点是它留下了B访问哪些成员的细节,FOO1()因此有助于隐藏实现细节.

但我想知道的是,这是否真正引入了类A和之间的额外耦合B.类A在前者的情况下必须知道类B存在(通过类似include class_B_header.h),如果成员B变化或移动到不同的类或类B被完全消除,你需要修改AFOO1()相应.相比之下,在后一种方法中,FOO2()并不关心类是否B存在,实际上它关心的是它提供了两个浮点数(在这种情况下由B.member1和组成B.member2)和一个int(B.member3).可以肯定的是,在后一个示例中也存在耦合,但是这种耦合在任何地方都可以处理FOO2()被调用或任何类正在调用FOO2(),而不是在A或的定义B.

我想这个问题的第二部分是,是否有解耦的好办法A,并B进一步当我们要实现类似的解决方案FOO1()

c++ oop encapsulation decoupling

12
推荐指数
3
解决办法
724
查看次数

C++帮助重构怪物类

我有一个C背景,并且是C++的新手.我有一个基本的设计问题.我有一个班级(我称之为"厨师"b/c我的问题似乎与此类似,无论是在复杂性还是问题方面)基本上都是这样的

    class chef
    {
    public:
          void prep();
          void cook();
          void plate();

    private: 
          char name;
          char dish_responsible_for;
          int shift_working;
          etc...
    }
Run Code Online (Sandbox Code Playgroud)

在伪代码中,这可以通过以下方式实现:

   int main{
    chef my_chef;
    kitchen_class kitchen;
    for (day=0; day < 365; day++)
         {
         kitchen.opens();
         ....

         my_chef.prep();
         my_chef.cook();
         my_chef.plate();

         ....

         kitchen.closes();
         }
   }
Run Code Online (Sandbox Code Playgroud)

这里的厨师班似乎是一个怪物类,并有可能成为一个.厨师似乎也违反了单一的责任原则,所以我们应该有这样的事情:

  class employee
  {
  protected: 
        char name;
        int shift_working;
  }

  class kitchen_worker : employee
  {
  protected: 
        dish_responsible_for;
  }

  class cook_food : kitchen_worker
  {
  public:
        void cook();
        etc...
  }
  class prep_food : kitchen_worker
  {
  public:
        void prep();
        etc... …
Run Code Online (Sandbox Code Playgroud)

c++ oop refactoring anti-patterns

7
推荐指数
1
解决办法
703
查看次数