是否有与此方法匹配的设计模式?

时间:2011-08-23 09:50:55

标签: c# .net oop design-patterns

我有一个只有简单属性的DTO。

我想对DTO实例进行一些测试,比如说:IsOld,IsFromBataFamily等。

我正在考虑扩展DTO类并实现这些测试器方法。

public class TestableDTO : DTO
{

  public bool IsOld() { // some logic }
  public bool IsFromBataFamily () { // some logic }

}

是否有任何与此方法匹配的设计模式(扩展DTO类以在其上添加一些测试人员以对其类别进行分类)?

请说出来吗?

4 个答案:

答案 0 :(得分:1)

这只是简单的继承,不确定它是否有与之关联的模式。如果您的TestableDTO在内部持有DTO引用,目的是向其中添加成员,那么这将是Decorator模式,或者至少是它的一种风格。

public class TestableDTO
{
    private DTO _dto;

    public bool IsOld() { // some logic }
    public bool IsFromBataFamily () { // some logic }

    // Expose DTO public members again...
}

所以简短的答案是否定的,目前这不是“设计模式”本身,而是OO范式的类继承或可扩展性。

为了澄清一下,你在课堂上添加成员所做的工作非常好。但是,它的原因(仅用于测试)可能被认为有点奇怪,因为您应该能够直接测试DTO

答案 1 :(得分:0)

这类似于装饰器模式但不完全相似。我能想到的最接近的是继承或专业化。

Roy Osherove描述了一种名为Extract and Override的方法,你可以在他的书“单位测试的艺术”(我大力推荐)中读到这个方法。 online sample chapter描述了这一点。

这应该提供一些关于如何使用继承来使对象更易于测试的更好的想法。

答案 2 :(得分:0)

如果您尝试扩展特定DTO以进行单元测试,最简单,最干净的方法是实现扩展方法 - 例如

public static Class DtoExtensionMethods {
public static bool IsTooOld(this SomeSpecificDto specificDto)
{
    return specificDto.LastModified < DateTime.Now - TimeSpan.FromHours(2) ;
}}

答案 3 :(得分:0)

这不能回答你的问题,但以下不是更好的方法吗?

[Flags]
public enum TestDTOFlags
{
    None = 0,
    Old = 1,
    FromBataFamily = 2
}

public class TestableDTO : DTO 
{
  public TestDTOFlags DetermineFlags() { /* some logic */ }
}

为了进一步将其与业务逻辑分开,也许这可能是测试套件中的扩展方法:

public static class DTOExtensions
{
  public static TestDTOFlags DetermineFlags(this DTO target) { /* some logic */ }
}