gpt4 book ai didi

c# - 类设计: public constructor or private with static factory and a COM object

转载 作者:太空宇宙 更新时间:2023-11-03 14:36:35 24 4
gpt4 key购买 nike

我遇到了一些类设计问题。我将概述我正在考虑的三种模式。

示例 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:使用私有(private)构造函数

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 对我来说似乎是你们类(class)最简洁的 API。如果在调用 Declare 之前您不能真正使用 MyObject,对我来说,将 new 和 Declare 包装到工厂方法中是有意义的,以确保您的类的用户不会在不先调用 Declare 的情况下尝试使用 MyObject。工厂方法还可以帮助进行后续维护。

一种有助于提高可测试性的方法可能是将 Declare 操作包装在类中的可插入“IDeclarer”接口(interface)中。您的生产应用程序将使用调用 COM 应用程序的 IDeclarer 实现,而您的测试代码可以插入模拟 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;
}
}

关于c# - 类设计: public constructor or private with static factory and a COM object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/766317/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com