2015-03-03 2 views
1

Я сказал коллеге, что следующий - плохой дизайн, но в конце концов я не мог по-настоящему объяснить причину (кроме того, в этом случае уже был один сингл-класс, который использовался как «коллекция» для всех эти). Но в общем случае есть что-то не так со следующим (только «статический метод, возвращающий экземпляр класса», - а не каким способом обрабатывается interop.) Это просто пример статического метода, а не реального кода.имеет статический метод, возвращающий экземпляр класса (например, id) плохой конструкции неэлементного класса?

public class MyClass 
{ 
    public int Id { get; private set; } 
    /... other properties, constructors & methods 

    // this is only static method 
    public static GetMyClass(int id) 
    { 
     // get it in this case from unmanaged code 
     return new MyClass(InteropThing.GetMyClassStruct(id)); 
    } 
} 
+0

Что такое 'InteropThing' в этом случае? – RagtimeWilly

+3

Я не вижу в этом ничего плохого. Что вы предложите в качестве альтернативы? – JLRishe

+0

в этом случае был лучший способ сделать это (MyThingsStore, что я использовал индексы и счетчики). но в общем случае я не могу предложить ничего лучше этого. –

ответ

3

Из примера кода он выглядит как вы прячетесь зависимость с помощью вызова статического класса, который будет делает вещи неудобно издеваться и модульного тестирования.

Возможно, лучше было бы:

public class MyClass 
{ 
    private readonly IInteropThing _interop; 

    public int Id { get; set; } 

    public MyClass (IInteropThing interop) 
    { 
     _interop = interop; 
    } 

    public GetMyClass(int id) 
    { 
     return new MyClass(_interop.GetMyClassStruct(id)); 
    } 
} 

Это также выглядит, как вы могли бы нарушить единый принцип ответственности в зависимости от того, что еще делает MyClass.

Возможно, отдельный класс, который является единственной функцией, заключается в создании объектов MyClass, будет лучшим подходом к продвижению свободной связи и тестируемости.

+0

Спасибо за ваш ответ! Тестирование - интересный момент, о котором я не думал. Это взаимодействие в другой теме, но спасибо за это. Я написал в своем посте «ничего плохого в следующем», но теперь я исправил его, чтобы он соответствовал названию вопроса, что является для меня настоящей проблемой. –

+0

Приведение принципа единой ответственности и упоминание отдельного класса для их создания - это то, чем я был больше после. Вот как это делается на самом деле. –

Смежные вопросы