За последние 24 часа нас посетили 47372 программиста и 1806 роботов. Сейчас ищут 1011 программистов ...

Учу ООП. Нужен совет.

Тема в разделе "PHP для новичков", создана пользователем alexander.pro, 4 апр 2009.

  1. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Доброго времени...
    У меня возникла необходимость в освоении ООП. Занимаюсь программирование на PHP - примерно год, тяжело переходить с процедурного кода на объектный. Эта моя первая, более-менее серьезная работа с ООП кодом. Если вам не трудно, прокомментируйте правильность.

    PHP:
    1.  
    2. <?PHP
    3.  class Voting{
    4.     private $filename;
    5.     private $answer;
    6.     private $data;
    7.     private $vote = Array();
    8.      public function GetAnswer($var1, $var2){
    9.       $this->filename = $var1; //Приравниваем значения функции к аргументам класса
    10.       $this->answer = $var2;
    11.         $file = fopen($this->filename,'r');
    12.         $this->data = fread($file, filesize($this->filename));
    13.         $this->vote = explode('-',$this->data);
    14.         fclose($file);
    15.      }
    16.  
    17.      public function CheckIP($var3){
    18.        $counter = count($this->vote);
    19.         if ($this->vote[$counter-1] !== $var3){
    20.             $this->vote[] = $var3;
    21.             $this->WriteAns();
    22.         }
    23.      }
    24.  
    25.  
    26.      private function WriteAns(){
    27.         $file = fopen($this->filename,'w');
    28.         $this->vote[$this->answer]++;
    29.         $this->data = fwrite($file, implode('-',$this->vote));
    30.         fclose($file);
    31.      }
    32.  
    33.      public function GetPrint($var3){
    34.       return $this->vote[$var3];
    35.      }
    36.  }
    37.  
    38. ?>
    39.  
    ЗАРАНЕЕ СПАСИБО!
     
  2. kostyl

    kostyl Guest

    "Присваиваем параметры функции свойствам(аргументам) класса"
     
  3. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    а чего на файлах а не БД?
     
  4. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    alexander.pro
    во-первых комменты бы написал...

    во-вторых - по-моему много "лишних" свойств...

    Например в методе GetAnswer, зачем там $this->data ? Почему не использовать обычную локальную переменную? ООП - это же не значит, что все переменные нужно делать свойствами... А то так можно и для циклов (переменная-счетчик) - использовать свойства
     
  5. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    и аргументы в методах... почему везде непонятное название $var1, $var2, $var3 ? Можно же дать более осмысленное название :)
     
  6. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    PHP:
    1.  
    2. <?php
    3. public function GetPrint($var3){
    4.        return $this->vote[$var3];
    5. }
    тоже как-то странно...

    Знаешь, ты напиши лучше законченный класс с комментариями :)

    А то по такой "половинке" нифига не поймешь :)
     
  7. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    ООП - это не внести все функции в класс и некоторые параметры сделать общими в виде свойств. Тут логика в том, чтобы вся логика была внутри класса. У меня стойкое ощущение, что куча логики вне этого класса, ну или не весь код. В любом случае сразу видно, что метод checkIP точно не нужен. Также как и остальные два :) Точнее, они точно не должны быть public.

    Ну и для начала, как уже сказал sylex, сделать вменяемые имена переменных и написать комментарии.
     
  8. Koc

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

    С нами с:
    3 мар 2008
    Сообщения:
    2.253
    Симпатии:
    0
    Адрес:
    \Ukraine\Dnepropetrovsk
    в моих поделках чаще всего паблик конструктор и метод show/process/run + какие-то установки типа setCount(5), setTemplate('folder/templare.htm');
     
  9. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Спасибо

    Всем спасибо большое. Скоро выложу комментарии.
     
  10. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Даже не знаю с чего начать...

    PHP:
    1.  
    2.      <?PHP
    3.       class Voting{
    4.          private $filename; //  Объявляю свойства класса (filename - имя файла answer - это вариант ответа)
    5.          private $answer;
    6.          private $vote = Array();
    7.            public function GetAnswer($filename, $answer){
    8.            $this->filename = $filename; // Присваиваем параметры функции свойствам класса
    9.            $this->answer = $answer;
    10.             $file = fopen($this->filename,'r'); // Открываю файл для получения статистики ответов
    11.             $data = fread($file, filesize($this->filename)); // Читаю каждую строку файла (по правде говоря она там одна)
    12.             $this->vote = explode('-',$data);// Разделяю строку ответов в массив
    13.             fclose($file); // Закрываю файл
    14.           }
    15.    
    16.         public function CheckIP($ip){ // Функция для определения IP
    17.           $counter = count($this->vote);
    18.             if ($this->vote[$counter-1] !== $ip){ // Если IP адрес голосующего  не совпадает с тем, что уже в файле
    19.                 $this->vote[$counter-1] = $ip; // Переписываем IP пользователя
    20.                 $this->WriteAns(); //Записываем в файл
    21.             }
    22.         }
    23.    
    24.    
    25.           private function WriteAns(){
    26.               $file = fopen($this->filename,'w');
    27.             $this->vote[$this->answer]++;
    28.             $this->data = fwrite($file, implode('-',$this->vote));
    29.             fclose($file);
    30.           }
    31.    
    32.         public function GetPrint($var3){
    33.           return $this->vote[$var3];
    34.           }
    35.      }
    36.    
    37.     ?>
    38.  

    PHP:
    1.  
    2. <?php
    3. require ('./voting.php');
    4.   $vote=new Voting();
    5.   $vote->GetAnswer('./db.dat',2);
    6.   $vote->CheckIP($_SERVER['REMOTE_ADDR']);
    7.   echo $vote->GetPrint(2);
    8. ?>
    9.  
    Содержание db.dat - "0-0-3-0-127.0.0.5"
     
  11. AlexGousev

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

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Начинать надо с основ: прочитать про инкапсуляцию. В приведенном классе ее нет.
    1. Инкапсулируем всю логику хранения данных о голосовавших в класс. Код, в котором используется этот класс не должен ни сном ни духом ведать о том, где и как все это хранится, как получается и как сохраняется. Почему? Да чтобы потом, когда данных станет много и возникнет необходимость использовать БД, мы делаем необходимые изменения в классе не затрагивая внешний код. Все как работало, так и работает: изменения только внутри одного класса.

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

    2. Убираем всякие параметры типа "2". Что такое "2"? Нет, я конечно, раскопаю и разберусь, откуда эта два взялась и почему, но на это уйдет время, много времени. Почему бы не переименовать это дело в answerIndex или что это там… Зачем вообще внешний код должен знать о каких-то индексах или номерах или что там обозначают эти цифры? Внешнему коду надо что: возможность голосовать и получить данные голосования. Все. Внешнему коду не интересно что там и как у вас внутри класса.

    3. Оставляем только нужные методы. Зачем нужен GetAnswer, который еще и не возвращает ничего, хотя начинается на get. Зачем нужен checkIP? В результате должно получится что-то вроде:
    PHP:
    1. <?php
    2. require ('./voting.php');
    3. $vote=new Voting();
    4. echo $vote->GetPrint();
    5. ?>
    А все проверки, загрузки необходимых файлов и т.п. пусть делаются внутри класса, тогда, когда они нужны.
     
  12. sylex

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

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    в дополнении примерчик - класс Пресс-центр - новости короче...
    PHP:
    1. <?
    2. class CPressCentre
    3. {
    4.  
    5.     /**
    6.      * Возвращает данные о публикации
    7.      *
    8.      * @param int $iID - ID публикации
    9.      * @param array $aParams - параметры
    10.      * @return array
    11.      */
    12.     public function GetOne($iID, $aParams = array())
    13.     {
    14.        
    15.     }
    16.  
    17.     /**
    18.      * Возвращает список публикаций
    19.      *
    20.      * @param array $aParams - параметры
    21.      * @param int $iLimit - количество на страницу
    22.      * @return array
    23.      */
    24.     public function GetList($aParams = array(), $iLimit = 10)
    25.     {
    26.        
    27.     }
    28.  
    29.     /**
    30.      * Удаляет выбранные публикации
    31.      *
    32.      * @param array $aIDs - массив ID публикаций
    33.      * @return bool
    34.      */
    35.     public function RemoveSelected($aIDs)
    36.     {
    37.        
    38.     }
    39.  
    40.     /**
    41.      * Добавляет публикацию
    42.      *
    43.      * @param array $aFields - поля
    44.      * @return bool
    45.      */
    46.     public function Add($aFields)
    47.     {
    48.         if (!$this->CheckFields) return false;
    49.     }
    50.  
    51.     /**
    52.      * Изменяет данные публикации
    53.      *
    54.      * @param int $iID - ID публикации
    55.      * @param array $aFields - поля
    56.      * @return bool
    57.      */
    58.     public function Update($iID, $aFields)
    59.     {
    60.         if (!$this->CheckFields) return false;
    61.     }
    62.    
    63.     /**
    64.      * Проверка полей
    65.      * Возвращает true если проверка прошла успешно
    66.      * @param array $aFields - поля
    67.      * @return bool
    68.      */
    69.     private function CheckFields($aFields)
    70.     {
    71.        
    72.     }
    73. }
    74. ?>
     
  13. alexander.pro

    alexander.pro Активный пользователь

    С нами с:
    11 июл 2008
    Сообщения:
    42
    Симпатии:
    0
    Адрес:
    Г. Кострома
    Спасибо.