Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 对象表示与转换的设计决策_Oop_Design Patterns - Fatal编程技术网

Oop 对象表示与转换的设计决策

Oop 对象表示与转换的设计决策,oop,design-patterns,Oop,Design Patterns,我需要在不同的实体之间映射,以便在两个系统之间创建同步工具。映射是1:1,我将在4-5个不同的实体之间映射 例如 通信是通过RESTAPI在JSON中进行的,对于不同的请求,我必须将对象转换为JSON表示形式 我希望了解您在以下决定中的想法: 1) 在每个类中,创建一个类方法,该方法知道如何转换为其他系统中相应的对象。每个类都知道如何通过实现toJSON和toXML方法来表示自己 例如 2) 直接使用转换器类(Object->JSON)和方法将对象转换为另一个系统中相应的JSON。例如。 Con

我需要在不同的实体之间映射,以便在两个系统之间创建同步工具。映射是1:1,我将在4-5个不同的实体之间映射

例如

通信是通过RESTAPI在JSON中进行的,对于不同的请求,我必须将对象转换为JSON表示形式

我希望了解您在以下决定中的想法:

1) 在每个类中,创建一个类方法,该方法知道如何转换为其他系统中相应的对象。每个类都知道如何通过实现toJSON和toXML方法来表示自己

例如

2) 直接使用转换器类(Object->JSON)和方法将对象转换为另一个系统中相应的JSON。例如。
Converter.entityAtoEntityBJSON(aEntityA)
返回实体B系统中实体a的JSON表示形式

第二个选项将导致转换器类了解每个实体,而在1)中,只有两个类相互了解。此外,如果需要表示XML,则每个类都可以实现一个toXML()

你觉得怎么样


编辑:添加了关于RESTAPI的注释

虽然第一个选项看起来很有说服力,但我发现它打破了(单一责任原则),因为它现在有不止一个改变的理由,每个实体都知道如何将其自身转换为其他形式,因此无论何时改变表示格式或结构,都必须修改每个实体。因此,我更喜欢第二种选择,即集中改变。我会使用像
IMapper
这样的接口,它接受一个实体并将其转换为另一个系统中的实体。这与大多数ORM将对象存储到数据库中的方式类似。

还有许多其他选项,而且示例代码在语法上不正确,除了样式问题之外。如果您想在“系统”之间传递数据,则必须将其转换为某种格式。为什么不使用Protobuf.net呢?如果
A1
A2
是不同“系统”的一部分,那么直接转换代码如何工作呢?我只想说明两种选择,语法实际上是不相关的,如果不够清楚的话,很抱歉。我不确定序列化是否是这里的最佳选择,仅仅因为它是非常少量的数据,需要通过REST进行通信。这是它的关键。您实际上希望在系统之间传递哪些数据?如果两个系统都使用REST接口,则该数据只需通过HTTP请求即可传输。数据是JSON格式的简单文本字符串。Id,key,entityType,date-string。你的意思是这样的:接口IMapper{A1-mapToA1(A2-A2);A2-mapToA2(A1-A1);}?@hajder,是的,我可能会做类似的事情,不用担心接口会知道(依赖)所有这些实体,这样你就可以将更改集中在一个位置。
A1 -> B1
A2 -> B2
A3 -> B3
class A1 {
    static A2 toA2(A1 a1) return { }
    String toJSON() return { }
} 
class A2 {
    static A1 toA1(A2 a2) return { }
    String to JSON() return { }
}