2009-04-19 2 views
2

У меня проблема с классом. Я расскажу о трех моделях, которые я рассматриваю.Конструкция класса: открытый конструктор или закрытый со статическим заводом и COM-объектом

Пример 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.

Cheers.

ответ

1

Вариант 3 кажется мне самым чистым API для вашего класса. Если вы не можете использовать MyObject до появления объявления Declare, для меня было бы целесообразно обернуть новый и Declare в фабричный метод, чтобы пользователи вашего класса не пытались использовать MyObject без первого вызова Declare. Фабричные методы также могут помочь в обслуживании по дороге.

Одним из способов помощи при тестировании может быть обертка операции 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; 
    } 
}