[英]Class design: public constructor or private with static factory and a COM object
我有一个类设计问题。 我将概述我正在考虑的三种模式。
范例1:
Class MyObject
{
public MyObject(IWrapper wrapper,string name)
{//set properties.}
public Void Declare()
{
//Some COM stuff with IWrapper
}
}
用途 :
MyObject testobj = new MyObject(fakewrapper,"test");
testobj.Declare();
范例2:
Class MyObject
{
public MyObject(IWrapper wrapper,string name)
{ //set properties.}
public MyObject Declare()
{
//Some COM stuff with IWrapper
return this;
}
}
用途 :
MyObject testobj = new MyObject(fakewrapper,"Test");
testobj = testobj.Declare();
示例3:使用私有构造函数
Class MyObject
{
private MyObject(IWrapper wrapper,string name)
{//set properties.}
public static MyObject Declare(IWrapper wrapper,string name)
{
//Some COM stuff with IWrapper
return new MyObject(wrapper,name);
}
}
用途 :
MyObject testobj = MyObject.Declare(fakewrapper,"Test");
我的主要问题是; 您认为哪个设计更好?
隐藏构造函数以使用静态工厂方法是不好的做法吗?
我也正在尝试使其尽可能可测试。 我似乎无法下定决心的唯一原因是,因为MyObject类是COM应用程序中另一个对象的包装。
问题在于必须在COM应用程序中声明此对象,这是在调用其他任何方法之前, declare方法正在做的事情,但是如果我隐藏构造函数,然后向Declare方法添加更多工作,我认为它将使其他班级很难测试,因为我必须先通过Declare方法。
干杯。
对于我来说,选项3似乎是您课程中最干净的API。 如果在调用Declare之前不能真正使用MyObject,对我来说,将new和Declare包装到工厂方法中是很有意义的,以确保您的类的用户不要在未先调用Declare的情况下尝试使用MyObject。 工厂方法还可以帮助您进行日常维护。
一种有助于测试的方法可能是将Declare操作包装在该类的可插入“ IDeclarer”接口中。 您的生产应用程序将使用IDeclarer的实现来调用COM应用程序,而测试代码可以插入模拟IDeclarer。 也许是这样的(您可能需要对此进行调整...):
class MyObject
{
public IDeclarer Declarer { get; set; }
private MyObject(IWrapper wrapper,string name)
{
// set properties
}
public static MyObject Declare(IWrapper wrapper,string name)
{
//Some COM stuff with IWrapper
MyObject newMyObject = new MyObject(wrapper,name);
return Declarer.Declare(newMyObject);
}
}
public interface IDeclarer
{
MyObject Declare(MyObject obj);
}
public class ComDeclarer : IDeclarer
{
public MyObject Declare(MyObject obj)
{
// do COM work
return comObj;
}
}
public class TestDeclarer : IDeclarer
{
public MyObject Declare(MyObject obj)
{
// do nothing... or whatever
return testObj;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.