如何重构两个 类 做同样的事情,除了一种方法使它们对 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 路由器。
我在设计项目模块时遇到问题。
比方说,你有两个 类,他们几乎都在做同样的事情。你可以像 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 路由器。