Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум (новые сообщения вниз) Структурный форум

тема: Проблемные места в коде

Сообщения:  [1-5] 

 
 автор: magic   (11.11.2010 в 00:37)   письмо автору
 
   для: Лена   (10.11.2010 в 22:44)
 

Спасибо, головой то можно подумать, но код не мой мне дали его проработать. Но честно просто нет уже сил и я не на столько хорошо пока разбираюсь, что бы это сделать быстро как Вы. Поэтому попросил помощи.

  Ответить  
 
 автор: Лена   (10.11.2010 в 22:57)   письмо автору
 
   для: psychomc   (10.11.2010 в 22:52)
 

тут полиморфизм не подойдет, слишком много классов-наследников может быть... Форматов же даты можно сколько угодно штамповать. Я ниже поправилась, нашла оптимальней вариант - просто передавать в метод динамический формат.

  Ответить  
 
 автор: psychomc   (10.11.2010 в 22:52)   письмо автору
 
   для: Лена   (10.11.2010 в 22:44)
 

не смотрел код
>Вообще-то мне эти классы с датой не очень нравятся. Зачем создавать ради конвертирования даты целый класс...

полиморфизм, при правильном проектировании позволяет избавлять код от условных операторов и делает его более прозрачным

  Ответить  
 
 автор: Лена   (10.11.2010 в 22:44)   письмо автору
 
   для: magic   (10.11.2010 в 16:41)
 

Ищите различия

<?php
abstract class dateUtil{
static function 
a1();
}

class 
dateUtil1 extends dateUtil{
  static function 
a1($timestampDate) {
    return 
date('d.m.Y'$timestampDate);
  }
}

class 
dateUtil2 extends dateUtil{
  static function 
a1($timestampDate) {
    return 
date('d/m/Y'$timestampDate);
  }
}

class 
dateUtil3 extends dateUtil{
  static function 
a1($timestampDate) {
    return 
date('m/d/Y'$timestampDate);
  }
}

class 
dateUtil4 extends dateUtil{
  static function 
a1($timestampDate) {
    return 
date('d/m/Y'$timestampDate);
  }
}

class 
dateUtil4 extends dateUtil{
  static function 
a1($timestampDate) {
    return 
date('Y-m-d'$timestampDate);
  }
}

abstract class 
cityUtil{
static function 
get_nice_city_id();
}

class 
cityUtil1 extends cityUtil{
  static function 
get_nice_city_id($id) {
    return 
$id 2// Процедура конвертирования кода города из нашего в формат nice-weather.com.
  
}
}

class 
cityUtil2 extends cityUtil{
  static function 
get_nice_city_id($id) {
    return 
$id 3// Процедура конвертирования кода города из нашего в формата в другой формат ...
  
}
}

    
/**
   * здесь - коммент, чем занимается класс и какая от него польза :)
   */
class WeatherTaker{
    
  const 
TYPE_BEST_WEATHER_COM 1;
  const 
TYPE_NICE_WEATHER_COM 2;
  const 
TYPE_NO_MORE_RAIN_NET 3;

    
/**
   * здесь должен быть коммент, что содержит это приватное свойство
   * @var string
   */
   
  
private $_type;
  
  function 
__construct($type) {
    
$this->_type $type;
  }

  
/**
   * Возвращает температуры за указанный период.
       * @param string $city
       * @param string $fromDate - YYYY-MM-DD
       * @param string $to_date - YYYY-MM-DD
   **/
  
function get_temperatures($city$fromDate$to_date) {
    global 
$USER;
             
    for(
$date strtotime($fromDate); $date <= strtotime($to_date); $date strtotime('+1day'$date)) {
      switch(
$this->_type) {
        case 
self::TYPE_BEST_WEATHER_COM:
          
$url 'http://best-weather.com/?date=' dateUtil3::a1($date) . '&city=$city';
          if(
$_GET['night'])
            
$url .= '&night=1';
          
$result file_get_contents($url);
          
$temperature = .... // Разбор температуры опущен для краткости
          
break;
        case 
self::TYPE_NICE_WEATHER_COM:
          
$url 'http://nice-weather.com/?date=' .dateUtil2::a1($date) . "&cityId={cityUtil1::get_nice_city_id($city)}";
          if(
$_GET['night'])
            
$url .= '&night=1';
          
$result file_get_contents($url);
          
$temperature = .... // Разбор температуры опущен для краткости
          
break;
        case 
self::TYPE_NO_MORE_RAIN_NET:
          
$url 'http://no-more-rain.net/?date=' dateUtil4::a1($date) . '&cityId=$city';
          if(
$_GET['night'])
            
$url .= '&night=1';
          
$result file_get_contents($url);
          
$temperature = .... // Разбор температуры опущен для краткости
          
break;
      }
      
      if (
$USER->likesCelsius)
         
$temperature convertToCelcius($temperature);
      
$result[] = array('date' => $this->a1($date), 'temperature' => $temperature);
    }
    return 
$result;
  }


  function 
getWind($city$fromDate$toDate) {
    
// ....
  
}
}

?> 


Делала быстро, могла где-то ошибиться.
Не понятно, зачем global $USER; - обычно такое держат в объектах реестра.
И не понятно, как вам пришло в голову class WeatherTaker extends date_util
Даже если ничего не разбираться в программировании, можно подумать хотя бы головой. У вас погода и дата. Какое понятие уже, а какое обширней? И которое из них использует другое?

Вообще-то мне эти классы с датой не очень нравятся. Зачем создавать ради конвертирования даты целый класс...
Вообще-то лучше наверное создать для даты один класс, как у вас и было:
class dateUtil1{
  static function a1($format,$timestampDate) {
    return date($format, $timestampDate);
  }
}

и передавать в метод нужный формат.
Например, dateUtil1::a1('d/m/Y',$timestampDate);

И точно так же с class cityUtil1

  Ответить  
 
 автор: magic   (10.11.2010 в 16:41)   письмо автору
 
 

Помогите разобраться. Ниже приводится фрагмент кода, который предназначен для опроса сайтов погоды и получения различных характеристик погоды. В этом коде есть много проблем (порядка 15-20, но это наверняка не все), проблемы самые разные, серьёзные и не очень. Что вам не нравится в этом коде? Как это можно исправить

<?php
class date_util {
  function 
a1($timestampDate) {
    return 
date('d.m.Y'$timestampDate);
  }

  function 
get_nice_city_id($id) {
    return 
$id 2// Процедура конвертирования кода города из нашего в формат nice-weather.com.
  
}
}

class 
WeatherTaker extends date_util {
  const 
TYPE_BEST_WEATHER_COM 1;
  const 
TYPE_NICE_WEATHER_COM 2;
  const 
TYPE_NO_MORE_RAIN_NET 3;

  private 
$_type;
  function 
__construct($type) {
    
$this->_type $type;
  }

  
/**
   * Возвращает температуры за указанный период.
   * Даты на вход задаются в формате YYYY-MM-DD.
   **/
  
function get_temperatures($city$fromDate$to_date) {
    global 
$USER;
    for(
$date strtotime($fromDate); $date <= strtotime($to_date); $date strtotime('+1day'$date)) {
      switch(
$this->_type) {
        case 
self::TYPE_BEST_WEATHER_COM:
          
$url 'http://best-weather.com/?date=' date('m/d/Y'$date) . '&city=$city';
          if(
$_GET['night'])
            
$url .= '&night=1';
          
$result file_get_contents($url);
          
$temperature = .... // Разбор температуры опущен для краткости
          
break;
        case 
self::TYPE_NICE_WEATHER_COM:
          
$url 'http://nice-weather.com/?date=' date('d/m/Y'$date) . "&cityId={$this->get_nice_city_id($city)}";
          if(
$_GET['night'])
            
$url .= '&night=1';
          
$result file_get_contents($url);
          
$temperature = .... // Разбор температуры опущен для краткости
          
break;
        case 
self::TYPE_NO_MORE_RAIN_NET:
          
$url 'http://no-more-rain.net/?date=' date('Y-m-d'$date) . '&cityId=$city';
          if(
$_GET['night'])
            
$url .= '&night=1';
          
$result file_get_contents($url);
          
$temperature = .... // Разбор температуры опущен для краткости
          
break;
      }
      if (
$USER->likesCelsius)
         
$temperature convertToCelcius($temperature);
      
$result[] = array('date' => $this->a1($date), 'temperature' => $temperature);
    }
    return 
$result;
  }

  function 
getPresure($city$fromDate$toDate) {
    for(
$date strtotime($fromDate); $date <= strtotime($to_date); $date strtotime('+1day'$date)) {
      switch(
$this->_type) {
        case 
self::TYPE_BEST_WEATHER_COM:
          
$url 'http://best-weather.com/?type=presure&date=' date('m/d/Y'$date) . '&city=$city';
          
$result file_get_contents($url);
          
$presure = .... // Разбор давления опущен для краткости
          
break;
        case 
self::TYPE_NICE_WEATHER_COM:
          
$url 'http://nice-weather.com/?type=presure&date=' date('d/m/Y'$date) . "&cityId={$this->get_nice_city_id($city)}";
          
$result file_get_contents($url);
          
$presure = .... // Разбор давления опущен для краткости
          
break;
        case 
self::TYPE_NO_MORE_RAIN_NET:
          
$url 'http://no-more-rain.net/?type=presure&date=' date('Y-m-d'$date) . '&cityId=$city';
          
$result file_get_contents($url);
          
$presure = .... // Разбор давления опущен для краткости
          
break;
      }
      
$result[] = array('date' => $this->a1($date), 'presure' => $presure);
    }
    return 
$result;
  }

  function 
getWind($city$fromDate$toDate) {
    
// ....
  
}
}

?>


----------------------------------------------------------------
Честно сказать это тестовое задание. Уже на столько ответил вопросов, "хавайся". Помогите с этим заданием. Для меня здесь работы "не фига себе".

  Ответить  

Сообщения:  [1-5] 

Форум разработан IT-студией SoftTime
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования