2010-11-19 78 views
0

請看下面的代碼。需要來自PHP技術架構師的意見

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(因爲當前數據庫是在mysql中完成的)。我們應該允許模型中的數據抽象/數據訪問層(假設有比Mysql更好的表現,我不確定這一點)

7)我們是否可以輕鬆地重構代碼以包含子層模型(數據抽象/訪問),視圖(進一步模板,視圖邏輯等),控制器等等,以備將來使用,或者我們需要從頭開始?

8)是mvc的路要走,還是有一個比它更好的模式/方式(假設該網站的目的是成千上萬的用戶)?

回答

0
  1. 是的。
  2. 我會說大約每個文件一小時以確保一切順利。因此1-2周的紮實工作。
  3. 如果這個效果很好,只需重新考慮。如果你真的想要一些新的東西,就去抓一個框架。
  4. 現有框架可能需要更長時間才能複製現有功能(可能是一個月)。但是,從長遠來看,您將擁有更穩定的應用程序(很可能)。
  5. MySQL沒有錯。如果您因爲某些其他原因而希望將來切換,請使用數據抽象層。
  6. 你沒有理由不能重新考慮因素。我最近做了這件事,並不是那麼困難。
  7. MVC非常理想。也就是說,有很多不同的方式來做MVC。一些好,一些更好,一些可怕。
+0

偉大的傑夫,這是我一直在尋找的信息/答案...希望其他人也會分享他們的經驗。 – user481913 2010-11-19 19:45:29

+0

嗨,傑夫,謝謝....我想問你另一個問題......我想我會接受你的答案,同時指出你在我的下一個問題,我想你回答...但我猜我會在下次繼續保持這一點。 :) – user481913 2010-11-21 19:14:11

0

我認爲沒有像「mvc應用程序」那樣的東西,但mvc模式肯定可以在這個應用程序中使用。您可以構建一些數據類,以封裝各種查詢並將結果轉換爲一個或多個對象數組。控制器類可以獲取這些結果並進行處理,然後將處理後的數據提供給特定的模板。這是一個很容易維護的mvc結構。我也會建立一些輔助類。你不想在任何地方調用mysql_query,因爲你明年可能需要使用mysqli,或者甚至可能是完全不同的數據庫。

所以,是的,使用mvc模式,但不僅如此。重構整個代碼。在你可以使用的地方準備好使用庫(例如用於數據庫抽象),並且在開始構建之前花費很大的精力去思考正確的方法。

+0

是的,我明白philosphy ..我不知道你是否一般評論或有什麼特別與我的代碼有關(例如,你問我要封裝現有的SQL /查詢我的代碼到一個數據類或要求我從頭開始寫一個新的數據類)? – user481913 2010-11-19 19:32:35

+1

不要過頭了......那就是 - 不要搗毀可以很好使用的東西 - 例如,你可以拿一段代碼,在你的整個項目中多次使用,把它放到課堂上的一個函數中(不要改變它),並用一個調用類的方法來替換原始代碼的每個實例。然後,您可以在類方法中進行更改,並且不會要求您在任何地方執行此操作。另外,請注意保留哪些代碼,哪些不是。一種情況是,你有一個代碼包裝在很老的代碼上,而且所有的工作都是很棒的,可能會經常發生。 – 2010-11-19 19:42:22

+1

是的,我看了你的代碼。它看起來很像我爲自己的網站設計的代碼。我將該代碼重新編寫爲基本上4個不同的層。 1.可以執行參數化查詢並將結果返回到二維數組的數據庫類; 2.封裝特定於網站的查詢(使用數據庫類)的查詢類。 3.一個模板類,它接受數據並將其放入模板(template = dumb php,只輸出變量和html); 4.包含邏輯的類將所有數據放在一起。現在這只是一個愛好網站,但它也可能適合你。 – GolezTrol 2010-11-19 20:29:26