Mic*_*ael 8 c# parameter-object
我正在尝试构建一个框架,允许人们通过实现接口来扩展我们的核心功能.下面是这个界面的一个愚蠢的例子.
public interface MyInterface
{
IData GetData(string p1, char p2, double p3);
}
Run Code Online (Sandbox Code Playgroud)
最近,我们决定修改这个界面(我知道我不应该破坏依赖代码,但事实是我们还没有任何第三方实现这个界面,所以我们有机会进行"重做"正确实现此接口).
我们需要在此界面中再添加2个参数,以使我们的软件正常工作.我们想到的两种方法就是将它们添加到签名中,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, bool p4, DateTime p5);
}
Run Code Online (Sandbox Code Playgroud)
或者通过创建这样的参数对象
public class MyParameters
{
public bool p4 { get; set; }
public DateTime p5 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并将它们添加到方法的末尾,如下所示:
public interface MyInterface
{
IData GetData(string p1, char p2, double p3, MyParameters p4);
}
Run Code Online (Sandbox Code Playgroud)
我正在寻找某种指导,以哪种方式是"最"正确的方法.我可以在两个类别中看到利弊,但我不希望我的偏见让我走错了路.
我的一些主要担忧是:
我甚至不知道在线询问什么问题来获得这个问题的指导.我有一种感觉,答案是"它取决于"(关于如何将相关的p1-p5与GetData()函数的目的相关联),但有人可以指出我应该要求的一系列问题来帮助我评估一种解决方案是否优于另一种?
让我尝试回答一下这个问题。让我们评估一下您的选择:
1)如果出现如下界面
public interface MyInterface
{
IData GetData(string p1, char p2, double p3);
}
Run Code Online (Sandbox Code Playgroud)
被打破:
a) 并且根本不应该使用,那么您应该强制实现者重写它。因此更改方法定义。
public interface MyInterface
{
IData GetData(something else);
}
Run Code Online (Sandbox Code Playgroud)
b) 但您只需要鼓励用户使用新定义,然后您可以创建一个新的重载,告诉他们第一个定义已过时。
public interface MyInterface
{
//xml to tell them this is deprecated.
IData GetData(string p1, char p2, double p3);
IData GetData(string p1, char p2, double p3, and whatever);
}
Run Code Online (Sandbox Code Playgroud)
关于你的新定义,任何人在不了解模型的情况下都无法给出一站式解决方案,但你问自己,
I)“如果组合起来,参数本身可以代表一个实体吗?在现实世界中,拥有一个参数单位是否意味着什么? ”如果是这样,就这样吧。如果没有,就不要。我认为当你陷入这种困境时,你应该依靠这种抽象层面的思考。bool p4我不知道泡吧还有什么意义DateTime p5。您应该将那些本身代表现实生活中某些事物的参数组合在一起。如果这些组合没有意义,那就保持原样。如果你把这样的聚会留给这样的逻辑思维方式,你会取得更大的成功。请注意,您将把定义留给其他程序员,为了减轻他们的工作,您的方法签名应该非常非常合乎逻辑。
II)类可以做更多的事情而不是仅仅保存一组数据吗?此处应选择“类别”。
III)我是否只需要控制类定义而不是它的实现?在这种情况下,只需定义输入的公共接口,并将实现留给客户即可。
IV)未来对我的接口的修改是否应该不会破坏现有的实现?超载是你的出路。
假设你有两个选择,将签名压平,或者将其签名。
1) 没有杵状指:
a) 更少的代码,减少另一层。
b) 无需向公众公开另一个类。
2) 泡吧:
a) 更好地理解模型以进入函数 - 你的意图很明确。
b) 如果您需要添加可选细节来构建新形成的类,则将来可以轻松扩展。假设你有课
class Input {
string p1; char p2; double p3;
public Input(string p1, char p2, double p3){
}
}
Run Code Online (Sandbox Code Playgroud)
和接口
public interface MyInterface
{
IData GetData(Input p1);
}
Run Code Online (Sandbox Code Playgroud)
现在您可能想要添加可选的详细信息,例如布尔值和日期时间。由于它们是可选的,因此您不必在构造函数中强制它。您仍然可以拥有相同的构造函数,并授予用户在构造函数外部需要时进行修改的权限。
class Input {
string p1; char p2; double p3; bool p4; DateTime p5;
public Input(string p1, char p2, double p3){
}
}
Run Code Online (Sandbox Code Playgroud)
界面还是可以的。正如我所说,导出此类任何内容的动力不幸地取决于您的模型。简而言之,如果分组有意义,请将其设为类或接口(取决于谁将控制逻辑)。
| 归档时间: |
|
| 查看次数: |
235 次 |
| 最近记录: |