Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/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_Visitor - Fatal编程技术网

Oop 翻译器模式

Oop 翻译器模式,oop,design-patterns,visitor,Oop,Design Patterns,Visitor,在以前的工作中,我的经理建议使用转换器模式将数据从DataTable转换为对象。基本上,Translator类只有静态(即类)方法,因此它是函数调用的聚合。我最初的方法是为每个对象实现构造函数,这些对象可以将DataTable行作为参数,并创建一个与数据对应的实例 他说Translator类是微软提出的,它提供了更好的代码模块化。我可以看到这一点,但同时它似乎是一种非常非面向对象的方法(尽管访问者模式具有类似的特征) 你们中有人用过这种模式吗,你觉得怎么样?利与弊?如果您可以在没有任何外部依赖的

在以前的工作中,我的经理建议使用转换器模式将数据从DataTable转换为对象。基本上,Translator类只有静态(即类)方法,因此它是函数调用的聚合。我最初的方法是为每个对象实现构造函数,这些对象可以将DataTable行作为参数,并创建一个与数据对应的实例

他说Translator类是微软提出的,它提供了更好的代码模块化。我可以看到这一点,但同时它似乎是一种非常非面向对象的方法(尽管访问者模式具有类似的特征)


你们中有人用过这种模式吗,你觉得怎么样?利与弊?

如果您可以在没有任何外部依赖的情况下执行映射,那么除了静态方法之外,使用任何其他方法都是没有用的

也许我遗漏了什么,但为什么不直接使用linq呢

    IEnumerable<Customer> customerQuery =
    from cust in customers
    where cust.City == "London"
    select cust;

foreach (Customer customer in customerQuery)
{
    Console.WriteLine(customer.LastName + ", " + customer.FirstName);
}
IEnumerable customerQuery=
客户中的客户
其中客户城市==“伦敦”
选择客户;
foreach(customerQuery中的客户)
{
Console.WriteLine(customer.LastName+,“+customer.FirstName);
}

无论如何,TranslatorPattern是将数据结构从一种表示形式更改为另一种等效结构。下面是关于这一点的更深入的信息。

从中可以看出,Translator模式是visitor模式的非OOP实现。文章最后指出了一些缺点,包括在OOP语义中很难表达(但不是代码),换句话说,如果在剩下的代码中使用纯OOP,它可以很好地工作,但可能没有多大意义。

我想你说的是。我认为这个场景中的译者自然是一个静态的方法。它住在哪里是一个美学问题。它还应该很容易进行单元测试,因为它应该只依赖于在两个数据结构之间转换的数据结构。听起来好像他们的“数据契约”的另一个名字是DTO(数据传输对象)。

他的问题是关于翻译器模式,而不是关于如何完成任务。此外,OP没有说他正在使用特定版本的框架,Linq可能不适合他的情况。非常正确。尽管如此,我还是提供了一个代码示例,说明了如何优雅地完成此任务,以供有类似任务的用户使用。我还提供了一个指向TranslatorPattern(接近)原始源的URL,供用户自学。@GrayWizardx,请参阅。在我的情况下,我正在处理一个API。我不确定Richard的查询示例是关于什么的,因为这个问题与查询无关。感谢Igor,这是一个有用的链接—关于实体转换器和Microsoft模式的存在。