С Новым годом! Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

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

05.01.2012, 19:14. Показов 5682. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
05.01.2012, 19:14
Ответы с готовыми решениями:

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

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

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

4
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
05.01.2012, 19:35
Сделать свойства как для чтения, так и для записи открытыми. После чего реализовать паттерн Посредника. Надеюсь доходчиво объяснил.
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
05.01.2012, 19:55  [ТС]
Цитата Сообщение от 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
Злой няш
 Аватар для I2um1
2136 / 1505 / 565
Регистрация: 05.04.2010
Сообщений: 2,881
05.01.2012, 20:26
Попробую объяснить на простом примере, чтобы показать суть картины. Есть такая вещь как MVVM (Model-View-ViewModel), если его сравнивать с MVC (Model-View-Controller), то можно груба считать, что Controller - это ViewModel. В нашем же случае это и есть посредник между Model и View. Но особенность MVVM в том, что у него несколько View. (Там есть еще особенности, но в данном случае это не важно)
Вот теперь допустим, что один View для прохождения самого теста, а другой View для редактирования. Причем оба они ссылаются на ViewModel. В таком случае ViewModel разной View предоставляет разный функционал.
Это один из вариантов. Есть еще такой способ как "Инъекция зависимости". Суть ее в том, что мы навязываем интересующему нам классу определенный функционал. К примеру в конструктор этого класса передаем интерфейс контроллера с набором определенного функционала из него, при этом запрещаем создание конструктора по умолчанию, обязывая тем самым передать этот интерфейс.
P.S. Более подробно можно прочесть в книгах Гаммы и Фаулера.
1
Эксперт .NET
 Аватар для Casper-SC
4434 / 2094 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1
05.01.2012, 21:13  [ТС]
Пока-что у меня получилось
вот что.
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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.01.2012, 21:13
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru