За последние 24 часа нас посетили 17858 программистов и 1613 роботов. Сейчас ищут 1488 программистов ...

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

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

  1. Anonymous

    Anonymous Guest

    http://ru.wikipedia.org/wiki/Наследование_(программирование)

    Читаем, и думаем еще раз.

    Чисто как отсебятина: я бы сделал два раздельных класса, но по другим причинам. Почему - расскажу потом. Может быть. )
     
  2. Anonymous

    Anonymous Guest

    Нежней, еще нежней. ;)
     
  3. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    тогда (если предположить что "удаление зубов автогеном через анальное отверстие иногда может быть оправданным"(с)) класс работы работы со строкой урла должен наследовать общему классу работы со строками, а класс получения контента должен быть абсолютно отдельным и получать уже готовую строку. Но у меня многие классы наследуют класс для работы с мускулом, мне так удобней писать(обращаться к объектам работающим с БД) это по определению не верно?
     
  4. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    я плохо себе представляю как это выглядит в коде....
     
  5. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1. <?php
    2. class  A {
    3.     private $b;
    4.  
    5.     public function __construct() {
    6.         $this->b = new B();
    7.     }
    8. }
    9.  
    10. $a = new A();
     
  6. Anonymous

    Anonymous Guest

    По определению - нет, не верно. Это должно делаться по другому. Но мы вернемся к этому позже.
    это несколько крайность ) но идея верна.
     
  7. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    а, это не является неким препятствием в повторном использовании кода класса А?
     
  8. Anonymous

    Anonymous Guest

    Вот, один из примеровСергей привел. Я правда, предпочитаю передавать ссылку на обьект, ибо они у меня часто рулятся ServiceLocator-ом.

    Хорошо, рассмотрим пока твой класс, как класс работы с урлом.

    И мы приходим к http://ru.wikipedia.org/wiki/Инкапсуляция_(программирование)

    Прочитать, высказать мысли.
     
  9. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Горбунов Олег
    ну, похоже что инкапсуляция у меня в коде сделана ради самой инкапсуляции...
    и ещё мне кажеться что
    PHP:
    1.  
    2.         IF($last_h!=''){
    3.             $ger=$this->hostAndPage($host, $first_h, $last_h);//если он есть то это не "индексевая страница"
    4.  
    5.         }
    6.         ELSE{
    7.             $ger=$this->host($host, $first_h);//если нету то "индексавая"
    8.         }
    9.  
    очень не правильно. надо было разместить код этих методы в "блоках then" данного метода и "не пложить сущночтей сверх необходимого"?
     
  10. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Можно передавать объект B через конструктор. http://wiki.agiledev.ru/doku.php?id=ooa ... _injection
     
  11. Anonymous

    Anonymous Guest

    а где у тебя инкапсуляция? ;)

    Предлагаю в свете прочитанного породить «правильный» класс для работыс урлом ?
     
  12. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    а разве функция в классе не расматриваеться как инкапсуляция этой самой функции в класс? если нет, то как она выглядит на практике?...
     
  13. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1. class ChUrl{
    2.     private $url;
    3.     function __construct($url){//определяем что нам надо с ним сделать
    4.         $this->url=$url;
    5.         $http=strpos($this->url, "http://");// ищем есть ли ненужные элементы адреса
    6.         $www=strpos($$this->url, "www.");
    7.         IF ($http===false){//отмеряем длину строки которую нужно(если нужно) отрезать
    8.             //echo 1;
    9.             $h=0;
    10.         }
    11.         ELSE{
    12.             $h=7;
    13.         }
    14.         IF ($www===false){
    15.             $w=0;
    16.         }
    17.         ELSE{
    18.             $w=4;
    19.         }
    20.         $first_h=(0+$h)+$w;
    21.         IF($first_h!=0){
    22.             $this->cutUrl($first_h);
    23.         }
    24.         $last_h=strpos($this->url, "/"); //проверяем есть ли слешь
    25.         IF($last_h!=''){
    26.             $adress[0]=substr($this->url, 0, $last_h);
    27.             $adress[1]=substr($this->url, $last_h)
    28.         }
    29.         ELSE{
    30.             $adress[0]=substr($host, 0);
    31.             $adress[1]="/";
    32.         }
    33.         return $adress;
    34.  
    35.     }
    36.     function cutUrl($first_h){
    37.         $this->url=substr($this->url, $first_h);
    38.     }
    39.  
    40. }
    или я опять где-то не прав?
     
  14. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Вынеси весь код из конструктора в отдельный метод parse. В конструкторе оставь инициализацию переменной $url. Добавь методы get/setUrl.
     
  15. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Народ, посоветуйте хорошую книгу для изучения всяких там шаблонов проектирования и т. д. :)
     
  16. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Выше я давал 3 ссылки. Первые 2 как раз то, что нужно.
     
  17. Anonymous

    Anonymous Guest

    АААА! Фаулера привезут. Мистическим образом нашлась одна книга на складе.
     
  18. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    он должен возвращать $url или $this->url?
     
  19. Sergey89

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

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

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1.  
    2.         class ChUrl{
    3.          private $url;
    4.          function __construct($url){//определяем что нам надо с ним сделать
    5.              $this->url=$url;    
    6.         }
    7.     function parse(){
    8.         $http=strpos($this->url, "http://");// ищем есть ли ненужные элементы адреса
    9.              $www=strpos($$this->url, "www.");
    10.              IF ($http===false){//отмеряем длину строки которую нужно(если нужно) отрезать
    11.                  //echo 1;
    12.                  $h=0;
    13.             }
    14.             ELSE{
    15.                 $h=7;
    16.             }
    17.             IF ($www===false){
    18.                 $w=0;
    19.             }
    20.             ELSE{
    21.                 $w=4;
    22.             }
    23.               $first_h=(0+$h)+$w;
    24.               IF($first_h!=0){
    25.                   $this->cutUrl($first_h);
    26.               }
    27.             $last_h=strpos($this->url, "/"); //проверяем есть ли слешь
    28.             IF($last_h!=''){
    29.                 $adress[0]=substr($this->url, 0, $last_h);
    30.                 $adress[1]=substr($this->url, $last_h)
    31.               }
    32.             ELSE{
    33.                 $adress[0]=substr($host, 0);
    34.                 $adress[1]="/";
    35.             }
    36.         $this->url=$adress;
    37.     }
    38.     function setUrl($url){
    39.         $this->url=$url;
    40.     }
    41.     function getUrl{
    42.         return $this->url;
    43.     }
    44.         function cutUrl($first_h){
    45.             $this->url=substr($this->url, $first_h);
    46.         }
    47.    
    48.     }
    49.  
    а делать ретурн и фукции parse() не комильфо? и выше Олег говорил что ретурн надо делать везде, в таком случае функция getUrl($get) теряет смысл?...
    да и имеет ли смысл делать функцию cutUrl() private? и что она должна возвращать?...
     
  21. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    parse должна возвращать полученный адрес, а getUrl возвращать адрес, который был установлен.
     
  22. Sergey89

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

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

    PHP:
    1. function cutUrl($first_h){
    2.     return substr($this->url, $first_h);
    3. }
     
  23. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    PHP:
    1. <?php
    2. class ChUrl{
    3.     private $url;
    4.     private $geting_url
    5.     function __construct($url){//eустанавливаем занчения
    6.         $this->geting_url=$url;
    7.         $this->url=$this->geting_url;
    8.         IF($this->url==$this->geting_url AND $this->geting_url==$url) return "ok";
    9.     }
    10.     function parse(){//парсим
    11.         $http=strpos($this->url, "http://");// ищем есть ли ненужные элементы адреса
    12.         $www=strpos($$this->url, "www.");
    13.         IF ($http===false){//отмеряем длину строки которую нужно(если нужно) отрезать
    14.             $h=0;
    15.         }
    16.         ELSE{
    17.             $h=7;
    18.         }
    19.         IF ($www===false){
    20.                   $w=0;
    21.         }
    22.         ELSE{
    23.             $w=4;
    24.         }
    25.         $first_h=(0+$h)+$w;
    26.         IF($first_h!=0){
    27.             $this->url=$this->cutUrl($first_h);
    28.         }
    29.         $last_h=strpos($this->url, "/"); //проверяем есть ли слешь
    30.         IF($last_h!=''){
    31.             $adress[0]=substr($this->url, 0, $last_h);
    32.             $adress[1]=substr($this->url, $last_h)
    33.         }
    34.         ELSE{
    35.             $adress[0]=substr($host, 0);
    36.             $adress[1]="/";
    37.         }
    38.         $this->url=$adress;
    39.         return $this->url;
    40.     }
    41.     function setUrl($url){
    42.         $this->geting_url=$url;
    43.         $this->url=$this->geting_url;
    44.         IF($this->url==$this->geting_url AND $this->geting_url==$url) return "ok";
    45.     }
    46.     function getUrl{
    47.         return $this->geting_url;
    48.     }
    49.     private function cutUrl($first_h){//функция обрезания
    50.         return substr($this->url, $first_h);
    51.     }
    52.  
    53. }
    54.  
    я правильно уловил суть?
     
  24. GudGuy

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

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    да, и насчёт использование класса работы с БД в другиз классах? агрегированием или для этого случая есть какое-то иное решение?
     
  25. Anonymous

    Anonymous Guest

    Уже гораздо лучше )