Если мы хотим реорганизовать перечисление (содержащееся в слое домена) в полиморфный класс, использование «простых» абстрактных методов может быть плохой идеей, если все переключатели и операторы, которые мы хотим реорганизовать, находятся внутри других слоев (например, бизнес или уровень представления), потому что мы могли бы в конечном итоге ссылаться на эти уровни внутри уровня домена:
public abstract class MyRefactoredEnum
{
public abstract void DoSomething(IBusinnessObject aBizObject); //dependency to the biz. layer
public abstract MvcHtmlString GetImgTag(); //dependency to presentation layer
}
(в приведенном выше примере у нас тоже может быть проблема "перекрестной ссылки")
Я обнаружил, что шаблон посетителей (http://en.wikipedia.org/wiki/Visitor_pattern) является правильным решением этой проблемы: на уровне домена мы определяем только интерфейс MyRefactoredEnum.IVisitor, а все остальные слои могут реализовывать своих посетителей. .
Единственная проблема: когда мы изменяем интерфейс MyRefactoredEnum.IVisitor (например, потому что мы добавили другой подкласс MyRefactoredEnum), мы должны модифицировать и перекомпилировать все проекты и решения, которые ссылаются на модель домена. Мы можем решить проблему, используя отражение (http://surguy.net/articles/visitor-with-reflection.xml), но оно может быть медленным ...
Есть ли лучший шаблон для рефакторинга перечисления?
PS: простите за мой ужасный английский:)