基于多响应创建一个设计。它消除了以某种方式存在特殊情况的设计“暗示”。结果代码将更加一致和强大。
重点应该是对对象本身 - 你再水化后,用它做什么。不是在我有一个对象或多个对象的微小偶然事件中。这种区别与“4个物体或4个物体”没有区别。
将容器抽象为单个类必然会使对象成为焦点和设计重点。
编辑
认为它这样。单个或多个反序列化的对象是有多少对象需要反序列化的结果。这是一个与(反序列化)对象实际使用密切相关的实现细节。 包封物实施细则,就是从客户端代码隐藏它们。为客户提供以“业务领域”术语表达功能的类和方法。
末编辑
编辑
...我不得不使用动态回报在调用的类来处理两种可能的响应。我认为抽象类(或接口?)是一个更好的方法来做到这一点,但我不知道如何实现它。
要点:
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;
}
}
末编辑
我需要区分反序列化。如果我试图反序列化一个列表与单个对象,我会得到错误。这是我能想到的最简单,最低限度的方式。 – gilliduck
好的,你需要,但为什么要客户端代码?做你必须做的事,但是要变换它,让客户只处理一件事。不要将您的实施问题暴露给客户。给他们一个干净,一致的API来处理。 – radarbob
“......这是最简单的,最少的开销方式......”1类比2更简单。一种返回类型比2更简单。考虑客户端被迫做的事情。我看到至少有一些特殊处理代码的潜力。你正在使API更复杂,这是重要的。 – radarbob