В настоящее время я работаю над классом, который представляет одну вещь. Это одно может иметь несколько представлений. Представление для любого данного экземпляра этой вещи фиксируется при построении. В зависимости от того, какое представление используется, зависит от того, какие данные хранятся.Сколько конструкторов слишком много?
For (рассеянный) Например:
enum
, где каждое значение является типом представления, например;Alpha
,Beta
,Charlie
.- Все три изображения имеют поле
Id
иName
. Beta
также имеет полеAttributes
.Charlie
также имеет полеChildId
.- Все три представления совместно используют ряд методов, например.
IsValidFor(...)
,TriggeredBy(...)
. - Все три представления хранятся в одной и той же таблице базы данных.
Это привело меня иметь один класс с тремя специализированными конструкторами, например:
public enum RepresentationType { Alpha, Beta, Charlie }
public class Representation
{
...
public Representation(Guid id, String name) { Type = RepresentationType.Alpha, ... }
public Representation(Guid id, String name, String attributes) { Type = RepresentationType.Beta, ... }
public Representation(Guid id, String name, Guid childId) { Type = RepresentationType.Charlie, ... }
}
Я могу понять, почему я оказался здесь, и в каком-то смысле этот подход имеет смысл; класс представляет собой единый тип вещей, и он имеет много общих функций.
Однако его также проблематично по ряду других причин:
- Каждое представление заканчивается своим собственным специальным конструктором, который обычно включает в себя повторение кода. Я попытался улучшить это, объединив конструкторы, но потом у меня заканчиваются длинные цепочки функций.
- Для данного объекта не гарантируется, что все свойства будут установлены, что вызывает проблемы позже, когда я снова работаю с данными.
Я рассматриваю возможность реорганизации всего этого в набор подклассов, например. RepresentationAlpha
, RepresentationBeta
, RepresentationCharlie
. Это означает, что мне нужно будет написать еще какой-нибудь код, но ничего слишком обременительного. Я вижу проблемы дальше по линии, однако, когда мне нужно работать с представлением из коллекции, и я не знаю, какое представление я на самом деле смотрю.
Это разумный курс действий? Я просто торгую одной проблемой для другой? Есть ли образец дизайна, на который я должен смотреть? Сколько конструкторов слишком много?
редактирует на основе комментариев:
- Если я суб-класс, я бы, вероятно, также использовать наследование.
- У меня есть фабричный шаблон для создания каждого отдельного представления, это хранилище каждого интересующего вас представления.
- Менее важно, если я занимаюсь подклассом, я, вероятно, также сохраню его как важный для данные, с которыми я работаю.
Трудно сказать только из этого, но рассмотрели ли вы наследование, а не использовали перечисления, чтобы отличать ваши объекты? –
С первого взгляда, мне интересно, может ли это быть хорошим вариантом для шаблона Factory? – Tim
Я с Нафаном. Похоже, вам нужен базовый класс и подклассы, а не один класс и свойство типа, которое определяет, какие поля подходят. –