Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Классы, преимущества 
:(
    Опции темы
Gold Dragon
  Дата 1.5.2005, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Я планирую сделать один проект. Будет к примеру база, в которой будут храниться сведения о персоне.

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

Хотелось бы услышать более-менне убедительные доводы, а не просто "так удобнее" и будьте разумными, не давайте ссылки


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sardar
Дата 1.5.2005, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Мне проще писать и понимать так:
Код
//вырезка из реального кода

//класс содержит инфу о юзере, правах, сессии
$info['user']=& new UserSession();
//проверяем можно ли входить гостям
if(empty($config['login_allow_anonymous'])&& $info['user']->isAnonymousRequest()) { //если идентификаторов сессии не приходило
    execModule("login"); //must login
    $info['page']->flushOutput();
    exit();
}
//открываем сессию. драйвер установлен выше.
//с этого момента известны права и инфа юзера, берётся из сессии(закешированно для быстроты работы)
//поэтому сессия реализованна в БД, при открытии проверяется по ключу и IP
$info['user']->startSession();

//проверяем живой ли юзер
if(empty($config['login_allow_anonymous'])&&!$info['user']->isLoggedIn()) {
  $info['session manager']->destroySession();
  execModule("login"); //must login
  $info['page']->flushOutput();
  exit();
}


//для примера, далее имеем инфу о юзере
$userfino=& $info['user']->getUserInfo(); //имя и т.п.
$perms= &$info['user']->getPermissionManager();

if($perms->checkPermission("news.admin.add")) echo "Юзер может добавлять новости в модуль новостей(news)";


Как видишь активно используються обьекты, всё ясно и удобно. Повторю: как тебе понятней удобней, так и делай smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Mal Hack
Дата 1.5.2005, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Плюсы:

* Удобство редактирования код, поскольку при большом файле, где бы у вас хранилось около 150 функций, было бы тяжело сориентироваться
* Удобство модификации, поскольку вам достаточно лишь изменить тот или иной метод класса, не переписывая при этом основной код программы.
* Повышение безопасности, при грамотном использовании.
* Увеличение времени работы скрипта, при грамотном использовании.


Что касается минусов, то при Неправильном проектировании все вышеперечисленные плюсы окажутся в минусе. Под проектирование понимается описание структуры класса, его свойств и методов описываемых в нем, взаимодействие объектов.

Главное – правильно спроектировать объектную модель вашего приложения. Четко определить, что будет делать тот или иной метод и что будет хранить то или иное свойство.
PM ICQ   Вверх
Gold Dragon
Дата 1.5.2005, 20:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



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

Делаю генеологическое древо. Стараюсь следовать спецификации smile

есть таблицы

"Событие"
- ID
- день
- месяц
- год
- прификс
- место
- ID персоны
- фото

"Персона"
- ID
- Фамилия
- Имя
- Отчество
- Фамилия при рождении
- место жительства
- отец
- мать
- фото

В общем, у "персоны" может быть много событий. Вот никак не могу определить как мне описать класс.


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.5.2005, 20:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Red Dragon
в принципе ты описал выше структура класса.
PM ICQ   Вверх
Gold Dragon
Дата 1.5.2005, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Да я её у себя в тетрадке уже давно описал, но как её практически применять не могу понять.

И как мне быть с "Собитие", создать ещё один класс?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.5.2005, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Red Dragon
Использование классов зависит не только от структуры данных, но и от сложности реализации поставленного алгоритма на практическом уровне.
PM ICQ   Вверх
Sardar
Дата 1.5.2005, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



В зависимости от того что ты хочешь сделать. Допустим что событие это реально событие, например день рождения персоны или день выдачи зар.платы.

Тогда можно для юзера сделать класс, который будет просто нести инфу о юзере, без set методов. Обычно установку этой инфы ведём с других мест.
Инфу лучше выдавать в ассоциативном массиве, а не в куче get методов, не на Java же пишем smile Дальше по ходу развития в класс юзера придут новые вещи, типа менеджера прав, сессии и т.п.

Также он будет иметь метод getEventManager() - возвращающий обьект менеджера событий для юзера. Смысл менеджера фильтрировать события, например
listAllEvents() - вообще все события
listByDateEvents($timestamp) - события по дате
listTodayEvents() - события за сегодня(упрощение метода выше)

Вообще менеджер может многое что делать... smile

В списках событий храняться третий вид обьектов: события. Имплементация каждого события лежит в своём классе и делает что то необходимое с юзером, например поздравляет с зарплатой и напоминает что баланс на счету и-нета -хх енотов.

Для событий пишем один базовый класс с базовым интерфейсом, содержащим processEvent() - начать работу, каждый наследник переопределит сей метод

Что имеем в это точке? Ясность кода, простоту, расширяемость за счёт новых событий(действий).


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Gold Dragon
Дата 1.5.2005, 21:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



То есть если я буду использовать класс без событий, мне проще сделать массив....?
Мне нужно ещё события проработать, так?

Sardar
Ну ты сказал, голова сразу загрузилась.. smile





--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.5.2005, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Red Dragon
события это функции (методы). У PHP собыйтий нет. ПХП5 - небольшое исключение.
У тея же - свойства (переменнные).
PM ICQ   Вверх
Sardar
Дата 1.5.2005, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Цитата(Red @ 1.5.2005, 20:05)
Ну ты сказал, голова сразу загрузилась..

Короче разбивать на классы нужно не как на какие то структуры данных, а логически на "кто что будет делать". Разбивка на дочерние классы от базового по смыслу "как это будет работать". Это базис, после идут паттерны ООП и т.п. smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Gold Dragon
Дата 1.5.2005, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



А есть принципиальная разница использовать классы или массивы+функции?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Mal Hack
Дата 1.5.2005, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Мудрый...
****


Профиль
Группа: Участник Клуба
Сообщений: 9926
Регистрация: 15.2.2004

Репутация: 122
Всего: 261



Это два способа реализации.
Если грамотно применять, все будет путем, но Объекты легче на больших проектах (сложных).
PM ICQ   Вверх
Gold Dragon
Дата 2.5.2005, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Призрачный
****


Профиль
Группа: Экс. модератор
Сообщений: 6753
Регистрация: 1.3.2004
Где: Россия, Тамбов

Репутация: 10
Всего: 71



Вот у меня код, всё сделано через массивы. Определение и заполнение
Код

$PerInf = Array('id','fam','im','ot','fam_r','m_z','zan','otez','mat','kom','foto');
$Persona = Array ($PerInf);

function Sozd()
{
   global $Persona, $T_PERSONA;
   $r = mysql_query("select * from `$T_PERSONA`");

   for ($i=0; $i<mysql_num_rows($r); $i++)
   {
      $f = mysql_fetch_array($r);
      $Persona[$i][id]=$f[id];
      $Persona[$i][fam]=$f[fam];
      $Persona[$i][im]=$f[im];
      $Persona[$i][ot]=$f[ot];
      $Persona[$i][fam_r]=$f[fam_r];
      $Persona[$i][m_z]=$f[m_z];
      $Persona[$i][zan]=$f[zan];
      $Persona[$i][otez]=$f[otez];
      $Persona[$i][mat]=$f[mat];
      $Persona[$i][kom]=$f[kom];
      $Persona[$i][foto]=$f[foto];
   }
}

А как это же описать через классы?


--------------------
Нельзя жить в прошлом, оно уже прошло.
Нельзя жить в будущем, оно ещё не наступило.
Нужно жить в настоящем, помня прошлое и думая о будущем!
PM MAIL WWW ICQ   Вверх
Sardar
Дата 3.5.2005, 01:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 4
Всего: 317



Я честно не понял что ты хотел этим кодом сделать...

Наверное так:
Код
//класс несущий инфу о юзере
class UserInfo {
//статический метод, собираюший всех юзеров
//аргумент: список твоих полей выше... а оно реально нужно?
   function &getAllUsersInfo($fieldinfo=array('id','fam','im','ot','fam_r','m_z','zan','otez','mat','kom','foto')) {
      global $config, $info;

      $r = mysql_query("SELECT * FROM `{$config['table_persona']}`") or $info['page']->criticalMessage("UserInfo.getAllUsersInfo: Can't read DB");
      $ret=array();
      while($row=mysql_fetch_assoc($r)) $ret[]=& new UserInfo($fieldinfo, $row);
      return $ret;
   }

   var $finfo;
   var $row;

   function UserInfo($fieldinfo, &$dbrow) {
      $this->finfo=$fieldinfo;
      $this->row=&$dbrow;
   }
//я так понял нужно получить ассоциативный массив, где ключи из списка выше, а значения из БД под полями из этого же списка...
//какой то странный изврат :)
   function getInfo($fieldinfo=null) {
      $f=empty($fieldinfo)? $this->finfo: $fieldinfo;
      $ret=array();
      for($i=0; $i<sizeof($f); $i++) $ret[$f[i]]=$this->row[$f[$i]];
      return $ret;
   }

// ну а здесь можно выдавать нормальный массив с жёстко опрелёнными ключами, либо
//писать кучу getXXX методов.
}

//пример
$allUsers=& UserInfo::getAllUsersInfo();
foreach($allUsers as $user) {
   print_r($user->getInfo());
}


Если я не правильно тебя понял, то опиши задачу на на человеческом(русском) языке smile


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0619 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.