Улучшение в MVC - представление модуля - 0 *


Это просто извлекает данные из MySQL и создает HTML-код, который будет отправлен страницы.

class view_html extends database
  {
  function __construct($type)
    {
    parent::__construct();    
    switch ($type) 
      {
      case "bookmraks":
        $this->bookmarks();
        break;
      case "tweets":
        $this->tweets();
        break;
      default:
        echo "Invalid View Type";
        break;
      }
    }
  private function bookmarks()
    {
    $email = $_SESSION['email'];
    $query_return = database::query("SELECT * FROM bo  WHERE email='$email' ORDER BY name ASC");
    while ($ass_array = mysqli_fetch_assoc($query_return))
      {
      $fav=$this->fav($ass_array['url']);
      echo "<img name=\"bo_im\" class=\"c\" src=\"$fav\"/ onerror=\"i_bm_err(this)\"><a target=\"_blank\" name = \"a1\" class = \"b\" href = \"$ass_array[url]\">$ass_array[name]</a>";
      }      
    }
  private function tweets() 
    {
    $query_return = database::query("SELECT * FROM tw ORDER BY time DESC LIMIT 7");
    $time = time();
    while ($a = mysqli_fetch_assoc($query_return))
      {
      echo  "<div class=\"Bb2b\"><img class=\"a\" src=\"p/$a[email].jpg\" alt=\"\"/><a class=\"a\" href=\"javascript:void(0)\">$a[fname] posted <script type=\"text/javascript\">document.write(v0($a[time],$time))</script></a><br/><p class=\"c\">$a[message]</p></div>";
      }
    }
  private function fav($url)     
    {    
    $pieces = parse_url($url);    
    $domain = isset($pieces['host']) ? $pieces['host'] : '';    
    if(preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs))       
      {     
      return $pieces['scheme'] . '://www.' . $regs['domain'] . '/favicon.ico';    
      }    
      return false;
    }
  }


214
2
php
задан 2 октября 2011 в 08:10 Источник Поделиться
Комментарии
2 ответа

Заменить все использования прямого значения.


Попробуйте назначение значений первых на имени переменной, а затем concating, поэтому его устойчивым в будущем, таких как:

return $pieces['scheme'] . '://www.' . $regs['domain'] . '/favicon.ico';  

может быть:

$protocol = $pieces['scheme'];
$domainName = $regs['domain'];
$faviconName = . '/favicon.ico';
$favIconLink = $protocol. '://www.' . $domainName . $faviconName
return $favIconLink;

Это позволит сделать его многоразовым и читаемым для других разработчиков, и это уменьшает комментариях ;-) на данный момент у вас их много

$fav=$this->fav($ass_array['url']);



Я люблю регулярные выражения, но раз написано, что никто не понимает его:

if(preg_match('/(?P<domain>[a-z0-9][a-z0-9\-]{1,63}\.[a-z\.]{2,6})$/i', $domain, $regs))  

я хотел бы добавить комментарий, который объясняет подробно, что это регулярное выражение предполагаю делать. Так что если есть проблема с регулярным выражением все могут проверить, если регулярное выражение делает его работа, или если есть проблема в выражении.

Бросать исключение в конструкторе, так что сообщение об ошибке может быть задержан. Теперь сообщение об ошибке отображается в frontcode.

function __construct($type)
{
parent::__construct();
switch ($type)
{
case "bookmraks":
$this->bookmarks();
break;
case "tweets":
$this->tweets();
break;
default:
throw new Exception('Invalid View Type');
}
}

Последнее, но не менее:

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

 '<div class="Bb2b"><img class="a" src="p/$a[email].jpg" alt=""/><a class="a" href="javascript:void(0)">$a[fname] posted <script type="text/javascript">document.write(v0($a[time],$time))</script></a><br/><p class="c">$a[message]</p></div>'

вместо :

 "<div class=\"Bb2b\"><img class=\"a\" src=\"p/$a[email].jpg\" alt=\"\"/><a class=\"a\" href=\"javascript:void(0)\">$a[fname] posted <script type=\"text/javascript\">document.write(v0($a[time],$time))</script></a><br/><p class=\"c\">$a[message]</p></div>"

1
ответ дан 2 октября 2011 в 09:10 Источник Поделиться

Я бы рефакторинг этот класс на подклассы для закладки, избранное, твиты. Затем в каждом подклассе, я бы с API похожи, может render_HTML. Затем я использовать исходный класс в качестве прокси для этих подклассов. Я бы также избежать отправки на HTML непосредственно от каждого класса, вместо того, чтобы вернуть HTML и использовать контроллер, чтобы установить переменную равную HTML-код для вашего просмотра страницы, или если вы не используете MVC в рамках выхода значения return_html напрямую с вашей точки зрения.

Теперь у нас есть " ОК " разделения проблем (можно взять его еще дальше и реферирование ваш доступ к базе данных, но мы не будем заходить так далеко здесь). Теперь вы можете также добавить новые виды для отображения довольно легко, без необходимости беспокоиться о нарушении своего класса смотреть, и вы можете делать другие вещи, с тех факторизовали классов вниз по дороге.

Вот некоторый код psudo о чем я говорю:

class view_html extends database
{
function __construct($type){
parent::__construct();

this->type = type;
}

function render_html(){
case "bookmraks":
$this->bookmarks->render_html();
break;
case "tweets":
$this->tweets->render_html();
break;
default:
echo "Invalid View Type";
break;
}
}
}

class bookmarks{
public function render_html(){
//query
//generate html in loop

return html;
}
}

class tweets{
public function render_html(){
//query
//generate html in loop

return html;
}
}

class fav{
public function render_html(){
public function render_html(){
//query
//generate html in loop

return html;
}
}
}

0
ответ дан 2 октября 2011 в 10:10 Источник Поделиться