2013-08-31 1 views
0

У меня проблема, когда у меня есть основной класс, который решает численную проблему. Для простоты предположим, что он решает 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?.

+0

Кажется, что вам нужен шаблон дизайна Strategy (http://sourcemaking.com/design_patterns/strategy). – LordDoskias

+0

Может быть проще просто дать классу структуру ModelSettings с необходимой информацией? – Tharwen

+0

Итак, у вас есть дерево методов решения проблем. Дерево имеет тысячи ветвей с глубиной 3? Вероятно, вам придется генерировать дерево. Похоже, что вложенные классы будут намного легче читать, чем другим способом, о котором вы упоминали ... – Dru

ответ

0

Сначала вы должны создать класс Solver и использовать шаблон стратегии для создания подклассов, которые представляют различные методы для решения проблемы.

Варианты и суппозиции - это труднее сделать правильно. Если бы я получил вас правильно, то CG_Precond и CG_NoPrecond должны быть подклассами CG (который также является подклассом Solver), поскольку они, похоже, разделяют некоторую внутреннюю логику.

Если параметры подобны предопределенным значениям для разных методов, в которых каждый метод требует других значений и типов значений, становится сложнее. Там я хотел бы, чтобы вы представили несколько примеров опций, субоптимов и т. Д.