Как лучше всего моделировать вопросы, состоящие из нескольких частей? - PullRequest
1 голос
/ 12 июля 2011

Я пытаюсь создать подкласс, который будет содержать ответы на многокомпонентные вопросы и некоторую логику, чтобы оценить / действовать на них.Например, FoodSurvey будет подклассом BaseSurvey

BaseSurvey
  Name
  Date
  Submit()

FoodSurvey <- BaseSurvey
  DoYouLikeIcecream
  IfSoWhatFlavour
  WouldYouLikeAFreeSample
  SendSample(flavour)
  ...

FoodSurvey может иметь несколько десятков или более вопросов, и мне нужно будет проверить каждый ответ на основе других, а также запустить некоторые другие процессы, специфичные для FoodSurvey.(в отличие от CarSurvey), который может зависеть от нескольких ответов (например: SendSample (rockyRoad)).

Я поиграл с идеей класса Вопросов с коллекцией Вопросов в каждом опросе, но это быстро стало выглядеть как «движок» опроса, который выглядел так: 1.) было излишним, 2.) было ошибкойсклонны и 3.) ограничили логику, которую я мог бы использовать для проверки ответов.

Существуют ли какие-либо общепринятые передовые методы в отношении разработки этого типа класса?

Если это имеет значение, классы в конечном итоге будут использоватьсяв веб-сайте ASP.NET или веб-приложении.

Ответы [ 2 ]

1 голос
/ 12 июля 2011

Мне нравится ваш подход к проведению урока «Вопрос». Более подробно, эта модель может использовать шаблон типа / объекта - что-то вроде отношения между типом и объектом. Код может выглядеть так:

class Question
{
    public string Text { get; set; }
}

class QuestionAnswer
{
    public Question Question { get; set; }
    public string Answer { get; set; }
}

interface ISurveyValidator
{
    bool Validate(SurveyType type, IEnumerable<QuestionAnswer> answers);
}

class SurveyType
{
    public string Name { get; set; }

    public IList<Question> Questions { get; set; }

    public ISurveyValidator Validator { get; set; }

    public Survey CreateSurvey(IEnumerable<QuestionAnswer> answers)
    {
        if (!this.Validator.Validate(this, answers))
            throw new Exception();
        return new Survey
        {
            Type = this,
            Date = DateTime.Now,
            Answers = answers.ToList()
        };
    }
}

class Survey
{
    public SurveyType Type { get; set; }
    public DateTime Date { get; set; }
    public IList<QuestionAnswer> Answers { get; set; }
}

Это позволит вам обеспечить пользовательскую проверку для каждого типа опроса.

1 голос
/ 12 июля 2011

Я думаю, что вы слишком усердны, когда говорите «излишне».Думая о масштабируемости и модульности с самого начала, это хорошая практика проектирования в моих книгах, независимо от размера проекта.

Мне нравится идея класса Question.Вы могли бы потенциально иметь массив элементов объектов Pattern / RegEx (как бы они ни назывались в ASP.NET) и метод, который принимает ответ String и обходит массив, пытаясь сопоставить его.Вы можете включить окончательные члены для значения балла, темы, подсказки и т. Д. Звучит как идеальный кандидат для своего класса.С точки зрения «связывания вопросов», основанного на ответе на предыдущий вопрос, возможно, это можно сделать так же просто, как поддержание списка ответов «пары next_question, с регистром по умолчанию для тех, кто« не любит мороженое ».Это может быть хорошим вариантом использования для хэш-таблицы или даже массива объектов нового класса - NextQuestionPair, который включает члены для «выбранный ответ» и «следующий вопрос».

РЕДАКТИРОВАТЬ: думать деревья,выбор веток на основе ответов (или их отсутствия)

...