Шаблон дизайна для этого приложения? - PullRequest
0 голосов
/ 04 апреля 2009

Вы пишете приложение, которое управляет онлайн-курсами. Курс завершен по-разному. Чтобы пройти курс, пользователь должен выполнить одно или несколько из следующих действий:

  • потратить х количество часов в курсе
  • сдать тест и сдать его (проходной балл может отличаться для каждого курса)
  • пройти все уроки в курсе
  • некоторые другие требования, о которых вы еще не знаете

Когда курс закончен, должно произойти какое-то событие. Событие зависит от курса. Может произойти одно или несколько из следующего:

  • Пользовательский сертификат создан для пользователя
  • Организация получает оповещение по электронной почте, с помощью обратного вызова HTTP или с помощью чего-либо еще
  • некоторые другие требования, о которых вы пока не знаете

Многие из курсов почти идентичны по своим требованиям, но некоторые совершенно уникальны. Есть много курсов, свыше 50, и всегда добавляются новые.

Как бы вы разработали такое приложение? Есть ли шаблон проектирования, который вы можете использовать для устранения избыточного кода и облегчения добавления / редактирования курсов?

Ответы [ 3 ]

1 голос
/ 04 апреля 2009

Вот как бы я начал рисовать ...

У вас есть объект Course, который принимает объект Requirements и объект OnCompleteActions в его конструкторе ... если бы я сделал внутренний конструктор и создал бы CourseBuilder, который будет знать, как создавать все различные курсы, но ...

Когда курс обновляется, он проверяет, выполнены ли требования, передавая себя объекту требований. Если он удовлетворяет требованиям, он передается в OnCompleteActions.

private void OnCourseUpdate()
{
        if (this._Requirements.AreMetBy(this))
        {
            this._OnCompleteActions.Execute(this);
        }
}

Объект Requiremetns - это не что иное, как совокупный список IRequirement, который вы можете настроить на основе создаваемого вами курса ... Метод AreMetBy просто перечисляет все ваши IRequirements в списке и проверяет, удовлетворяет ли ваш курс всем им. ...

interface IRequirement 
{
    public bool IsMetBy(Course course);
}

Тогда у вас могут быть всевозможные требования, которые реализуют IRequirement ...

class CourseHoursRequirement : IRequirement
{
    public CourseHoursRequirement(int minimumHours)
    {...}

    public bool IsMetBy(Course course)
    {
        return course.NumberHours >= this._MInimumHours 
    }
}

Та же идея для OnCompleteActions будет иметь список из одного или нескольких IOnCompleteAction, которые будут выполнять каждое из них. ех. CreateCertificateOnCompleteAction, SendEmailOnCompleteAction и т. Д.

Инкапсулируя каждое возможное Требование в своем собственном классе, вы можете затем создать курс, который будет иметь MinimumHourRequirement, PassedAllTestRequirement и т. Д. Вы можете легко добавлять новые требования по мере продвижения, поскольку все они реализуют один и тот же интерфейс. Возможно, вам придется добавить некоторые предельные свойства по мере использования (например, минимальные часы), но реальная работа выполняется внутри метода IsMetBy () ...

Удачи!

1 голос
/ 04 апреля 2009

Шина сообщений для обработки заключительной фазы и конечный автомат, чтобы определить, когда они прошли. На самом деле все это можно сделать с помощью шины сообщений. Хорошая книга для чтения - «Шаблоны корпоративной интеграции», в которых рассматриваются подобные ситуации. Сложность заключается в том, чтобы ошибки программного обеспечения не приводили к потере студентами кредитов.

Может быть, у меня просто лихорадка jms / esb.

0 голосов
/ 30 сентября 2012

Поскольку существуют фиксированные шаги, которые требуются для любого курса, тогда мы можем использовать шаблон здесь? Нравится

interface Course{
timeSpent();
testTaken();
lessonLearnt();
miscllenious();

}

Все курсы реализуют этот интерфейс и реализуют метод соответствующим образом. Пожалуйста, выскажите свое мнение, чтобы я мог понять, понял ли я это или нет.

...