2017-05-19 174 views
1

我反序列化JSON的一些反应,将它们放入取决于如果返回一个对象,如果返回的对象列表两种主要类型之一。我目前正在使用抽象类与类类型属性

public class MultiResponse 
{ 
    public List<DeserializedResult> Result { get; set; } 
} 

public class SingleResponse 
{ 
    public DeserializedResult Result { get; set; } 
} 

public class DeserializedResult 
{ 
    public string Id { get; set; } 
    public string AccountName { get; set; } 
} 

包含响应。但是我知道这不是最好的方法,尤其是因为我不得不在调用类中使用动态返回来处理可能的两种响应类型。我认为抽象类(或接口?)是一个更好的方法来做到这一点,但我不知道如何实现它。我在正确的轨道上&如果是的话,我该如何构建抽象类并进行继承?即保持/返回即使当只有一个对象的列表 -

回答

0

基于多响应创建一个设计。它消除了以某种方式存在特殊情况的设计“暗示”。结果代码将更加一致和强大。

重点应该是对对象本身 - 你再水化后,用它做什么。不是在我有一个对象或多个对象的微小偶然事件中。这种区别与“4个物体或4个物体”没有区别。

将容器抽象为单个类必然会使对象成为焦点和设计重点。

编辑

认为它这样。单个或多个反序列化的对象是有多少对象需要反序列化的结果。这是一个与(反序列化)对象实际使用密切相关的实现细节。 包封物实施细则,就是从客户端代码隐藏它们。为客户提供以“业务领域”术语表达功能的类和方法。

末编辑


编辑

...我不得不使用动态回报在调用的类来处理两种可能的响应。我认为抽象类(或接口?)是一个更好的方法来做到这一点,但我不知道如何实现它。

要点:

  • ClientApi变换反序列化对象到所需的类。

    • 两个API!
      • 构造由去滋润对象
      • 称为隐藏默认的构造函数,以确保有效的对象实例化
      • GetDeHydratedJsonThingy的“使用”客户端调用。
  • 解串器和 “用” 的客户端去耦感谢ClientApi类。

    • 去水化可与DeserializedResults对象
    • “使用”客户只关心MultipleResponse对象
  • “使用”客户的交易只有一个返回类型。

P.S.写完这些之后,我意识到只需要一个“响应”类,现在ClientApi类就封装了对象实例。注释掉的代码是原创的。

P.P.S.我的方法和参数名称真的很糟糕。使用在问题域中具有含义的名称。即用户的术语。

public class ClientApi { 
    protected MultiResponse MoreThanOne { get; set; } 
    // protected SingleResponse OnlyOne { get; set; } 

    protected ClientApi (); 

    public ClientApi (List<DeserializedResult> theList) { 
     if (theList == null) throw ArgumentNullException("error message here"); 

     // add overloaded constructors to MultiResponse class. 
     MoreThanOne = new MultiResponse (theList); 
     // OnlyOne = null; 
    } 

    public ClientApi (DeserializedResult onlyOne) 
     if (onlyOne == null) throw ArgumentNullException("error message here"); 

     MoreThanOne = new MultiResponse(onlyOne); 
     // OnlyOne = onlyOne; 
    } 

    ///<summary> 
    /// Always returns an object. The list may be empty, 
    /// but never null 
    ///</summary> 
    public MultiResponse GetDeHydratedJsonThingy() { 
     MultiResponse HereYaGo = new MultiResponse(); 
     // if (MoreThanOne !=null) HereYaGo.AddRange(MoreThanOne); 
     // if (OnlyOne != null) HereYaGo.Add(OnlyOne); 

     HereYaGo.AddRange(MoreThanOne.Result); 
     return HereYaGo; 
    } 
} 

末编辑

+0

我需要区分反序列化。如果我试图反序列化一个列表与单个对象,我会得到错误。这是我能想到的最简单,最低限度的方式。 – gilliduck

+1

好的,你需要,但为什么要客户端代码?做你必须做的事,但是要变换它,让客户只处理一件事。不要将您的实施问题暴露给客户。给他们一个干净,一致的API来处理。 – radarbob

+1

“......这是最简单的,最少的开销方式......”1类比2更简单。一种返回类型比2更简单。考虑客户端被迫做的事情。我看到至少有一些特殊处理代码的潜力。你正在使API更复杂,这是重要的。 – radarbob

0

你可以尝试用一个通用的抽象基类

public abstract class Response<T> { 
    public T Result { get; set; } 
} 

具体实施将从共同基准响应继承以下。

public class Response : Response<object> { 
    public object Result { get; set; } 
} 

public class MultiResponse : Response<List<DeserializedResult>> { 
    public List<DeserializedResult> Result { get; set; } 
} 

public class SingleResponse : Response<DeserializedResult> { 
    public DeserializedResult Result { get; set; } 
}