Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.91/23: Рейтинг темы: голосов - 23, средняя оценка - 4.91
Эксперт .NET
4337 / 1999 / 387
Регистрация: 27.03.2010
Сообщений: 5,450
Записей в блоге: 1
1

Программа для тестов - как грамотно подойти к редактированию тестов

05.01.2012, 19:14. Просмотров 4318. Ответов 4
Метки нет (Все метки)


Что я пишу:
Вот пишу приложение для создания тестов, dll с классами самих тестов и приложение, которое будет уже отображать эти тесты, там можно себя проверить например на каком-то тесте, получить баллы за ответы на вопросы теста и прочитать о себе что-то, короче обыкновенные тесты. Программа, которая создаёт тесты должна уметь их редактировать естественно, то есть редактировать сам вопрос, ответы и т.д. Программа, которая будет отображать тесты, она будет грузить тесты из файла и их отображать.

Суть вопроса:
По идее же в программе отображающей тесты, нежелательно давать вообще возможность изменять вопросы, ответы и т.д. То есть меня почему-то постоянно не покидает мысль, что свойства нельзя делать доступными для изменения. Но тогда, в программе редактирующей тест, для изменения теста, мне придётся создавать новый экземпляр класса теста, заменять в тесте все ответы со старого экземпляра в новый и помещать этот экземпляр в коллекцию, удалив старый. А если сделать свойства доступные для редактирования, то все эти беды отпадают, просто меняю свойство и никаких проблем.

То есть мне для избавления от проблем нужно это:
Вариант 1
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    /// <summary>Вопрос</summary>
    public class Question
    {
        public Question(string text)
        {
            Text = text;
            Answers = new List<Answer>(4);
        }
 
        public Question(string text, IEnumerable<Answer> answers)
        {
            Text = text;
            Answers = new List<Answer>(answers);
        }
 
        /// <summary>Ответы</summary>
        public List<Answer> Answers { get; protected set; }
        /// <summary>Текст вопроса</summary>
        public string Text { get; protected set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    /// <summary>Ответ на вопрос</summary>
    public class Answer
    {
        public Answer(string text, uint marks, bool isCorrect)
        {
            Text = text;
            Marks = marks;
            IsCorrect = isCorrect;
        }
        /// <summary>Определяет правильный ли ответ</summary>
        public bool IsCorrect { get; protected set; }
        /// <summary>Баллы за ответ</summary>
        public uint Marks { get; protected set; }
        /// <summary>Текст ответа</summary>
        public string Text { get; protected set; }
    }


Заменить на это:
Вариант 2
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
    /// <summary>Вопрос</summary>
    public class Question
    {
        public Question()
            :this(string.Empty)
        {
        }
 
        public Question(string text)
        {
            Text = text;
            Answers = new List<Answer>(4);
        }
 
        public Question(string text, IEnumerable<Answer> answers)
        {
            Text = text;
            Answers = new List<Answer>(answers);
        }
 
        /// <summary>Ответы</summary>
        public List<Answer> Answers { get; protected set; }
        /// <summary>Текст вопроса</summary>
        public string Text { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    /// <summary>Ответ на вопрос</summary>
    public class Answer
    {
        public Answer()
        {
        }
 
        public Answer(string text, uint marks, bool isCorrect)
        {
            Text = text;
            Marks = marks;
            IsCorrect = isCorrect;
        }
        /// <summary>Определяет правильный ли ответ</summary>
        public bool IsCorrect { get; set; }
        /// <summary>Баллы за ответ</summary>
        public uint Marks { get; set; }
        /// <summary>Текст ответа</summary>
        public string Text { get; set; }
    }


Как вообще правильнее делать? Понимаю, моожет вообще кому-то покажется вопрос странным, и кто-то делает вообще как удобнее не задумываясь. Просто хочу всё делать правильно и научиться нормально строить архитектуру приложения. Или не стоит делать общедоступными только поля (ну этого вообще никогда и не делаю), которые могу повредить внутреннюю работу класса, то есть даже нельзя их менять извне через методы и свойства. А те свойства, что несут в себе информацию и не более, можно делать доступными для записи?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.01.2012, 19:14
Ответы с готовыми решениями:

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

Материалы для тестов. Программа распознавания
Здравствуйте. В данный момент я занимаюсь программой для нахождения и распознавания номеров авто. У...

Как задать один таймаут для всех unit тестов?
Привет всем.Можно ли как-то задать, чтобы все тесты выполнялись за определённое время, какой-то...

Как защитить служебные файлы программы для тестов от удаления и модификации
Здравствуйте! Я сделал программу тесты, все данные записаны в *txt файлы (сами тесты, информация...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
4
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
05.01.2012, 19:35 2
Сделать свойства как для чтения, так и для записи открытыми. После чего реализовать паттерн Посредника. Надеюсь доходчиво объяснил.
1
Эксперт .NET
4337 / 1999 / 387
Регистрация: 27.03.2010
Сообщений: 5,450
Записей в блоге: 1
05.01.2012, 19:55  [ТС] 3
Цитата Сообщение от Blood-Angel Посмотреть сообщение
Надеюсь доходчиво объяснил.
Неа, на своём примере, что-то не ясно как применять. Там у меня есть ещё класс самого теста, вот он будет сохраняться в файл:
C#
1
2
3
4
5
6
7
8
    /// <summary>Представляет из себя тест предназначенный для тестирования</summary>
    public class Test
    {
        /// <summary>Описание теста, включает в себя дополнительную информацию о тесте и название</summary>
        public Description Description { get; protected set; }
        /// <summary>Вопросы теста</summary>
        public List<Question> Questions { get; protected set; }
    }
Добавлено через 4 минуты
Сейчас попробую оттуда пример скомпилировать и посмотреть в работе, что и как он делает.

Добавлено через 8 минут
Способ конечно интересный, но я что-то всё равно не пойму, как это применить в моём случае. Создать посредника, который будет передавать изменения в классы? То есть на вход посредник будет получать изменения... Короче что-то толком не понятно.
0
Злой няш
1949 / 1384 / 508
Регистрация: 05.04.2010
Сообщений: 2,627
05.01.2012, 20:26 4
Попробую объяснить на простом примере, чтобы показать суть картины. Есть такая вещь как MVVM (Model-View-ViewModel), если его сравнивать с MVC (Model-View-Controller), то можно груба считать, что Controller - это ViewModel. В нашем же случае это и есть посредник между Model и View. Но особенность MVVM в том, что у него несколько View. (Там есть еще особенности, но в данном случае это не важно)
Вот теперь допустим, что один View для прохождения самого теста, а другой View для редактирования. Причем оба они ссылаются на ViewModel. В таком случае ViewModel разной View предоставляет разный функционал.
Это один из вариантов. Есть еще такой способ как "Инъекция зависимости". Суть ее в том, что мы навязываем интересующему нам классу определенный функционал. К примеру в конструктор этого класса передаем интерфейс контроллера с набором определенного функционала из него, при этом запрещаем создание конструктора по умолчанию, обязывая тем самым передать этот интерфейс.
P.S. Более подробно можно прочесть в книгах Гаммы и Фаулера.
1
Эксперт .NET
4337 / 1999 / 387
Регистрация: 27.03.2010
Сообщений: 5,450
Записей в блоге: 1
05.01.2012, 21:13  [ТС] 5
Пока-что у меня получилось
вот что.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
    public abstract class ObjectEditorBase
    {
        public abstract bool IsEditingInProgress { get; protected set; }
 
        public abstract void StartEdit(object editedObject);
 
        public abstract void ApplyEdit();
 
        public abstract void CancelEdit();
 
        /// <summary>Редактирование началось</summary>
        public abstract event EventHandler EditingStarted;
        /// <summary>Изменения разрешены</summary>
        public abstract event EventHandler<ObjectEditorEventArgs> ChangesArePermitted;
        /// <summary>Изменения отменены</summary>
        public abstract event EventHandler ChangesAreCancelled;
 
        protected abstract void OnEditingStarted();
 
        protected abstract void OnChangesArePermitted();
 
        protected abstract void OnChangesAreCancelled();
    }
 
    public class QuestionEditor : ObjectEditorBase
    {
        Question _editedQuestion;
 
        public override void StartEdit(object editedObject)
        {
            if (!(editedObject is Question))
                throw new ArgumentException();
 
            _editedQuestion = (Question)editedObject;
            OnEditingStarted();
        }
 
        public override void ApplyEdit()
        {
            _editedQuestion = null;
            OnChangesArePermitted();
        }
 
        public override void CancelEdit()
        {
            _editedQuestion = null;
            OnChangesAreCancelled();
        }
 
        public override bool IsEditingInProgress
        {
            get { return _editedQuestion != null; }
            protected set { throw new NotImplementedException(); }
        }
 
        /// <summary>Редактирование началось</summary>
        public override event EventHandler EditingStarted;
        /// <summary>Изменения разрешены</summary>
        public override event EventHandler<ObjectEditorEventArgs> ChangesArePermitted;
        /// <summary>Изменения отменены</summary>
        public override event EventHandler ChangesAreCancelled;
 
        protected override void OnEditingStarted()
        {
            if (EditingStarted != null)
                EditingStarted(this, EventArgs.Empty);
        }
 
        protected override void OnChangesArePermitted()
        {
            if (ChangesArePermitted != null)
                ChangesArePermitted(this, new ObjectEditorEventArgs(_editedQuestion));
        }
 
        protected override void OnChangesAreCancelled()
        {
            if (ChangesAreCancelled != null)
                ChangesAreCancelled(this, EventArgs.Empty);
        }
    }
 
    public class ObjectEditorEventArgs : EventArgs
    {
        public ObjectEditorEventArgs(object editedObject)
        {
            EditedObject = editedObject;
        }
 
        public object EditedObject { get; protected set; }
    }
То есть я буду подписываться на события этого класса в WPF окне, там если изменения подтверждены я буду выполнять те действия, на которые подпишусь (событие ChangesArePermitted), если изменения не подтверждены, то я буду выполнять другие действия с интерфейсом. Я пока ещё не пробовал правда, я только дописал эти классы. Пока не знаю, какие будут проблемы при таком подходе. Буду пробовать в действии. Хотя может это вообще глупая затея с такими классами, посмотрю во что это выльется и стоит ли такое применять. А как сделать по паттерну, что-то я не особо врубился, ну примерно имею представление, но вообще отдалённо.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.01.2012, 21:13

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Программа создания и проведения тестов не записывает в XML файл
Программа создания и проведения тестов. Сами тесты сохраняются в XML файле в следующем виде: ...

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

Хранение базы для тестов
Хочу написать тест. Где лучше всего хранить вопросы на тесты? Каждый вопрос будет содержать: -...

Написать программу для создания тестов
Пожалуйста, помогите создать программу для создания тестов. Которая состоит из 5 вопросов и в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.