За последние 24 часа нас посетили 18202 программиста и 1651 робот. Сейчас ищут 1630 программистов ...

API форума

Тема в разделе "Решения, алгоритмы", создана пользователем Alost, 29 сен 2009.

  1. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Например WinAPI состоит из множества классов. И хотя многие PHP-программисты стараются сделать весь API в одном классе, нет ничего страшного в таком коде:
    PHP:
    1. <?php
    2. // Загрузка интерфейса БД
    3. $db = new db('localhost', 'root', 'pass');
    4. // Загрузка интерфейса упраления сообщениями
    5. $messages = new messages($db);
    6. // Получение сообщения
    7. $message = $messages -> getById(1);
    При чем $message - объект.
     
  2. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    [vs], имхо — неудобно так, как ты говоришь. с одним классом — я один раз его создал и один раз настроил его.
    а так — каждый раз придётся настраивать. а если я на одной странице хочу вывести, скажем, список категорий и список последних обновленных тем, то будет вообще неудобно:
    PHP:
    1. <?php
    2. $categories = new Api_Forum_Categories($config);
    3. foreach($categories->getAll() as $cat) {
    4.  // bla-bla-bla
    5. }
    6. $topics = new Api_Forum_Topics ($config);
    7. foreach($topics->getLast() as $topic) {
    8.  // bla-bla-bla
    9. }
    10.  
    11. /***
    12.  V.S.
    13.  ***/
    14.  
    15. $forum = new Api_Forum($config);
    16. foreach ($forum->getCategories() as $cat) {
    17.  // bla-bla-bla
    18. }
    19. foreach ($forum->getLastTopics() as $topic) {
    20.  // bla-bla-bla
    21. }
    А на счёт ВинАПИ, мне несколько дней назад один товарищ сишник сказал (не дословно):
     
  3. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Согласен что в PHP часто удобней держать в одном классе.

    Кстати как лучше
    PHP:
    1.  
    2. $forum->topics->getById
    3. или
    4. $forum->topicsGetById
    5.  
    ?
     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    TheShock
    Согласен, что в использовании не так удобно. Но во втором случае
    будет либо гигантским монстром, либо будет неявно дергать те же отдельные классы api категорий и форумов, что усложняет модификацию. Так что дело вкуса.
     
  5. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Так
     
  6. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    $topics = Toolkit::getInstance()->getDataMaper()->find('Topic', array('id' => $ids));
    хехе... смешная тема =)
     
  7. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Это уже API фреймворка а не форума =)
     
  8. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    с точностью до наоборот, имхо. это только облегчит модификацию и расширение)
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    А теперь сформулируйте отличие.
     
  10. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Какая разница как что называть, не на уроке философии.
     
  11. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Нормально спроектированный и написанный форум содержит в себе API по определению. API - это интерфейс, за которым скрыта реализация. Теперь берем определение ООП и читаем.
    Все модели и вспомогательные классы самодостаточны - бери, используй.
    Другое дело, если нужно внешнее API - кроссплатформенное, удаленное и т.д. и т.п. Это отдельные случаи которые нужно обсуждать отдельно.
     
  12. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Им до лампочки :) они этого не понимают :)
     
  13. Alost

    Alost Активный пользователь

    С нами с:
    7 фев 2009
    Сообщения:
    335
    Симпатии:
    0
    Адрес:
    Город вокруг невы
    Спорьте в своей песочнице, а мы в своей поиграем.
     
  14. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Лишние сущности.
    универсально для получения любых данных из БД. У форума таблицы фиксированы, удобнее получать данные через специализироване методы, иначе их придется каждый раз писать вручную (например, чтобы выбрать и отсортировать), либо писать класс с этими методами, которые будут дергать этот find через задний проход. :)
     
  15. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а работает ли он с такими запросами:
    ... WHERE (foo=1) OR (bar=3 AND animal='cat')?
    и можешь ли им заделиться?

    Сейчас на гитхабе нашел такое
    PHP:
    1. <?
    2.         $field1 = new Field('id', 0);
    3.  
    4.         $subq2 = new SelectQuery(array('bans'));
    5.         $subq2->setSelect(array($field1));
    6.         $subq2->setWhere(new Condition('=', new Field('abc'), 10));
    7.  
    8.         $subq = new SelectQuery(array('users'));
    9.         $subq->setSelect(array($field1));
    10.         $subq->setWhere(new AndOp(
    11.             new Condition('>', new Field('age'), 14),
    12.             new Condition('in', new Field('id'), $subq2),
    13.             new Condition('=', new Field('regdt'), '2009-01-01')
    14.         ));
    15.  
    16.         $q = new SelectQuery(array('posts'));
    17.         $q->setWhere(new AndOp(
    18.             new Condition('>', new Field('comment'), 1),
    19.             new Condition('in', new Field('user_id'), $subq),
    20.             new Condition('=', new Field('funny'), 1)
    21.         ));
    22.  
    23.         $this->assertEquals('SELECT `t0`.* FROM `posts` AS `t0` WHERE (`t0`.`comment` > :p1 AND `t0`.`user_id` IN (SELECT `t0`.`id` FROM `users` AS `t0` WHERE (`t0`.`age` > :p2 AND `t0`.`id` IN (SELECT `t0`.`id` FROM `bans` AS `t0` WHERE `t0`.`abc` = :p3) AND `t0`.`regdt` = :p4)) AND `t0`.`funny` = :p5)', $q->sql());
    24.  
    испытываю священный трепет от количества создаваемых объектов
     
  16. sorteros

    sorteros Активный пользователь

    С нами с:
    28 авг 2009
    Сообщения:
    54
    Симпатии:
    0
    Трепет здесь надо испытывать не от количества создаваемых объектов, хрен бы с ними, а от ебанутой на всю голову реализации.
     
  17. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Почти тру ООП =)
     
  18. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    С таким успехом можно каждый символ трактовать как объект.
     
  19. kostyl

    kostyl Guest

    разрешаю обсудить мой код ))
    PHP:
    1.  
    2. <?php
    3.     /**
    4.      * @param string $SessionId
    5.      * @return int|NULL
    6.      */
    7.     public static function GetId($SessionId)
    8.     {
    9.         $Query = new KTF_Queryselect();
    10.         $Query->AddTable(new KTF_Querytable(USER_SESSION_TABLE));
    11.         $Query->AddField(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'id'));
    12.         $WhereSessId = new KTF_Querycondition();
    13.         $WhereSessId->SetLeftObject(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'sess_id'));
    14.         $WhereSessId->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_EQUAL));
    15.         $WhereSessId->SetRightObject(new KTF_Queryvalue($SessionId, KTF_Db::KTF_Db_Format_Str));
    16.         $WhereLastUpdate = new KTF_Querycondition();
    17.         $OperatoinLastUpdate = new KTF_Querycondition();
    18.         $OperatoinLastUpdate->SetLeftObject(new KTF_Queryvalue(time(), KTF_Db::KTF_Db_Format_Int));
    19.         $OperatoinLastUpdate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_MINUS));
    20.         $OperatoinLastUpdate->SetRightObject(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'last_update'));
    21.         $WhereLastUpdate->SetLeftObject($OperatoinLastUpdate);
    22.         $WhereLastUpdate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_LESS));
    23.         $WhereLastUpdate->SetRightObject(new KTF_Queryvalue(USER_SESSION_TIMEOUT, KTF_Db::KTF_Db_Format_Int));
    24.         $WhereCreate = new KTF_Querycondition();
    25.         $OperatoinCreate = new KTF_Querycondition();
    26.         $OperatoinCreate->SetLeftObject(new KTF_Queryvalue(time(), KTF_Db::KTF_Db_Format_Int));
    27.         $OperatoinCreate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_MINUS));
    28.         $OperatoinCreate->SetRightObject(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'created'));
    29.         $WhereCreate->SetLeftObject($OperatoinCreate);
    30.         $WhereCreate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_LESS));
    31.         $WhereCreate->SetRightObject(new KTF_Queryvalue(USER_SESSION_LIFETIME, KTF_Db::KTF_Db_Format_Int));
    32.         $WhereSessId->AddCondition($WhereLastUpdate, new KTF_Queryoperator(KTF_Queryoperator::KTF_AND));
    33.         $WhereSessId->AddCondition($WhereCreate, new KTF_Queryoperator(KTF_Queryoperator::KTF_AND));
    34.         $Query->AddWhere($WhereSessId);
    35.         $Result = KTF_Db::Query($Query->GetQueryString(), $Query->GetBinds())->FetchOne();
    36.         unset($WhereSessId);
    37.         unset($WhereLastUpdate);
    38.         unset($OperatoinLastUpdate);
    39.         unset($WhereCreate);
    40.         unset($OperatoinCreate);
    41.         unset($Query);
    42.         if($Result) {
    43.             return $Result['id'];
    44.         }
    45.         else {
    46.             $Query  = new KTF_Querydelete();
    47.             $Query->AddTable(new KTF_Querytable(USER_SESSION_TABLE));
    48.             $WhereSessId = new KTF_Querycondition();
    49.             $WhereSessId->SetLeftObject(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'sess_id'));
    50.             $WhereSessId->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_EQUAL));
    51.             $WhereSessId->SetRightObject(new KTF_Queryvalue($SessionId, KTF_Db::KTF_Db_Format_Str));
    52.             $WhereLastUpdate = new KTF_Querycondition();
    53.             $OperatoinLastUpdate = new KTF_Querycondition();
    54.             $OperatoinLastUpdate->SetLeftObject(new KTF_Queryvalue(time(), KTF_Db::KTF_Db_Format_Int));
    55.             $OperatoinLastUpdate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_MINUS));
    56.             $OperatoinLastUpdate->SetRightObject(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'last_update'));
    57.             $WhereLastUpdate->SetLeftObject($OperatoinLastUpdate);
    58.             $WhereLastUpdate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KFT_ABOVE_EQUAL));
    59.             $WhereLastUpdate->SetRightObject(new KTF_Queryvalue(USER_SESSION_TIMEOUT, KTF_Db::KTF_Db_Format_Int));
    60.             $WhereCreate = new KTF_Querycondition();
    61.             $OperatoinCreate = new KTF_Querycondition();
    62.             $OperatoinCreate->SetLeftObject(new KTF_Queryvalue(time(), KTF_Db::KTF_Db_Format_Int));
    63.             $OperatoinCreate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KTF_MINUS));
    64.             $OperatoinCreate->SetRightObject(new KTF_Queryfield(new KTF_Querytable(USER_SESSION_TABLE), 'created'));
    65.             $WhereCreate->SetLeftObject($OperatoinCreate);
    66.             $WhereCreate->SetOperator(new KTF_Queryoperator(KTF_Queryoperator::KFT_ABOVE_EQUAL));
    67.             $WhereCreate->SetRightObject(new KTF_Queryvalue(USER_SESSION_LIFETIME, KTF_Db::KTF_Db_Format_Int));
    68.             $WhereSessId->AddCondition($WhereLastUpdate, new KTF_Queryoperator(KTF_Queryoperator::KTF_OR));
    69.             $WhereSessId->AddCondition($WhereCreate, new KTF_Queryoperator(KTF_Queryoperator::KTF_OR));
    70.             $Query->AddWhere($WhereSessId);
    71.             KTF_Db::Query($Query->GetQueryString(), $Query->GetBinds());
    72.             unset($WhereSessId);
    73.             unset($WhereLastUpdate);
    74.             unset($OperatoinLastUpdate);
    75.             unset($WhereCreate);
    76.             unset($OperatoinCreate);
    77.             unset($Query);
    78.             return NULL;
    79.         }
    80.     }
    81.  
    жесть, не правда ли?
    Зато один объект можно добавить в кучу запросов и он будет синхронно их менять, также с легкостью пишется класс миниОРМ для много чего и т.д. и т.п. У каждого свои тараканы ))
     
  20. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    И все-таки, моя функция, возвращающая сиськи, была лучшей.
     
  21. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    Да ну его в жопу такой копипаст.

    Зачем?
     
  22. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    знаете, что я не люблю? когда в имена классов/файлов/переменных/функций вставляют названия продукта. KTF_Querycondition, EnigmaHTTPRequest,

    НО: я не против того что б одна папка с продуктом называлась как продукт. И не против что б он значился в @package.

    Просто вышеперичисленное должно иметь свой смысл. Database, Template, Request, Router

    upd: еще не люблю маленькие буквы в константах и переменные/ф-ции, начинающиеся с большой буквы.
     
  23. kostyl

    kostyl Guest

    ты просто наверно не сидел пол дня выясняя почему нихера не работает из-за перепутанного класса ))
     
  24. Koc

    Koc Активный пользователь

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    kostyl, не страдаю такой ерундой. [​IMG]

    По прежнему sql builder от TheShock наиболее интересен, потому как там указывается тип данных, в отличие от Kahana

    Но мы удаляемся от темы, господа.
     
  25. kostyl

    kostyl Guest

    у меня тоже указываются типы данных и запросы биндятся по ним: под mysqli и PDO