За последние 24 часа нас посетил 19221 программист и 1644 робота. Сейчас ищут 872 программиста ...

Подход к программированию

Тема в разделе "Прочие вопросы по PHP", создана пользователем apc, 18 июн 2009.

  1. apc

    apc Guest

    Доброго времени суток.
    Пушу это сообщение тут, так как считаю вас наиболее профессиональной публикой.
    Мой вопрос имеет концептуальный характер и он требует наличие опыта.
    Собственно вопрос:
    Какой метод программирования самый лучший. Сразу две оговорки, первая – метод не совсем верное определение (а какое верное? Вы поймете это в контексте сообщения), второе – «саамы лучший», я имею ввиду самый лучший с вашей точки зрения.

    Вот смотрите, пример моего кода:
    Код (Text):
    1.  
    2. <?php
    3. include ('../classes/db-class.php');
    4. include ('../classes/picture-class.php');
    5.  
    6. $picture = new picture();
    7.  
    8. switch ($_REQUEST['action']){
    9.  
    10. case 'addCatalog':
    11. $all->htmlHead("Visual CMS 2009 | Папка добавлена");
    12. $picture->addCatalog();
    13. $picture->uploadPictureForm();
    14. $picture->newCatalogForm();
    15. break;
    16.  
    17. case 'delCategory':
    18. $picture->delCategory();
    19. $all->htmlHead("Visual CMS 2009 | Папка удалена");
    20. $picture->uploadPictureForm();
    21. $picture->newCatalogForm();
    22. break;
    23.  
    24. ………….
    25. ………….
    26. ………….
    27. default:
    28. $all->htmlHead("Visual CMS 2009 | Работа с изображениями");
    29. $picture->uploadPictureForm();
    30. $picture->newCatalogForm();
    31. break;
    32. }
    33.  
    34. $all->htmlFoot();
    35.  
    36. ?>
    - это как вы поняли файл в котором вся логика, построена она очень просто. На странице передаются переменные $_REQUEST[‘action’] и на основе этих переменных вызываются ф-ии.

    Вот второй файл:
    Код (Text):
    1.  
    2. <?php
    3. class picture{
    4.  
    5. #Начало класса, конструкт
    6. function __construct (){
    7.     $this->db = new db();
    8.     $this->db->connect();
    9.     $this->all = new all();
    10.     echo '
    11.         <script>
    12.  
    13. ////////////////////////////////////////////////////////////////////////////////
    14. public function addCatalog(){
    15.  
    16.     $config = parse_ini_file('../elements/config/cms_config.ini', true);
    17.     $root_document = $config['main']['root_document'];
    18.  
    19.     $catalog_name = $this->all->in_var($_REQUEST['catalog_name']);
    20.     $catalog_real_name = $this->all->in_var($_REQUEST['catalog_real_name']);
    21.  
    22.     $root_document = $config['main']['root_document'];
    23.     $link = $root_document."elements/i/cms_folders/$catalog_real_name/";
    24.  
    25.     if(!@mkdir($root_document."elements/i/cms_folders/$catalog_real_name/", 0777)){
    26.         echo '<H2><font color="red"><div align="center">Папка не создана!</div></font></H2>';
    27.     }else{
    28.         $this->db->query('INSERT INTO pictures_catalog (picture_catalog_name,  picture_catalog_real_name) VALUES ( "'.mysql_real_escape_string($catalog_name).'", "'.mysql_real_escape_string($catalog_real_name).'")');
    29.     }
    30. }
    31. ////////////////////////////////////////////////////////////////////////////////
    32. public function delCategory(){
    33.     $config = parse_ini_file('../elements/config/cms_config.ini', true);
    34.     $root_document = $config['main']['root_document'];
    35.  
    36.     $this->db->query('SELECT * FROM pictures_catalog WHERE ID = '.$_REQUEST['id_cat']);
    37.     $mysql_array = $this->db->return_obj_array();
    38.     $id = $mysql_array[0]['ID'];
    39.     $catalog_real_name = $this->all->out_var($mysql_array[0]['picture_catalog_real_name']);
    40.     $path = $root_document."elements/i/cms_folders/$catalog_real_name/";
    41.     rmdir_recurse($path);
    42.     $this->db->query('DELETE FROM pictures_catalog WHERE ID = '.$_REQUEST['id_cat']);
    43.     rmdir($path);
    44. }
    45. ////////////////////////////////////////////////////////////////////////////////
    46. public function saveCatalog(){
    47.     $config = parse_ini_file('../elements/config/cms_config.ini', true);
    48.     $root_document = $config['main']['root_document'];
    49.  
    50.     $new_catalog_name = $_REQUEST['new_catalog_name'];
    51.     $new_catalog_real_name = $_REQUEST['new_catalog_real_name'];
    52.     $idDir = $_REQUEST['idDir'];
    53.     $oldName = $_REQUEST['oldName'];
    54.     $u = 'elements/i/cms_folders/';
    55.  
    56.     @rename($root_document.$u.$oldName, $root_document.$u.$new_catalog_real_name);
    57.     $this->db->query('UPDATE pictures_catalog SET picture_catalog_name = "'.$this->all->in_var($new_catalog_name).'", picture_catalog_real_name = "'.$this->all->in_var($new_catalog_real_name).'" WHERE `ID` = '.$idDir);
    58. }
    59. ////////////////////////////////////////////////////////////////////////////////
    60. }
    61. ?>
    -тут соответственно хранятся функции.
    Файл db-class.php я во внимание не беру, т.к. это простейший класс.

    Я считаю эту методику достаточно эффективной но я хочу развиваться…


    Так вот что вы думаете о моем методе и какой метод применяете вы.[/code]
     
  2. iliavlad

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

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    А в чем методика?)

    switch лучше переделать: когда у вас будет пара десятков пунктов - долго будете листать до нужного места.
    $_REQUEST['catalog_name'] и т.п. лучше передавать как параметры конструктора (метода).

    если такой тип сообщения будет использовать более 1 раза и вы захотите потом добавить к нему скажем жирное начертание, будете долго по коду искать всё ли вы поправили.
     
  3. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    apc, оба ужасных. Каша какая-то.
     
  4. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Сколько раз, за время выполнения скрипта, создаются экземпляры классов db и all? :)
    Оформите методы этих классов как статическимие. Намного удобнее писать:
    DB::query чем $this->db->query. Кроме того, хорошо бы лобавить методы в db_class типа select, insert, update, delete, чтобы не писать каждый раз SQL для простых запросов, и зставить эти методы автоматически ескейпить строки.
    Используйте массивы $_POST и $_GET, хотя бы потому, что они короче =)
    Подавление ошибок - дурной тон. Проверяйте директорию на возможность записи.
     
  5. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Мой ответ: ООП причем для веб или не для веб, не важно, интерфейс должен быть отделен от логики. Так что если хочешь развиваться читай Объектно ориентированный анализ и проектирование, а потом, когда большие программы станет тяжело сопровождать и развивать вспомни про МВЦ и акуеешь, как акуел в свое время я.

    А второй совет о том чего не надо делать: не надо сразу хвататься за сложные фреймворки, только потеряешь время.
     
  6. TheShock

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

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Не согласен, ибо, бывает, что переменная можетт прийти и через Гет, и через Пост.

    Тоже не совсем согласен с таким подходом, хотя он и используется в большинстве случаев. Иногда надо заескепить переменную, а иногда - проверить ctype_digit, ctype_xdigit и не делать запроса вообще, если данные неподходящие.

    С остальным согласен
     
  7. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Плохой подход

    Это должно делаться перед вызовом метода а не в нём
     
  8. apc

    apc Guest

    Экземпляры создаются один раз, в конструкторе.
    Насчет статических методов, согласен.
    Насчет массива реквест, переменная приходит как из гет так из пост.
     
  9. apc

    apc Guest

    Покажи как ты пишешь...
     
  10. apc

    apc Guest

    "читай Объектно ориентированный анализ и проектирование" - буду благодарен за ссылку на хорошую книгу или статьи
     
  11. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Г. Буч.

    ИМХО, хоть и не новая, лучше все равно никто не смог написать. А все остальное- все эти рефакторинги с умными названиями, и темплейты и МВЦ-ы, ORM-ы разные уже из нее вытекают. Все это не какие-то отдельные методики, а проверенные временем наработки ООП.

    Чего я бы не советовал делать, так это начинать с конца, то есть сначала хвататься за МВЦ-фреймворки и др. шаблоны и через них приходить к пониманию ООП.

    Еще из моего опыта это что UML слишком уж возвеличивают. Пока все это читается в книжке- все очень красиво. Но на практике почти неприменимо. Из всего UML самое полезное- диаграмма классов. Но и то, если только она генерируется автоматически из исходников. Если говорить про ПХП, то такое умеют только PDT и его преемники как Zend Studio и Aptana PHP еще вроде.

    Еще очень пригодятся МВЦ и Юнит тесты и PHPDoc-и. Это то, про что мне никто не рассказывал и чему меня никто не учил, но жизнь как говорится заставила. Еще откажись от местных кодировок и перейди сразу на UTF и пока вообще не обращай внимания на потребляемые ресурсы железа.

    UML, юнит тесты и МВЦ становятся нужны только на больших проектах. Это где- то начиная от 200-300 завязанных между собой собственных классов, то есть ни считая классов в библиотеках. Так что пока можно про них не думать. К PHPDoc-ам привыкай сразу. Они нужны как воздух.

    Если Буча не читал, я тебе советую умри но достань. так что вот. Ну а про ссылки, ссылки я тебе не дам, у меня их нет.
     
  12. apc

    apc Guest

    Хотелось бы увидеть примеры вашего кода
     
  13. kostyl

    kostyl Guest

    apc
    На форуме полно примеров его кода...
     
  14. apc

    apc Guest

    Я не прочь увидеть код нескольких опытных программистов
     
  15. kostyl

    kostyl Guest

    apc
    Заходи в решения и смотри, или ты не знаешь как?
     
  16. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    на форуме имеется в достаточном количестве.

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

    Во- первых сразу бросилось в глаза отсутствие PHPDoc-ов а вместо них #Начало класса, конструкт и какие-то полоски ///////////////////////////////// Это полная лажа. Но к счастью легко лечится. Я когда впервые сел на PHP после языков со строгой типизацией тоже так писал, но долго это не могло продолжаться, потому что без PHPDoc вообще не работает автокомплит!

    Во- вторых, первый файл- это у тебя чистый контроллер. Его осталось только оформить в виде класса.

    И в- третьих, про второй файл. Там у тебя получилось почти чистая модель, с небольшой примесью не пойми чего. Но это легко исправить. Поменяй все экхи '<H2><font color="red"><div align="center">Папка не создана!</div></font>' на throw new Exception("Папка не создана") и вуа ля ты получил чистую модель. В остальном очень даже чистый класс не смешанный с контроллером и вьюшкой.

    про @rename согласен, про $_GET и $_POST вместо $_REQUEST нет
     
  17. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    kostyl
    хех, спасибо, пока я писал ты уже ответил )
     
  18. apc

    apc Guest

    Учту вашу критику
     
  19. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Модуль авторизации в текущем проекте.
    Класс:
    PHP:
    1. <?php
    2. /**
    3.  * @name authintefication.inc
    4.  * @copyright Vasilii B. Shpilchin (2009)
    5.  * @package ****** (:
    6.  *
    7.  * Авторизация пользователя на сайте.
    8.  * Используйет memcached-сессии (класс memsess)
    9.  */
    10.  
    11. class auth
    12. {
    13.         public static $logged = false;
    14.         /**
    15.          * Попытка авторизации
    16.          *
    17.          * @param string $login
    18.          * @param string $password
    19.          * @return boolean
    20.          */
    21.         public static function try_login($login, $password)
    22.         {
    23.                 if (strlen($login) < 4)
    24.                 {
    25.                         return false;
    26.                 }
    27.                 if (strlen($password) < 4)
    28.                 {
    29.                         return false;
    30.                 }
    31.                 $where = array('name='=>$login, 'password='=>$password);
    32.                 $user = array();
    33.                 $res = DB::select('`id`', 'users', $where);
    34.                 $user = mysqli_fetch_array($res, MYSQLI_ASSOC);
    35.                 $success = isset($user['id']);
    36.                 if (!$success)
    37.                 {
    38.                         return false;
    39.                 }
    40.                 else
    41.                 {
    42.                         memses::set('__logged', 1);
    43.                         memses::set('__uagent', md5($_SERVER['HTTP_USER_AGENT']));
    44.                         memses::set('__id', $user['id']);
    45.                         memses::update();
    46.                         self::$logged = true;
    47.                         return true;
    48.                 }
    49.         }
    50.        
    51.         /**
    52.          * Проверка авторизации
    53.          *
    54.          * @return boolean
    55.          */
    56.         public static function check()
    57.         {
    58.                 if (!memses::check())
    59.                 {
    60.                         return false;
    61.                 }
    62.                 else
    63.                 {
    64.                         if (memses::get('__logged') === 1)
    65.                         {
    66.                                 $ip = memses::get('__ip');
    67.                                 $uagent = memses::get('__uagent');
    68.                                 $id = memses::get('__id');
    69.                                 if ($ip == $_SERVER['REMOTE_ADDR'] && $uagent == md5($_SERVER['HTTP_USER_AGENT']))
    70.                                 {
    71.                                         return $id;
    72.                                 }
    73.                         }
    74.                         return false;
    75.                 }
    76.         }
    77.        
    78.         /**
    79.          * Логаут
    80.          */
    81.         public static function logout()
    82.         {
    83.                 if (!memses::check())
    84.                 {
    85.                         self::$logged = false;
    86.                 }
    87.                 else
    88.                 {
    89.                         memses::set('__logged', 0);
    90.                         memses::del('__uagent');
    91.                         memses::del('__id');
    92.                         self::$logged = false;
    93.                 }
    94.         }
    95. }
    96. ?>
    Логика:
    PHP:
    1. <?php
    2. /**
    3.  * @name module.php
    4.  * @copyright Vasilii B. Shpilchin (2009)
    5.  * @package ****** (:
    6.  *
    7.  * Модуль авторизации (login)
    8.  */
    9.  
    10. require('./login/authintefication.inc');
    11.  
    12. if (isset($_POST['name']) && isset($_POST['password']))
    13. {
    14.         $_POST = SYS::escape($_POST);
    15.         if (auth::try_login($_POST['name'], $_POST['password']))
    16.         {
    17.                 SYS::go_to('home');
    18.                 die();
    19.         }
    20.         else
    21.         {
    22.                 include('./login/templates/incorrect_login.tpl');
    23.         }
    24. }
    25. include('./login/templates/form.tpl');
    26. ?>
     
  20. apc

    apc Guest

    Судить код я не могу, вроде хорошо написанно.
    Единственное стиль мне не нравиться
    Код (Text):
    1.  
    2. if (strlen($login) < 4)
    3.                  {
    4.                          return false;
    5.                  }
    6.                  if (strlen($password) < 4)
    7.                  {
    8.                          return false;
    9.                  }
    но, на вкус и цвет товарища нет[/code]
     
  21. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Всё уже придумано, вспомним Зенд
    PHP:
    1. <?
    2. set_include_path($_SERVER['DOCUMENT_ROOT']);
    3. function __autoload($name){
    4.    $name=strtolower($name);
    5.    if(!is_file($file="classes/{$name}.class.php")){
    6.        if(!is_file($file=str_replace("_","/",$name).'.class.php'){
    7.             trigger_error("Немогу загрузить $name",E_USER_ERROR);
    8.        }
    9.    }
    10.   incldue_once $file;
    11. }
    12. if($_GET['module_name']){
    13.   if(is_file("moduls/".basename($_GET['module_name']).".class.php")){
    14.        $module_name="Moduls_".$_GET['module_name'];
    15.        $class=new $module_name();
    16.        $_GET['module_name']=strtolwoer($_GET['module_name']);
    17.        if($_GET['action'] && method_exists($class,$act="Action".$_GET['action'])){
    18.             $_GET['action']=strtolower($_GET['action']);
    19.             $result=$class->$act();
    20.             $tplname=$_GET['module_name']."_".$_GET['action'].".tpl";
    21.        }else{
    22.             $result=$class->ActionIndex();
    23.             $tplname=$_GET['module_name']."_index.tpl";
    24.        }
    25.   }else print "Error Module Not Found";
    26. }else{
    27.   $class=new Moduls_Index();
    28.   $result=$class->ActionIndex();
    29.   $tplname="index_index.tpl";
    30. }
    31. if($result){
    32.   $tpl=new Tpl();
    33.   if(is_array($result) && !empty($result)) {
    34.      $tpl->Set($result);
    35.   }
    36.   print $tpl->Load($tplname);
    37. }
    38. ?>
    Module Example
    PHP:
    1. <?
    2. class Module_Name {
    3.     function ActionIndex(){
    4.         // return  array если хотим чтобы в шаблончик добавило переменные, return true чтобы просто показало шаблончик, return false; чтобы ничего не показало
    5.     }
    6.     function ActionSome(){
    7.        /* .... */
    8.    }
    9. }
    10. ?>
    Ps/ Код писал налету
     
  22. apc

    apc Guest

    Это уже лучше)) Но у меня пробелы стоят
    Код (Text):
    1. $var = $var2
    [/code]
     
  23. [vs]

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

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    При выполнении этого кода используются методы из четырех пользовательских классов, но не создается ни одного экземпляра - всё в статике. Эти классы - интерфейс, API, здесь не нужны объекты (экземпляры). С другой стороны, в модуле home для пользователя создается экземпляр класса user с соответствующими конкретному пользователю свойствами.
     
  24. apc

    apc Guest

    Нужно будет подучить философию
     
  25. alexey_baranov

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

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Раз так много людей хочет попонтоваться своим кодом, приходит в голову идея. Может отдельную тему создать, куда можно будет выложить свой код, чтобы другие могли сделать замечания. у?