2010-11-19 2 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 프레임 워크를 사용하는 경우에 대비하여 전체 프로젝트를 완료하는 데 얼마의 시간이 필요합니까?

5)이 사이트는 현재까지 MySQL이 MySQL을 실행하기 때문에 (mysql에서 현재 db가 완료됨에 따라) 모델에서 데이터 추상화/데이터 액세스 레이어를 허용해야합니까? (Mysql보다 성능이 좋다고 가정하면이 점에 대해 확실하지 않습니다.)

7) 하위 레이어를 포함하도록 코드를 쉽게 리팩토링 할 수 있습니까? 모델 (데이터 추상화/액세스),보기 (추가 템플릿, 논리보기 등), 컨트롤러 등을 포함 할 수 있습니다.

8) mvc는 갈 길이 멀지 만 (사이트가 수십만 명의 사용자를 대상으로한다고 가정 할 때)보다 나은 패턴/방법이 있습니까?

답변

0
  1. 예.
  2. 나는 모든 것이 원활하게 진행되도록하기 위해 그 크기의 파일 당 약 1 시간이라고 말할 것입니다. 따라서 1-2 주 동안의 탄탄한 작업.
  3. 잘 작동하면 그냥 다시 입력하십시오. 정말로 새로운 것을 원하면 프레임 워크를 잡으십시오.
  4. 기존 프레임 워크는 기존 기능 (아마도 한 달)을 복제하는 데 더 오래 걸릴 것입니다. 그러나 장기적으로는 더 안정적인 응용 프로그램을 사용할 수 있습니다.
  5. MySQL에는 아무런 문제가 없습니다. 다른 이유로 인해 전환하려는 경우 데이터 추상화 레이어를 사용하십시오.
  6. 다시 요인을 결정할 이유가 없습니다. 나는 이것을 최근에했는데 그렇게 어려운 것은 아닙니다.
  7. MVC는 꽤 이상적입니다. 즉, MVC를 수행하는 데는 여러 가지 방법이 있습니다. 좋은 일도 있고, 좋을 수도 있고, 끔찍한 일이 있습니다.
+0

위대한 제프, 그건 내가 찾던 정보/대답 ... 친절하게도 다른 사람들도 경험을 공유 할 것입니다. – user481913

+0

안녕하세요 제프, 감사합니다 .... 나는 당신에게 또 다른 질문을하고 싶었습니다 ... 그리고 나는 당신이 내 다음 질문을하는 동안 당신의 대답을 받아 들일 것이라고 생각했습니다. 나는 당신이 대답 해주기를 바랍니다 ...하지만 나는 생각합니다. 나는 다음 번에 그것을 지킬거야. :) – user481913

0

"mvc 응용 프로그램"과 같은 것은 없지만 mvc 패턴은이 응용 프로그램에서 확실히 사용할 수 있습니다. 다양한 쿼리를 캡슐화하고 결과를 객체 또는 객체 배열로 변환하는 데이터 클래스를 작성할 수 있습니다. 컨트롤러 클래스는 이러한 결과를 가져 와서 처리 한 다음 처리 된 데이터를 특정 템플릿에 공급할 수 있습니다. 그것은 유지하기 아주 쉬운 구조와 같은 MVC입니다. 헬퍼 클래스도 만들거야. mysql_query를 어디에서나 호출하고 싶지는 않을 것이다. 아마도 내년 mysqli를 사용해야 할 수도 있고 완전히 다른 데이터베이스 일 수도 있기 때문이다.

그래, 그래, mvc 패턴을 사용하지만 그뿐만 아니라. 전체 코드를 리펙터링하십시오. 가능한 한 라이브러리를 사용할 준비가되어 있어야합니다 (예 : 데이터베이스 추상화). 그리고 건물을 시작하기 전에 올바른 방법을 생각해보십시오.

+0

예, 나는 철학을 이해합니다. 일반적으로 댓글을 달거나 구체적으로 내 코드와 관련이있는 항목이 있는지 잘 모르겠습니다. (예 : 기존 SQL/쿼리를 캡슐화하라는 메시지가 표시됩니다. 내 코드를 데이터 클래스에 넣거나 처음부터 새로운 데이터 클래스를 작성하도록 요청하는 것)? – user481913

+1

너무 많이 사용하지 마십시오. 즉, 잘 사용할 수있는 것을 휴지통으로 버리지 마십시오. 예를 들어, 코드를 가져 와서 전체 프로젝트에서 여러 번 사용하여 클래스의 함수에 넣을 수 있습니다 (예 : 아직 변경), 원래 코드의 모든 인스턴스를 클래스의 메소드로 대체하십시오. 그런 다음 클래스 메서드에서 변경 작업을 수행 할 수 있으며 모든 작업을 수행 할 필요가 없습니다. 또한 유지할 코드에주의하십시오. VERY 오래된 코드에 코드가 포함되어 있고 모두가 제대로 작동하는 상황이 자주 발생할 수 있습니다. –

+1

예 코드를 살펴 봤습니다. 내 자신의 웹 사이트 코드와 비슷합니다. 필자는이 코드를 기본적으로 4 개의 다른 레이어에 다시 작성했습니다. 1. 매개 변수화 된 쿼리를 실행하고 결과를 2 차원 배열로 반환 할 수있는 데이터베이스 클래스, 2. 웹 사이트 관련 쿼리를 캡슐화하는 쿼리 클래스 (데이터베이스 클래스 사용). 3. 데이터를 받아 템플리트에 넣는 템플리트 클래스 (template = 변수와 html을 출력하는 dumb php) 4. 모든 것을 묶는 논리를 포함하는 클래스. 이제는 취미 웹 사이트 일 뿐이지 만 취미로도 충분할 것입니다. – GolezTrol