如何重构两个 类 做同样的事情,除了一种方法使它们对 OOP 更友好?

How to refactor two classes doing the same thing except one method to make them more OOP-friendly?

我在设计项目模块时遇到问题。

比方说,你有两个 类,他们几乎都在做同样的事情。你可以像 DeviceManager 一样思考。

两者connect/disconnect/parse完全一样。在解析来自设备的消息后,他们需要做不同的事情,比如其中一个打印一条消息,另一个将它传递到其他地方。

我需要最好地设计这个结构,因为 oop 可能允许继承、接口、抽象等。但我不确定解决这个问题的最佳方法是什么。

注意:我不想违反任何SOLID原则。

谢谢。

示例:

// lines exactly same code
** line different code

class DeviceMessageNavigator
{
    //connect 
    //wait message
    //parse message
    **//NAVIGATE MESSAGE(Pass it to somewhere else)**
    //disconnect
}
class DeviceMessagePrinter
{
    //connect
    //wait message
    //parse message
    **//PRINT MESSAGE**
    //disconnect
}

根据 Olivier 的回答我起草了这个,我不确定这是最好的方法。

abstract class DeviceMessage
{
    protected string message;
    //connect
    //wait message
    //parse message
    message=recievedMessage;
    abstract void ProcessMessage();
    //disconnect
}
class DeviceMessageNavigator:DeviceMessage
{
    //connect 
    //wait message
    //parse message
    **//NAVIGATE MESSAGE(Pass it to somewhere else)**
    //disconnect
}
class DeviceMessagePrinter:DeviceMessage
{
    //connect
    //wait message
    //parse message
    **//PRINT MESSAGE**
    //disconnect
}

您自己的答案很像伪代码,但方向正确。 请 post 编译代码,它更容易 copy/paste 和可编辑。因此更容易帮助你。

public abstract class DeviceMessageBase
{
    public void Connect()
    {
        // do connect things
    }

    public void WaitMessage()
    {
        // do wait message things
    }

    public void ParseMessage()
    {
        // do parse message things
    }

    public abstract void ProcessMessage();

}

public class DeviceMessageNavigator : DeviceMessageBase
{
    public override void ProcessMessage()
    {
        //**//NAVIGATE MESSAGE(Pass it to somewhere else)**
    }
}

public class DeviceMessagePrinter : DeviceMessageBase
{
    public override void ProcessMessage()
    {
        //**//PRINT MESSAGE**
    }
}

实际上你有几个选择:

  • 您可以使用两者的共同点创建一个抽象 class,然后添加您需要的方法对其进行扩展。
  • 您可以编写第一个,然后将其扩展到第二个,添加您需要的内容
  • 您可以编写一个带有打印方法和导航方法的 DeviceManager class(如果他们真的做同样的事情,除了一个,这可能是您的答案)

我认为您对 OOP 的看法可能不正确,您可能需要更详细地了解它。例如,在我看来,您正在查看那些 classes 更像是函数:您在其中评论的每条指令都应该是一个独立的方法。查看 class 像现实生活中对象的蓝图一样:您可以构建对象并将其用作预期的蓝图,或者将它们更改为具有不同属性和功能的不同对象。 让我们来看看汽车的蓝图,它有一些属性,比如汽车的形状、门的数量等。它有一些你可以在与它交互时使用的功能,比如打开它、改变收音机的音量、加速等等......这个例子你的问题是:我需要两个相同的丰田雅力士蓝图,一个有一个集成的咖啡机,另一个有 wifi,我该如何设计它们?答案是:拿丰田 yaris 的蓝图,复制一份,然后在一个中添加咖啡机,在另一个中添加 wifi 路由器。