Запрос на креативный дизайн / шаблон предложения - PullRequest
1 голос
/ 02 ноября 2009

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

public class RelatedA : IRelatedType
{
    public string Name { get; set; }
    public string Value { get; set; }
    public DateTime Stamp { get; set; }
}

public class RelatedB : IRelatedType
{
    public string Name { get; set; }
    public string Value { get; set; }
    public DateTime Stamp { get; set; }
}

public class RelatedC : IRelatedType
{
    public string Name { get; set; }
    public string Value { get; set; }
    public DateTime Stamp { get; set; }
    public int Special { get; set; }
}

Есть пара других классов, которые концептуально связаны с вышеупомянутыми 3, но могут быть немного другими в реализации:

public class RelatedD : IRelatedType
{
    public string Name { get; set; }
    public string Statement { get; set; }
}

public class RelatedE : IRelatedType
{
    public string Name { get; set; }
    public string Statement { get; set; }
    public bool IsNew { get; set; }
}

Их экземпляры могут быть созданы фабрикой на основе какого-либо перечисляемого значения типа. Проблема в том, что позже, когда эти объекты используются (например, на бизнес-уровне), может быть много кода, подобного этому:

IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue);

if (theObject is RelatedC)
{
    RelatedC cObject = theObject as RelatedC;
    specialVal = cObject.Special;
}
else if (theObject is RelatedD)
{
    RelatedD dObject = theObject as RelatedD;
    statementVal = dObject.Statement;
}
else if (theObject is RelatedE)
{
    RelatedE eObject = theObject as RelatedE;
    statementVal = eObject.Statement;
    isNewVal = eObject.IsNew;
}

Это можно повторить во многих местах. Есть ли лучший подход к дизайну, который я должен использовать (должен быть)?

1 Ответ

1 голос
/ 02 ноября 2009

Вы можете попытаться разнести различия в отдельные классы, которые затем предоставляются, например:

IRelatedType theObject = TheFactory.CreateObject(SomeEnum.SomeValue);
RelatedTypeHelper theHelper=TheFactory.CreateHelper(theObject);
theHelper.DoSpecialThing(theObject);

Теперь вам не нужно будет иметь все блоки if else, и если вы добавите новый тип, который требует новой обработки, вы просто подбираете нового помощника, реализующего требуемые фрагменты, и вы должны хорошо идти. Помощник должен помочь документировать этот процесс.

Я также хотел бы спросить, почему один метод имеет такую ​​отличную реализацию для specialVal, и StatementVal может быть вашим примером, но мне интересно, что вы на самом деле здесь делаете. Можете ли вы упростить вещи обратно, сделав шаг назад и поставив под сомнение смысл их включения в эту конкретную иерархию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...