繁体   English   中英

类设计:具有静态工厂和COM对象的公共构造函数或私有构造函数

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM