За последние 24 часа нас посетили 17902 программиста и 1614 роботов. Сейчас ищут 1427 программистов ...

правильное ООП

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

  1. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    у меня есть класс который работает, и я имдаже парой пользуюсь. Но!
    Есть у меня стойкое ощущение, что всвязи не знания мною ООП(верней крайне плохого знания его синтаксиса и принципов) этот класс напоминает генетического уродца. вот собственно он сам:
    PHP:
    1. <?
    2. class Soc{
    3.  
    4.     private static $c_r=0; //счётчик редиректов
    5.     public static $max_r=2; //максимальное кол-во разрешённых редиректов
    6.  
    7.  
    8.     function construct($url){
    9.         $fuuu=$this->oprAdress($url);
    10.         return ($fuuu);
    11.     }
    12.     function oprAdress($url){// удаляем не нужные элементы если пользователь их ввёл
    13.         $http=strpos($url, "http://");// ищем есть ли ненужные элементы адреса
    14.         $www=strpos($url, "www.");
    15.  
    16.         IF ($http===false){//отмеряем длину строки которую нужно(если нужно) отрезать
    17.             //echo 1;
    18.             $h=0;
    19.         }
    20.         ELSE{
    21.             $h=7;
    22.         }
    23.         IF ($www===false){
    24.             $w=0;
    25.         }
    26.         ELSE{
    27.             $w=4;
    28.         }
    29.  
    30.         $first_h=(0+$h)+$w;
    31.         $host=substr($url, $first_h); // удаляем не нужные элементы если пользователь их ввёл
    32.         $last_h=strpos($host, "/"); //проверяем есть ли слешь
    33.  
    34.         IF($last_h!=''){
    35.             $ger=$this->hostAndPage($host, $first_h, $last_h);//если он есть то это не "индексевая страница"
    36.  
    37.         }
    38.         ELSE{
    39.             $ger=$this->host($host, $first_h);//если нету то "индексавая"
    40.         }
    41.         $e=$ger;
    42.         return $ger;
    43.     }
    44.     function hostAndPage($host, $first_h, $last_h){//подготовка к получение контента с "не индексовой" страницы
    45.         $adress[0]=substr($host, 0, $last_h);
    46.         $adress[1]=substr($host, $last_h);
    47.         $f=$this->getCon($adress);
    48.         return $f;
    49.     }
    50.     function host($host, $first_h){ //подготовка к получение контента с "индексовой" страницы
    51.         $adress[0]=substr($host, 0);
    52.         $adress[1]="/";
    53.         $f=$this->getCon($adress);
    54.         return $f;
    55.     }
    56.     function getCon($adress){//получение контента
    57.         //print_r($adress);
    58.         $fp = fsockopen($adress[0], 80, $errno, $errstr, 30);
    59.         IF (!$fp) {
    60.             echo "$errstr ($errno)<br />\n";
    61.         }
    62.         ELSE {
    63.             $out.= 'GET '.$adress[1].' HTTP/1.1'."\r\n";
    64.             $out.= 'Host: '.$adress[0]."\r\n";
    65.             $out.= 'Connection: Close'."\r\n\r\n";
    66.             fwrite($fp, $out);
    67.             WHILE (!feof($fp)) {
    68.                 $zagolov.=fgets($fp, 128);
    69.                 IF (strpos($zagolov,"\r\n\r\n")){
    70.                     break;
    71.                 }
    72.             }
    73.             WHILE (!feof($fp)) {
    74.                 $htm.=fgets($fp, 128);
    75.             }
    76.             fclose($fp);
    77.  
    78.         }
    79.         IF(strpos($zagolov, "Location:") AND Soc::$max_r!=0 AND Soc::$c_r<=Soc::$max_r-1){//есть-ли ридерект
    80.             Soc::$c_r=Soc::$c_r+1;
    81.             $q=$this->redUrl($zagolov);
    82.             return $q;
    83.         }
    84.         ELSE {
    85.  
    86.             return array($zagolov, $htm);
    87.         }
    88.  
    89.     }
    90.      function redUrl($zag){ //отлов ридеректа
    91.         $start=strpos($zag, "Location");
    92.         $start=$start+10;
    93.         $url=substr($zag, $start);
    94.         $end=strpos($url, "\r\n");
    95.         $url=substr($url, 0, $end);
    96.  
    97.         $k=$this->oprAdress($url);
    98.         return $k;
    99.  
    100.     }
    101. }
    не могли бы вы, уважаемые комрады по форуму, напримере этого безобразия показать к правельно стоит писать классы? Буду премного благодарен=)
     
  2. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    GudGuy
    Если весь этот класс предназначен только для того, чтобы по URL получить содержимое со стороннего сервера, но я бы это сделал через cURL и не мучил бы ООП вовсе. Там есть и опция для следования по редиректам, и для максимального количества редиректов.
    В данном конкретном случае ООП тут ни к чему. Это тянет максимум на обычную функцию: function site_get_contents($address) ;)
     
  3. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Dagdamor
    спасибо, изучу на досуге=) но сейчас меня интересует именно сторона ООП=) был бы очень благодарен за критику и советы как лучше=)
     
  4. Dagdamor

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

    С нами с:
    4 фев 2006
    Сообщения:
    2.095
    Симпатии:
    1
    Адрес:
    Барнаул
    GudGuy
    Тогда мой совет таков: не использовать ООП там, где оно заведомо не нужно.
     
  5. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Dagdamor
    основной приченой таких издевательств был подсчёт ридеректов, и гибкость=)
    самого меня несколько беспокоет то что он построен так, что в каждой функции приходиться делать ретун, мне кажеться это не совсем верным....
     
  6. Anonymous

    Anonymous Guest

    Напротив, я бы сказал, что ЛЮБАЯ функция должна что нибудь возвращать, пусть даже null
     
  7. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Горбунов Олег
    спасибо.
    кстати, может есть хороший мануаль по ООП? или книжка? чтоб учили не только стрелочки ставить, но и правильно проектировать? или настоящий программист должен сам до всего дойти методом проб и ошибок?
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
  9. Anonymous

    Anonymous Guest

  10. Anonymous

    Anonymous Guest

    А по факту - у тебя не ООП, а набор функций в неймспейсе ) Да и не очень понятно, зачем у тебя намешаны статические вызовы с динамическими...
     
  11. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Sergey89 и Горбунов Олег
    Спасибо, а они не крутоваты Особена та, что вам, Олег, привезти должны?
     
  12. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    вот тут-то я и перестаю вас понимать=)
     
  13. Anonymous

    Anonymous Guest

    Предлагаю отойти на время от особенностей реализации, и прочесть http://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование

    А потом взглянуть заново на свой класс, и задать появившиеся вопросы, как тебе?
     
  14. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    ок, но скорее всего уже завтра=(
     
  15. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Оставь заявку, скорее всего, в продаже ещё появится. Книга кстати классная, но перевод хромает.
     
  16. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    А у меня есть "Рефакторинг", только, видимо, рано купил, не могу пока оценить её, видимо из-за отсутствия опыта. :-\
     
  17. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    Нет такого понятия как "правильное ООП", нужно просто научиться граматно проектировать инфосистемы !

    Насчёт книжек - прочёл штук 10 по J2SE/J2EE, ничего кроме "+" я от этого не получил, да и намного проще познать азы ООП, когда пишешь на полнофункциональном объектно-ориентированном языке. J2EE и прилагающие это вообще кладезь идей и реализаций фреймворков для корпоративных приложений. Будет трудно, но в общеобразовательных целях - советую.
     
  18. lexa

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

    С нами с:
    22 июл 2007
    Сообщения:
    1.746
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    Не хочу устраивать войнушку религиозную, но ты решил, что Java полнофункциональном ООП язык потому что всё в нём нужно пихать в классы? :roll:
     
  19. Amian

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

    С нами с:
    15 мар 2007
    Сообщения:
    189
    Симпатии:
    0
    lexa
    Он был изначально спроектирован как объектно-ориентированный язык и это ФАКТ :) В холиворах я не участвую , у каждого языка есть свои плюсы и минусы и где и когда какой "инструмент" лучше использовать - личное дело каждого.
     
  20. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Горбунов Олег
    почитал... и почитал кое что ещё... в голове конечно прояснилось, но не так что б очень...
    о своём классе я могу сказать что это извращённый способ разделения кода используемого при выполнение различных условий(тогда мне казалось что для этого ООП и сделан, ныне я понимаю что его возможности ГОРАЗДА шире). а вот про статические и динамические вызовы я не нашёл, только про данные....
     
  21. Anonymous

    Anonymous Guest

    GudGuy, ок. Начнем с того, что обьект должен преставлять собой какую либо однозначную сущность. Какую сущность представляет собой твой объект? Или какую должен представлять?
     
  22. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Горбунов Олег
    он представляет собой некий чёрный ящик в который вводим урл, получаем содержимое страницы. Так же в нём есть ограничение по кол-ву ридерктов с одного адреса(на которое можно влиять снаружи класса). При этом ему обсолютно всё равно как именно был записан адрес... хотя что-то мне подсказывает что это лирика...
     
  23. Anonymous

    Anonymous Guest

    Почти. Но близко. Смотри, у тебя объект «размазан» между двумя действиями: подготовкой урла и получением страницы.
    Т.е. сущностей должно быть две: «получатель страниц» и «разборщик урлов», правильно?
    Подумай, как лучше сделать - разделить на два независимых обьекта, или расширить один - другим за счет наследования? Если наследовать, то кого от кого?
     
  24. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    ну, логичней создать класс работующий со строками, в том числе и с уралми, а от него наследовать классу получающему контент. Мне кажеться что потомок должен быть более "узким" чем родитель
     
  25. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    В данном случае, заменой наследования является агрегирование.