Имеет ли пустой базовый класс плохой дизайн? - PullRequest
7 голосов
/ 11 марта 2010

Мне нужен базовый класс для моих классов DTO, который будет использоваться в моих универсальных интерфейсах.

Но классы DTO не имеют ничего общего.Это просто тупые классы, содержащие некоторые свойства.

public void GetGridData()
{

   IDataForGrid<DTOBase> aa;

   if(request == 1) aa = new CustomerGridData;
   if(request == 2) aa = new OrderGridData;

   var coll = aa.GetList();
}

public class CustomerGridData : IDataForGrid<CustomerDTO>
{
  ...
}

Ответы [ 4 ]

6 голосов
/ 11 марта 2010

Это неплохой дизайн, хотя и несколько необычный. Подумайте об этом так: есть как минимум два преимущества, а недостатков нет:

  • Базовый класс служит фильтром для ваших интерфейсов, так что вы не можете передать им ни один объект - только ваши объекты DTO. Маркерные интерфейсы тоже к этому могли бы.
  • Когда они, в конце концов, получат что-то общее, это будет легко добавить туда, и вам не придется все реорганизовывать.
6 голосов
/ 11 марта 2010

Если у них есть ничего общего, что вы собираетесь делать с экземплярами, которые вы извлекаете из своего списка?

В любом случае наличие базового класса означает, что когда (хорошо, , если ) вы идентифицируете что-то, что они делают должны в дальнейшем иметь общее вернитесь и сделайте все заново. Но я бы в любом случае подумал о том, чтобы использовать интерфейс, а не базовый класс для такого рода вещей, так как не похоже, что существует острая необходимость в повторном использовании базовой реализации (так как у них пока нет ничего общего!). Это будет зависеть от того, что, по вашему мнению, у них может быть общего позже.

3 голосов
/ 11 марта 2010

В руководствах по кодированию .NET говорится, что наличие пустого базового класса или интерфейса (также называемого «теговым» интерфейсом) действительно плохой стиль. Предпочтительным стилем является использование атрибута для аннотирования классов одного типа. Существует также правило FxCop для обеспечения соблюдения этого соглашения.

Однако я иногда (в редких случаях) использую эту идиому, когда общий базовый класс полезен для обозначения общей иерархии, даже если не существует общей функциональности. Атрибуты не могут быть использованы для этого.

Например, в интерпретаторе языка программирования несколько методов возвращают специальный базовый класс Value, то есть нечто, имеющее значение внутри этого языка программирования. По сути, это значение может быть всем от числа до строки (которые являются специальными классами, а не System.Int32 или System.String) до составного объекта. Я мог бы также вернуть System.Object, но это сделало бы более слабой типизацию моего открытого интерфейса.

Хороший, самодокументированный код получает выгоду от ограниченного интерфейса.

1 голос
/ 11 марта 2010

В Java это называется Tag Interface . Ссылка дает хорошую информацию об интерфейсах тегов, их использовании и проблемах.

...