Jak lepiej pisać kod?

octonapewno

Użytkownik
Dołączył
Maj 22, 2008
Posty
110
mam takie jedno pytanie, jestem nowy jeśli chodzi o projektowania stron i właśnie siedzę i się zastanawiam czy lepszym sposobem na pisanie kodu jest pisanie takie:
PHP:
<?php
// jakiś skrypt php
?>
kod html
<?php
//jakiś skrypt php
?>
kod html
itd.
czy jednak lepszym rozwiązaniem jest pisania kody html w skryptach php, np:
PHP:
<?php
print  "<form>";
print "<input type=\"text\">";
print "</form>";
?>
prosiłbym o odpowiedź i jakieś uzasadnienie. Będę wdzięczny.
A to pytanie powstało w mojej głowie ponieważ tworzę właśnie class gdzie jedna funkcja będzie wyświetlać jakiś formularz inna natomiast jakieś menu itp. Mniej więcej moja klasa na razie tak wygląda:
PHP:
class moja_klasa{
function menu(){
print "<ul>";
print "<li>Opcja 1</li>";
print "<li>Opcja 2</li>";
print "</ul>";
}
function formularzyk(){
print "<form>";
print "<input type=\"text\">";
print "</form>";
}
}
PS. nie patrzcie na to że ten skrypt jest bez sensu, chodzi tylko o zarys sytuacji.
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
Oba są złe. Zobacz na stronę jako na warstwę prezentacji (brzmi górnolotnie ale chodzi o to, jak wygląda, czyli arkusze stylów i kod HTML) i na warstwę aplikacji (to, co się dzieje, czyli np odczytywanie z bazy, sprawdzanie czy użytkownik jest zalogowany etc, u Ciebie kod PHP). Mając taki podział dużo łatwiej będzie Ci modyfikować i rozwijać swoją stronę, bo albo zmieniasz wygląd (i drugie Cię nie obchodzi) albo na odwrót - nie musisz naraz myśleć o obu. Ma to też inne zalety. Można to uzyskać umieszczając cały (albo chociaż prawie) kod PHP'a w funkcjach/klasach, w osobnych plikach, a strony, które użytkownik odwiedza pisać w (prawie) czystym HTMLu, przeplatając je tylko wstawkami PHPa gdzie te funkcje są odpalane.



Zobacz Smarty - one mniej więcej realizują ten podział i są przy tym dość proste. Rozwinięciem tego jest MVC i pochodne.
 
Ostatnia edycja:

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
pytanie co znaczy lepsze, mi się wydaje że opcja pierwsza bo jest czytelniejsza i szybsza

jest też kwestia poruszona przez RobertG, i tu też się z nim zgodzę, ale nie do końca, racja do większych projektów, zwłaszcza pisanych w kilka osób rzeczywiście opłaca się stosować MVC, ale do mniejszy zdecydowanie polecam coś bardziej lajtowego, np. wymienione wyżej Smarty, ja sobie sam napisałem takie mini smarty
PHP:
function szablon($nazwa, $dane)
{
  $szablon=@file_get_contents('html/'.$nazwa.'.html') or exit('Plik z szablonem html/'.$nazwa.'.html nie istnieje.');
  foreach($dane as $klucz => $wartosc)
    $szablon=str_replace('{'.$klucz.'}', $wartosc, $szablon);
  echo preg_replace('/{[a-z]+}/', '', $szablon);
}

Kiedyś ze znajomym robiliśmy porównanie, odpalane z cache parsera PHP, Intel Celeron 1,83, 1GB RAM, Ubuntu 9:
Moja gra via WWW, w tym kilka zapytań SQL, szablon renderowany jak powyżej, 0,0018s
Pusty szablon w YII(framework MVC, podobno super szybki): 0,2s
testy zostały kilkukrotnie powtórzone więc ich wyniki są wiarygodne

Więc warto dobierać rozwiązania do potrzeb, a nie strzelać z armaty do motyla :-D
 

octonapewno

Użytkownik
Dołączył
Maj 22, 2008
Posty
110
co do poprzedniego tekstu, przepraszam za bolda chciałem to poprawić ale nie zdążyłem(nie wiem dlaczego się uruchomił, ale mniejsza o to), co do SMARTY to jeszcze z nimi nie pracowałem, ale nie długo spróbuje.
 

D.F.

Były Moderator
Dołączył
Listopad 4, 2009
Posty
493
Więc warto dobierać rozwiązania do potrzeb, a nie strzelać z armaty do motyla :-D
Tak mi przypomniałeś, bo właśnie piszę tekstowy RPG na DirectX i trochę strzelam z armaty do motyla :D


Żeby nie było, że off-topic podam kod, którego używam:
//------------------------------------------------------//
Funkcja pobierająca plik z katalogu /templates:
Kod:
function gettemplate($template,$endung="tpl",$templatefolder="templates")
{
	return str_replace("\"","\\\"",implode("",file($templatefolder."/".$template.".".$endung)));
}

Tutaj pobranie i wyświetlenie szablonu o nazwie /templates/articles.tpl
Kod:
eval ("\$template = \"".gettemplate("article")."\";");
echo $template;
//------------------------------------------------------//
 

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
@octonapewno, tak, mniej więcej o to mi chodziło.

Moja gra via WWW, w tym kilka zapytań SQL, szablon renderowany jak powyżej, 0,0018s
Pusty szablon w YII(framework MVC, podobno super szybki): 0,2s

Z drugiej strony, mam bloga w Django (czyli z MVC i szablonami + 100 innych rzeczy), śmiga bez problemów z wydajnością, a m.in. dzięki MVC jest prosty w modyfikacji (mimo że kod nie jest mój). Zysk w przejrzystosci kodu który dostaje sie dzieki (dobrym) frameworkom jest IMHO ważniejszy niż szybkość generowania strony. Nawet gdy stronka generuje się za długo możesz pomyśleć o jej cache'owaniu lub o wydzieleniu plików statycznych na osobny serwer. "przedwczesna optymalizacja jest źródłem wszelkiego zła" ;)
 

nowy_me

Użytkownik
Dołączył
Luty 7, 2007
Posty
451
IMHO ważniejsza jest jednak szybkość, zwłaszcza jak pisze dla siebie, dużo by można tu jeszcze pisać, ale koła od nowa nie odkryjemy, o inżynierii oprogramowania powstało już dość sporo książek, wiec myślę że watro po nie sięgnąć
 

octonapewno

Użytkownik
Dołączył
Maj 22, 2008
Posty
110
chyba już mniej więcej wiem co i jak poprawić, wielkie dzięki.

nowy_me podaj jakieś tytuły, jeśli znasz jakieś dobre.

mam takie pytanie tak średnio związane z tym tematem, jak powinna wyglądać funkcja która wyświetla niusy, z tym że jeden nius może być ze zdjęciem inny natomiast nie koniecznie posiada zdjęcie. Siedzę i się głowie i staram się stosować do tego aby nie używać html w php, ale niestety nie daje rady. Prosiłbym o naprowadzenie jak to wykonać. Ponieważ ma funkcje która pobiera z bazy niusy, ale teraz nie wiem jak to "udekorować" htmlem, funkcja wygląda tak:
PHP:
function show_news(){
            $select = "SELECT * FROM tbl_news WHERE id>0 ORDER BY id DESC";
            $doo = mysql_query($select);
            
            while($ret = mysql_fetch_assoc($doo))
            {
                print  $ret['title']." ".$ret['content'];
            }     
        
}

i chciałbym aby title było między znacznikami <h1>, a content między znacznikami <p>
 
Ostatnia edycja:

RobertG

Użytkownik
Dołączył
Styczeń 3, 2007
Posty
391
IMHO te są dobre:

Inżynieria oprogramowania - Brian W. Kernighan, Rob Pike
Perełki oprogramowania Jon Bentley
Mityczny osobomiesiąc. Eseje o inżynierii oprogramowania - Frederick P. Brooks
 
Do góry Bottom