Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Разрабатываю Систему опроса.

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
dlux66
Отправлено: 04 Августа, 2011 - 15:06:27
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Только начала изучать ООП. Хочу написать скрипт Система опросов.Не могли бы вы мне помочь построением структуры классов. (Какие классы создать, какие дочерние, какие абстрактные).
Задача:
1. В Базе Данных есть таблицы опросов (бывают активные и неактивные), таблица Вопросы, таблица Ответы, таблица Результаты.
2. Пользователь отвечает на вопросы опроса и добавляет данные в БД.
3. Администратор наблюдает за статистикой ответов на вопросы. Причем есть возможность просматривать выборочную статистику (например смотреть результаты опроса тех пользователей которые на вопрос 1 ответили ответом 1)


Я думаю, что необходимо создать класс Опросы, класс Вопросы (вопросы могут быть двух типов: дочерние классы Радио и Чекбокс), Класс Результаты опроса (от него 2 дочерних - обычные результаты и с выборкой), класс Список Опросов (2 дочерних Активные и Неактивные). Класс добавления опроса.

Мне кажется или я усложняю задачу?

(Отредактировано автором: 04 Августа, 2011 - 15:25:50)

 
 Top
White
Отправлено: 05 Августа, 2011 - 08:32:18
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




одной из важнейших парадигм ООП является инкапсуляция, не нужно ее игнорировать. если у вас одна сущность - "опрос", зачем создавать дополнительные?
когда пишете класс, в первую очередь определитесь что он должен вам делать, в данном случае:
1) создавать новый объект опроса, и загружать в него данные из БД.
2) отображать результаты опроса
3) добавлять данные в БД.
это и будут публичные методы класса.
далее его публичные свойства:
1)активный неактивный
и один статичный метод - получение списка опросов.
остальное реализуется приватными методами и свойствами, и скрыто от остальной программы. принцип в том, что любое изменение механизма подсчета добавления и т.п. не повлияет на публичные методы и свойства, таким образом если вы в дальнейшем захотите изменить код вашего класса это не повлияет на работоспособность скрипта в целом.
А если наплодить кучу классов, то изменение любого из них может привести к неработоспособности использующих его, и скрипта в целом.
Зачем такая структура БД?
создайте 2 таблицы: "опросы" и "варианты"
в таблице опросы:
id, название опроса, вопрос, статус(активный/неактивный)...
в таблице варианты:
id(того опроса к которому принадлежит), вариант ответа, количество положительных ответов, порядок показа в списке вариантов...

(Отредактировано автором: 05 Августа, 2011 - 08:33:43)



-----
if(time()>1356048000) die();
 
 Top
dlux66
Отправлено: 05 Августа, 2011 - 09:29:00
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




Меня смущает такая структура БД. Меня учили, что таблицы не должны быть сложными. Трудно будет различать какой опрос является активным, а какой неактивным. Как Может я неправильно объяснил:
Есть опросы, в каждом опросе есть вопросы (чекбокс или радио), на каждый вопрос несколько ответов.
Ваша структура не сможет показать выборочную статистику результатов.

И еще Мне не совсем понятно как статическим методом в классе Объект мы получим список Активных опросов, закрытых и черновиков?
 
 Top
White
Отправлено: 05 Августа, 2011 - 18:03:33
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




dlux66 ну это скорей не вопросы, а тесты. структура вашей БД мне не ясна, каким образом взаимосвязаны данные в таблицах?
dlux66 пишет:
как статическим методом в классе Объект мы получим список Активных опросов, закрытых и черновиков?

так же, как вы бы это сделали в дочернем классе, выборкой из БД, например метод get_list($type), и делаете выборку по $type который и соответствует активному, закрытому либо черновику. если бы он не был статичным, то его результат все равно никак не зависел бы от свойств вызвавшего его объекта, и для любого объекта был бы одинаковым.


-----
if(time()>1356048000) die();
 
 Top
dlux66
Отправлено: 07 Августа, 2011 - 10:09:41
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2011  


Помог: 0 раз(а)




данные взаимосвязаны по id. в таблице вопросов есть ячейка IdPoll, в таблице ответов есть ячейка IdAnswer и т.д.

В таком случае не много ли берет на себя класс Опрос??
 
 Top
White
Отправлено: 07 Августа, 2011 - 11:18:06
Post Id



Частый посетитель


Покинул форум
Сообщений всего: 830
Дата рег-ции: Июнь 2011  
Откуда: Днепропетровск


Помог: 28 раз(а)




dlux66 возможно и много, но дам вам небольшую наводку, чтобы вы сами смогли сделать выводы.
Сегодня вы напишете 4-5 классов для вашего скрипта, и используя их напишете большой красивый сайт. все будет замечательно работать, пройдет месяц, и вам захочется оптимизировать ваш код, например добавить вопросы, на которые не будет ни чекбокса ни радио, а тестовое поле. Что вы делаете:
добавляете новый класс (текстбокс), добавляете еще один дочерний класс к списку опросов..., и изменяете ваш код на ВСЕХ страницах сайта.
а всего-то навсего можно было изменить метод get_list($type) добавив новое возможное значение $type.
это и есть инкапсуляция. делайте ваш код чуть более абстрактным, так чтобы его изменение в дальнейшем никак не повлияло на работу уже готового скрипта.
представьте себе, что вы пользователь, и вас не интересует как устроен скрипт. вам нужно, чтобы введя 2+2 вы получили 4, а механизм его получения был скрыт от вас, и вы не могли получить к нему никакого доступа. так и здесь, пусть скрипт использует только те методы класса, которые дают ему готовый результат, а остальное это проблемма уже не его а класса.


-----
if(time()>1356048000) die();
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


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



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB