Наследование или фабрика ?
От: _NN_ www.nemerleweb.com
Дата: 18.02.17 19:57
Оценка:
В силу отсутствия глобальных псевдонимов типов в C# задался вопросом как лучше сделать.

class SomeGeneric<TA, TB>
{
 public SomeGeneric(TA a, TB b) { .. }
}


1.
class SomeSpecific
{
  public static SomeGeneric<X, Y> Create() { return new SomeGeneric<X,Y>(new X(), new Y()); }
}


2.
class SomeSpecific : SomeGeneric<X, Y>
{
  public SomeSpecific() : base(new X(), new Y()) {}
}


У второго варианта удобнее использование, ведь X,Y будут скрыты от глаз, зато первый вариант не создает ненужного наследования.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 18.02.2017 19:58 _NN_ . Предыдущая версия .
Re: Наследование или фабрика ?
От: NetDeveloper  
Дата: 18.02.17 22:36
Оценка: +4
Второй вариант проще поддерживать в коде.
Re[2]: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 20.02.17 07:30
Оценка:
Здравствуйте, NetDeveloper, Вы писали:

ND>Второй вариант проще поддерживать в коде.

Первый вариант в обще странный какой-то. Опять же с точки зрения многопоточности будет lock на статическом методе. В отличии от второго подхода.
Re[3]: Наследование или фабрика ?
От: Sinix  
Дата: 20.02.17 07:42
Оценка: +1
Здравствуйте, Gattaka, Вы писали:

G>Опять же с точки зрения многопоточности будет lock на статическом методе. В отличии от второго подхода.

Или я ошибаюсь, или ты ошибаешься

Нету там lock, но это меньшая из проблем
Re: Наследование или фабрика ?
От: Sinix  
Дата: 20.02.17 07:46
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>В силу отсутствия глобальных псевдонимов типов в C# задался вопросом как лучше сделать.


А у TA и TB есть ограничения по базовым типам?

Если да и TA и TB — не структуры, то я бы сделал не-generic SomeBase, который принимал бы базовые типы, в наследниках добавлял бы свойство, которое явно кастило бы к нужному типу, генерик-параметры вообще бы не использовал.

Довольно кривое решение, но оно работает в случае, когда надо отнаследоваться от SomeSpecific и подсунуть наследника от X или Y.
Re[4]: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 20.02.17 07:48
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, Gattaka, Вы писали:


G>>Опять же с точки зрения многопоточности будет lock на статическом методе. В отличии от второго подхода.

S>Или я ошибаюсь, или ты ошибаешься
S>Нету там lock, но это меньшая из проблем
Ну и как синхронизация происходит при обращении к статическому методу из разных потоков?
Re[5]: Наследование или фабрика ?
От: Sinix  
Дата: 20.02.17 07:51
Оценка: +3
Здравствуйте, Gattaka, Вы писали:

G>Ну и как синхронизация происходит при обращении к статическому методу из разных потоков?


А зачем там синхронизация, если нет разделяемого состояния?
Re[6]: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 20.02.17 07:53
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А зачем там синхронизация, если нет разделяемого состояния?


А откуда вы знаете что нет? И тем более компилятор откуда знает?
Re[2]: Наследование или фабрика ?
От: _NN_ www.nemerleweb.com
Дата: 20.02.17 07:58
Оценка: 24 (1)
Здравствуйте, Sinix, Вы писали:

S>Здравствуйте, _NN_, Вы писали:


_NN>>В силу отсутствия глобальных псевдонимов типов в C# задался вопросом как лучше сделать.


S>А у TA и TB есть ограничения по базовым типам?

Ограничений нет.

S>Довольно кривое решение, но оно работает в случае, когда надо отнаследоваться от SomeSpecific и подсунуть наследника от X или Y.

От SomeSpecific наследоваться не потребуется.

Нужно что-то вроде:
public type SomeSpecific = SomeGeneric<X, Y>;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: Наследование или фабрика ?
От: Sinix  
Дата: 20.02.17 08:12
Оценка: +4
Здравствуйте, Gattaka, Вы писали:

S>>А зачем там синхронизация, если нет разделяемого состояния?

G>А откуда вы знаете что нет? И тем более компилятор откуда знает?
Как насчёт варианта "потому что блокировки нет в коде"?

Рантайм использует блокировки для static-конструкторов, это да. Для всего остального — только по пожеланиям трудящихся.
Re[3]: Наследование или фабрика ?
От: Sinix  
Дата: 20.02.17 08:14
Оценка: +1
Здравствуйте, _NN_, Вы писали:

S>>А у TA и TB есть ограничения по базовым типам?

_NN>Ограничений нет. От SomeSpecific наследоваться не потребуется.

Тогда я тоже за второй вариант, он удобней в использовании будет.
Re: Наследование или фабрика ?
От: Sharov Россия  
Дата: 20.02.17 11:02
Оценка:
Здравствуйте, _NN_, Вы писали:

Второй вариант посимпотищнее и гибче.
Кодом людям нужно помогать!
Re: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 21.02.17 14:58
Оценка:
А чем не угодил вариант:

b = new SomeGeneric<X, Y>(new X(), new B());
Re[2]: Наследование или фабрика ?
От: _NN_ www.nemerleweb.com
Дата: 21.02.17 17:36
Оценка:
Здравствуйте, Gattaka, Вы писали:

G>А чем не угодил вариант:


G>
G>b = new SomeGeneric<X, Y>(new X(), new B());
G>


Тем, что нужно каждый раз это писать как бы.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 21.02.17 17:46
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Здравствуйте, Gattaka, Вы писали:


G>>А чем не угодил вариант:


G>>
G>>b = new SomeGeneric<X, Y>(new X(), new B());
G>>


_NN>Тем, что нужно каждый раз это писать как бы.


Да, но код становится проще для понимания. Не вводится никаких дополнительных сущностей. Ты сразу видишь что происходит. Тебе не нужно лезть в Create или какой-то мутный пустой класс или что хуже синоним, как предложили выше.
Опять же почему был введен дженерик если приходится вводить тип обрезающий дженерик до обычного не дженерик класса? Это оправдано?

И еще.
Чем не угодил вариант:
b = ServiceLocator.Resolve<SomeGeneric<X, Y>>();
Re: Наследование или фабрика ?
От: SergeyT. США http://sergeyteplyakov.blogspot.com/
Дата: 21.02.17 18:12
Оценка: 5 (1) +2
Здравствуйте, _NN_, Вы писали:

_NN>В силу отсутствия глобальных псевдонимов типов в C# задался вопросом как лучше сделать.


А я за третий вариант:

class SomeSpecific
{
  public static SomeSpecific<X, Y> Create(X x, Y y) {return new SomeSpecific(x, y); }
  public static SomeSpecific<X, Y> Create() {return Create(new X(), new Y()); }
}

class SomeSpecific<X, Y> {...}


Этот вариант особенно ок, если есть вполне реальные шансы, что нужно будет создавать объекты с не дефолтными параметрами. В этом случае мы толком и не создаем дополнительных абстракций, а просто используем вполне распространенный трюк для обхода ограничения C#, который не умеет выводить обобщенные параметры при вызове конструктора.
Re[4]: Наследование или фабрика ?
От: _NN_ www.nemerleweb.com
Дата: 21.02.17 20:28
Оценка:
Здравствуйте, Gattaka, Вы писали:


G>Да, но код становится проще для понимания. Не вводится никаких дополнительных сущностей. Ты сразу видишь что происходит. Тебе не нужно лезть в Create или какой-то мутный пустой класс или что хуже синоним, как предложили выше.

Но тогда использование не очень..

G>Опять же почему был введен дженерик если приходится вводить тип обрезающий дженерик до обычного не дженерик класса? Это оправдано?

Оправданно.
Там общий интерфейс плана
interface IConvertible<X,Y> { }


Могу предложить аналогию с Dictionary<TKey, TValue>.
Часто я пишу код
using SpecificDictionary = Dictionary<string, string>;

Но это работает в пределах файла и вытащить наружу никак.
Я уже
Автор: _NN_
Дата: 20.02.17
указывал к чему я стремлюсь.

P.S.
В некоторых языках так можно, а в C# вот приходится поднимать обсуждение вместо прямого решения проблемы.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 22.02.17 03:09
Оценка:
Здравствуйте, _NN_, Вы писали:

Чем не угодил вариант:

b = ServiceLocator.Resolve<SomeGeneric<X, Y>>();
Re[2]: Наследование или фабрика ?
От: Gattaka Россия  
Дата: 22.02.17 12:09
Оценка: -1
Здравствуйте, SergeyT., Вы писали:

ST>Здравствуйте, _NN_, Вы писали:


_NN>>В силу отсутствия глобальных псевдонимов типов в C# задался вопросом как лучше сделать.


ST>А я за третий вариант:


ST>
ST>class SomeSpecific
ST>{
ST>  public static SomeSpecific<X, Y> Create(X x, Y y) {return new SomeSpecific(x, y); }
ST>  public static SomeSpecific<X, Y> Create() {return Create(new X(), new Y()); }
ST>}

ST>class SomeSpecific<X, Y> {...}
ST>


ST>Этот вариант особенно ок, если есть вполне реальные шансы, что нужно будет создавать объекты с не дефолтными параметрами. В этом случае мы толком и не создаем дополнительных абстракций, а просто используем вполне распространенный трюк для обхода ограничения C#, который не умеет выводить обобщенные параметры при вызове конструктора.


Зачем это городить если уже есть готовое решение в виде IoC контейнеров разнообразных. Опять же как тестировать ваш код со статическими методами?
Re[3]: Наследование или фабрика ?
От: _NN_ www.nemerleweb.com
Дата: 22.02.17 13:54
Оценка:
Здравствуйте, Gattaka, Вы писали:

G>Зачем это городить если уже есть готовое решение в виде IoC контейнеров разнообразных. Опять же как тестировать ваш код со статическими методами?

А зачем это тут ?
Чем плохи статические методы ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.