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