У меня проблема, когда у меня есть основной класс, который решает численную проблему. Для простоты предположим, что он решает Ax=b
. Теперь я хочу, чтобы пользователь мог выбрать способ его решения. Есть тысячи опций, и каждый вариант имеет тысячи вариантов.Вложенный класс - хороший дизайн?
Моя идея состояла в том, чтобы создать его следующим образом: создать основной класс, а затем создать подклассы для каждого метода и subsubclasses для деталей каждого метода (который может взаимодействовать через наследование).
Например, я предусмотреть возможность пользователю сделать что-то как- Model.method='CG'
Model.preconditioning=off
, а затем Model.Solve
и в Model
классе, есть CG
подкласс, который работает. В пределах CG
существуют способы CG_Precond
и CG_NoPrecond
, которые выполняются в зависимости от того, включено или выключено предварительное кондиционирование. (Предположим, что методы сильно отличаются). Таким образом, по сути, пользователь работает Model.CG.CG_NoPrecond
.
Это хороший дизайн? Следует ли избегать вложенных классов?
Важным примечанием является то, что кроме класса Model
все подклассы содержат только методы и не имеют собственных данных (кроме тех, которые возвращаются).
Я потратил некоторое время на чтение некоторых действительно красивых ответов на SO, и моя проблема (я считаю) согласуется с требованиями принятого ответа Why/when should you use nested classes in .net? Or shouldn't you?.
Кажется, что вам нужен шаблон дизайна Strategy (http://sourcemaking.com/design_patterns/strategy). – LordDoskias
Может быть проще просто дать классу структуру ModelSettings с необходимой информацией? – Tharwen
Итак, у вас есть дерево методов решения проблем. Дерево имеет тысячи ветвей с глубиной 3? Вероятно, вам придется генерировать дерево. Похоже, что вложенные классы будут намного легче читать, чем другим способом, о котором вы упоминали ... – Dru