Требуется мнение технического архитектора PHP - PullRequest
0 голосов
/ 19 ноября 2010

Пожалуйста, посмотрите на код ниже.

require_once("initvars.inc.php");
require_once("config.inc.php");

?>
<?php
if($latestads_count)
{
?>


<div class="latestposts">

<div class="head"><?php echo $lang['LATEST_ADS']; ?></div>


<table border="0" cellspacing="0" cellpadding="0"  class="postlisting" width="100%">


<?php
$sql = "SELECT a.*, ct.cityname, UNIX_TIMESTAMP(a.createdon) AS timestamp, feat.adid      AS isfeat,
            COUNT(*) AS piccount, p.picfile AS picfile, scat.subcatname, scat.catid, cat.catname
        FROM $t_ads a
            INNER JOIN $t_cities ct ON a.cityid = ct.cityid
            INNER JOIN $t_subcats scat ON a.subcatid = scat.subcatid
            INNER JOIN $t_cats cat ON scat.catid = cat.catid
            LEFT OUTER JOIN $t_featured feat ON a.adid = feat.adid AND feat.adtype = 'A' AND feat.featuredtill >= NOW()
            LEFT OUTER JOIN $t_adpics p ON a.adid = p.adid AND p.isevent = '0'
        WHERE $visibility_condn
            $loc_condn
        GROUP BY a.adid
        ORDER BY a.createdon DESC
        LIMIT $latestads_count";
$res_latest = mysql_query($sql) or die($sql.mysql_error());

$css_first = "_first";
while($row = mysql_fetch_array($res_latest))
{

    $url = buildURL("showad", array($xcityid, $row['catid'], $row['catname'], 
        $row['subcatid'], $row['subcatname'], $row['adid'], $row['adtitle']));


?>

    <?php 
    if($row['isfeat'])
    {
        //$feat_class = "class=\"featured\"";
        $feat_img = "<img src=\"images/featured.gif\" align=\"absmiddle\">";
    } 
    else 
    { 
        //$feat_class = "";
        $feat_img = "";
    }

    if($row['picfile']) 
    {
        $picfile = $row['picfile'];
        $imgsize = GetThumbnailSize("{$datadir[adpics]}/{$picfile}", $tinythumb_max_width, $tinythumb_max_height);
    }
    else 
    {
        $picfile = "";
    }
    ?>

    <tr>
        <td width="15">
        <img src="images/bullet.gif" align="absmiddle">
        </td>

        <td>
        <b><a href="<?php echo $url; ?>" <?php echo $feat_class; ?>><?php echo $row['adtitle']; ?></a></b> 
        <?php if(0&&$row['picfile']) { ?><img src="images/adwithpic.gif" align="absmiddle"><?php } ?>
        <?php echo $feat_img; ?><br>


        <span class="adcat">



        <?php echo "$row[catname] $path_sep $row[subcatname]"; ?>



        <?php 
        $loc = "";
        if($row['area']) $loc = $row['area'];
        if($xcityid < 0) $loc .= ($loc ? ", " : "") . $row['cityname'];
        if($loc) echo "<br>$loc";
        ?>             

        </span>



        </td>

        <td  align="right" width="<?php echo $tinythumb_max_width; ?>">
        <?php if($picfile) { ?>
        <a href="<?php echo $url; ?>"><img src="<?php echo "{$datadir[adpics]}/{$picfile}"; ?>" border="0" width="<?php echo $imgsize[0]; ?>" height="<?php echo $imgsize[1]; ?>" style="border:1px solid black"></a>
        <?php } ?>
        </td>

    </tr>

Это один из файлов кода из существующего проекта. Как видите, все html, sql, php смешаны вместе ... и, очевидно, их трудно поддерживать.

В этом приложении содержится около 55 файлов одинакового размера и типа.

Я хочу реорганизовать этот код, и ниже приведены мои цели для этого:

1) Простота обслуживания.

2) Возможность легко расширяться за счет добавления дополнительных функций.

3) Уметь повторно использовать этот код для разных, но несколько похожих приложений.

У меня есть ряд вопросов, основанных на вышеуказанных фактах:

1) Как вы думаете, мы можем преобразовать этот код в приложение MVC?

2) Если сможем. сколько времени потребуется для рефакторинга всего проекта (55 файлов), скажем, для опытного программиста?

3) Должен ли я повторно использовать приведенный выше код или я должен начать с нуля с существующей инфраструктурой MVC?

4) Сколько времени нам нужно, чтобы завершить весь проект, в случае, если мы перейдем на существующий фреймворк mvc, скажем, symfony, zend и т. Д .?

5) Этот сайт, насколько мне известно до сих пор, будет запускать только Mysql (так как текущий db выполняется в mysql). Если мы допустим использование абстракции данных / слоев доступа к данным в модели (предположим, что есть что-то, что работает лучше, чем Mysql, я не уверен в этом)

7) Можем ли мы легко реорганизовать код для включения подслоев для модели (абстракция / доступ к данным), представления (дополнительные шаблоны, логика представления и т. Д.), Контроллера и т. Д., Если мы хотим сделать это в будущем или нам нужно начинать с нуля?

8) Является ли mvc подходом или есть лучший шаблон / способ, чем он (если сайт предназначен для сотен тысяч пользователей)?

Ответы [ 2 ]

0 голосов
/ 19 ноября 2010
  1. Да.
  2. Я бы сказал, что для каждого файла такого размера требуется примерно час, чтобы все прошло гладко.Так что 1-2 недели кропотливой работы.
  3. Если это работает хорошо, просто пересмотрите.Если вы действительно хотите что-то новое, возьмите фреймворк.
  4. Существующий фреймворк, вероятно, займет больше времени для дублирования существующих функций (возможно, месяц).Однако в долгосрочной перспективе у вас будет более стабильное приложение (скорее всего).
  5. В MySQL нет ничего плохого.Используйте слой абстракции данных, если вы чувствуете, что захотите переключиться в будущем по какой-то другой причине.
  6. Нет причин, по которым вы не смогли бы выполнить повторный фактор.Я сделал это недавно, и это не так уж и сложно.
  7. MVC в значительной степени идеален.Тем не менее, есть много разных способов сделать MVC.Что-то хорошее, что-то лучше, что-то ужасное.
0 голосов
/ 19 ноября 2010

Я думаю, что нет такого понятия, как «приложение mvc», но шаблон mvc, безусловно, можно использовать в этом приложении. Вы можете создать некоторые классы данных, которые будут инкапсулировать различные запросы и преобразовывать результат в объект или массивы объектов. Класс контроллера может получить эти результаты и обработать их, а затем передать обработанные данные в определенный шаблон. Это mvc-подобная конструкция, которую довольно легко поддерживать. Я бы также создал несколько вспомогательных классов. Вы не хотите вызывать mysql_query везде, потому что, возможно, вам нужно будет использовать mysqli в следующем году, или, может быть, даже совершенно другую базу данных.

Итак, да, используйте шаблон mvc, но не только это. Рефакторинг всего кода. Используйте готовые библиотеки там, где можете (например, для абстракции базы данных), и потратили много времени на размышления о правильном пути, прежде чем начать сборку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...