2010-11-19 7 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> 

これは、既存のプロジェクトからコードファイルの1つです。あなたが見ることができるように、それはhtml、sql、phpをすべて混在させています...そして明らかに維持することは難しいです。

このアプリケーションには、類似のサイズとタイプのファイルが約55あります。

私はこのコードをリファクタリングしたい、と以下のように行うための私の目標です:保守が容易)

1。

2)追加機能を追加することで簡単に拡張できます。

3)異なるが多少類似したアプリケーションにこのコードを再利用できるようにする。

私は上記の事実に基づいて、質問の数があります

1)あなたは、我々は、MVCアプリケーションにこのコードをリファクタリングすることができると思いますか?

2)できる場合。プロジェクト全体(55ファイル)をリファクタリングするのにどれくらいの時間が必要ですか?

3)私は上記のコードを再利用するか、既存のmvcフレームワークを使用して最初から開始すべきですか?

4)symfonyやzendなど、既存のmvcフレームワークを使用する場合、プロジェクト全体を完了するまでにどれくらいの時間が必要ですか?

5)私の知る限りでは、現在のサイトはmysqlのみを実行します(現在のdbはmysqlで実行されるため)。モデルのデータ抽象化/データアクセスレイヤーを許すべきか(Mysqlより優れた性能があるとすれば、これについてはわかりません)

7)私たちは簡単にサブレイヤーを含むコードをリファクタリングできますか?モデル(データ抽象化/アクセス)、ビュー(さらなるテンプレート、ビューロジックなど)、コントローラなど、我々が将来的にそれをしたい場合、

8)mvcは行く方法ですか、それよりも優れたパターン/方法があります(サイトが何十万人ものユーザーを対象としているとします)。

答えて

0
  1. はい。
  2. すべてのファイルがスムーズに流れるように、そのサイズのファイルにつき約1時間と言います。 1-2週間の頑強な作業。
  3. これがうまくいく場合は、再因子化するだけです。あなたが本当に何か新しいものを望むなら、フレームワークをつかんでください。
  4. 既存のフレームワークは、既存の機能(おそらく1ヶ月)を複製するのに、おそらく時間がかかります。しかし、あなたは長期的に(おそらく)より安定したアプリケーションを持つでしょう。
  5. MySQLには何も問題ありません。他の何らかの理由で将来的に切り替えると思われる場合は、データ抽象レイヤーを使用してください。
  6. あなたが再因子化できない理由はありません。私はこれを最近やったことはそれほど難しいことではありません。
  7. MVCはかなり理想的です。つまり、MVCを行うにはさまざまな方法があります。いくつかの良い、いくつかの素晴らしい、いくつかひどい。
+0

偉大なジェフ、それは私が探していた情報/答えのようなものです...うまくいけば、他の人たちも経験を共有してくれるはずです。 – user481913

+0

こんにちはジェフ、ありがとう....私はあなたに別の質問をしたいと思っていました...そして、私はあなたの答えを受け入れてくれると思っていました。私は次回のためにそれを保つつもりです。 :) – user481913

0

「mvcアプリケーション」のようなものはありませんが、このアプリケーションではmvcパターンを確実に使用できます。さまざまなクエリをカプセル化し、その結果をオブジェクトまたはオブジェクトの配列に変換するデータクラスを構築できます。コントローラクラスは、これらの結果を取得して処理し、処理されたデータを特定のテンプレートに供給することができます。それはメンテナンスが非常に簡単なmvcのような構造です。ヘルパークラスもいくつかビルドします。 mysql_queryはどこでも呼びたくはありません。おそらく来年mysqliを使う必要があるかもしれないし、まったく別のデータベースかもしれないからです。

だから、はい、mvcパターンを使用しますが、それだけではありません。コード全体をリファクタリングします。できるだけ早くデータベース抽象化のためにライブラリを使用して、ビルドを開始する前に正しい方法を考えてください。

+0

はい、私はphilosphyを理解しています。あなたが一般的なコメントをしているか、具体的に何か私のコードに関連するものがあるかどうかはわかりません(例えば、元のSQL /私のコードをデータクラスに入れたり、最初から新しいデータクラスを書くように頼んだりしていますか?) – user481913

+1

それをやりすぎてはいけない...それは、うまく使えるものをゴミ箱に入れないでください。たとえば、コードを取り、プロジェクト全体で何度も使用したり、クラス内の関数に入れたりできますそれを変更する)、元のコードのすべてのインスタンスをクラスのメソッドの呼び出しで置き換えます。その後、クラスメソッドの変更を行うことができますし、どこにでも行う必要はありません。また、どのコードを保存するか注意してください。 VERY古いコードにコードが詰まっていて、すべてがまっすぐ動作している状況が頻繁に起こる可能性があります。 –

+1

はい私はあなたのコードを見ました。私自身のウェブサイトのコードとよく似ています。私はそのコードを基本的に4つの異なるレイヤーに書き換えました。 1.パラメータ化されたクエリを実行し、結果を2次元配列に返すデータベースクラス2. Webサイト固有のクエリをカプセル化するクエリクラス(データベースクラスを使用) 3.データを取り込んでテンプレートに入れるテンプレートクラス(テンプレート=変数とHTMLだけを出力するdumb php)4.すべてをまとめるロジックを含むクラス。今はちょうど趣味のウェブサイトですが、あなたにも十分かもしれません。 – GolezTrol

関連する問題