ugrás a tartalomhoz

átláthatóbb kód, ti hogy csináljátok?

unregistered · 2010. Jan. 11. (H), 22.35
Hello!

Már évek óta érdekel, ki hogy oldja meg a kód könnyű átláthatóságát csak mindig elfelejtem megkérdezni :)

Van két dolog is amivel mindig megy a "pepecs munka"

Első:
ha meg kell szakítani a php kódot, majd újra php majd megint megszakad stb...
ez nálam néha kaotikus állapotokat eredményez


<?php
    $order = "SELECT * FROM table ORDER BY id DESC";
    $result = mysql_query($order);
    while ($line = mysql_fetch_array($result)) { 
?>

<h1>
    <a class="link1" href="valami.php?id=<?php echo $line['id']; ?>">Link</a>
</h1>
<img class="pic1" src="img/<?php echo $line['picture'];?>" alt="<?php echo $line['picture_name']; ?>" width="400" height="100"/>
<p class="para1"> 
    <?php
        if ($valami == 1) { 
    ?>
            <a href="valahol.php?valami=<?php echo $line['valami']; ?>">
                <img style="image_link" src="valami.jpg" alt="valami" title="valami">
            </a>
<?php
        }
?>
</p>
<?php        
    }
?>
Második:
a PHP-ból SQL-be való varázslás gyötrelmei mint pl a hozzáadás

$sql = "INSERT INTO table (id, car, cat, dog, color, house, white, plan, computer, gear, thing, that, data, voltage, 
yellow, red, qwerty, laptop, pda, phone, chemical, vinyl, what, who, why, you, we, race) VALUES 
('" . $_POST['id'] . "', '" . $_POST['car'] . "','" . $_POST['cat'] . "','" . $_POST['doc'] . "',
 '" . $color . "','" . $_POST['house'] . "','" . $_POST['white'] . "','" . $_POST['plan'] . "',
'" . $_POST['computer'] . "','" . $_POST['gear'] . "','" . $_POST['thing'] . "',
'" . $_POST['that'] . "','" . $_POST['data'] . "','" . $_POST['voltage'] . "',
'" . $_POST['yellow'] . "','" . $_POST['red'] . "','" . $_POST['qwerty'] . "',
'" . $_POST['laptop'] . "', '" . $_POST['pda'] . "','" . $_POST['phone'] . "',
'" . $_POST['chemical'] . "','" . $_POST['vinyl'] . "','" . $_POST['ehat'] . "',
 '" . $_POST['who'] . "','" . $_POST['why'] . "','" . $_POST['you'] . "',
'" . $_POST['we'] . "','" . $_POST['race'] . "', '" . $_POST['kimaradt_valami'] . "')";

mysql_query($sql);
Ti ezeket hogy oldjátok meg hogy szépen átláthatóak legyenek?

ui.: a kódok lehet nem teljesen helyesek, mert csak úgy hasraütésre írtam, úgyhogy abba nem ér belekötni ;)
 
1

Templatezés

janoszen · 2010. Jan. 11. (H), 23.57
Ismerkedj meg a templatezés fogalmával, az sokat fog segíteni ebben.

Egyébként cool nick. :)
2

Off

Ustak · 2010. Jan. 12. (K), 00.05
Egyébként cool nick. :)

Erről az jut eszembe, mikor a barátom mindig valahogy így formázza meg a D: particíóját: "Formázatlan" //pontosan már nem emlékszem mi a default, régen voltam már windows alatt:-)
3

hááát...

unregistered · 2010. Jan. 12. (K), 00.50
Éppenséggel ismerem de hogy jön a templatezés ide? Melyik része lehet érdekes számomra azon kívül hogy használjak valamilyen keretrendszert?
6

Használd

janoszen · 2010. Jan. 12. (K), 07.58
Akkor használd. A mysql_* függvényeknek és a HTML kódnak semmi keresnivalója egyazon fájlban.
9

templatezés

thgab · 2010. Jan. 12. (K), 12.10
Használj valami templatezést, mert így a megjelenítést a működéssel vegyíted. Ha változik a megjelenítés (HTML), vagy a működés (PHP), akkor keserves lehet a módosítás ilyen vegyes kódban.
4

apróságok

Don Oden · 2010. Jan. 12. (K), 07.20
  • Lekérdezéseket külön fájlban tárolom és függvénybe szoktam tenni
  • 4 szóköz tab helyett
  • ha egy ciklus vagy elágazás ágai köző html kódot teszek akkor
    <?php if($valami == 1):?>
     <html>
    <?php endif;?>



én valahogy így formáztam volna:
<?php
    /**
     *  Use comments, because after a while,
     *  you wont remember what the code does    
     */          
    $order = "SELECT * FROM table ORDER BY id DESC";  
    $result = mysql_query($order);  
    while ($line = mysql_fetch_array($result)):  
?>  
 
  <h1>  
      <a class="link1" href="valami.php?id=<?php echo $line['id']; ?>">Link</a>  
  </h1>
   
  <img class="pic1" src="img/<?php echo $line['picture'];?>" alt="<?php echo $line['picture_name']; ?>" width="400" height="100"/>
   
  <p class="para1">  
      <?php if ($valami == 1):?>  
          <a href="valahol.php?valami=<?php echo $line['valami']; ?>">  
              <img style="image_link" src="valami.jpg" alt="valami" title="valami">  
          </a>  
      <?php endif;?>  
  </p>
   
<?php endwhile;?>
5

második

Don Oden · 2010. Jan. 12. (K), 07.37
<?php
    function InsertIntoTable($parameter, $param1, $myparam, $stb...)
    {
        $sql = "INSERT INTO table (id, car, cat, dog) VALUES ('" . $parameter . "', '" . $param1 . "','" . $myparam . "','" . $stb . "')";  
         
        return mysql_query($sql);
    }
   
    InsertIntoTable(
        $_POST['id'],$_POST['car'],$_POST['cat'],
        $_POST['doc']
    );  
?>


Tehát én így csinálnám. Könnyen áttekinthető, és nekem tetszik a megoldás :)
7

DB Layer

Protezis · 2010. Jan. 12. (K), 08.49
Használj valamilyen adatbázis kezelő réteget: AdoDB, Doctrine, PDO, Propel, Zend_DB, stb.

Használj MVC-t, akkor kevesebb php kód lesz a template fájlokban. Ha új szintaktikát is meg akarsz tanulni, akkor ismerj meg egy template libet: smarty, phptal, stb.
8

Első: Ha csak kicsit akarsz

deejayy · 2010. Jan. 12. (K), 09.56
Első:

Ha csak kicsit akarsz jót magadnak, akkor hagyj fel azzal, hogy egynél több <? ?> párt írsz. Ha valamit ki akarsz írni, akkor printf(""). Sosem kell megszakítanod a PHP kódot.

Ha nagyon jót akarsz magadnak, akkor viszont egy fentebb említett template rendszert kellene alkalmaznod.

Második:

Ha csak kicsit akarsz jót magadnak, akkor mysqli_prepare. A függvény használata ki fog kényszeríteni egy bizonyos átláthatóságot.

Ha nagyon jót akarsz magadnak, akkor meg egy fentebb említett db-kezelő réteget válassz.
10

...

unregistered · 2010. Jan. 12. (K), 14.05
Don Oden
Köszönöm, tényleg átláthatóbbak. Ezeket te így használod vagy te is templatezel?
A tab helyett miért jobb a 4 szóköz?

deejayy
és a printf-et hogy használod? Egy sorba írod az egész kódot amit ki szeretnél íratni?

pl az alábbi kódon hogy alkalmazod?

<?php  
    $order = "SELECT * FROM table ORDER BY id DESC";  
    $result = mysql_query($order);  
    while ($line = mysql_fetch_array($result)) {   
?>

<div>
    <img class="pic1" src="img/<?php echo $line['picture'];?>" alt="<?php echo $line['picture_name']; ?>" width="400" height="100"/>
    <p class="para1">
    	<?php 
            if ($valami == 1) {
        ?>
                <a href="valahol.php?valami=<?php echo $line['page']; ?>">
                    <img style="image_link" src="valami.jpg" alt="valami" title="valami">
                </a>
        <?php
            }
            echo $line['szoveg'];
        ?>
    </p>
</div>
<?php
    }
?>
így?

<?php  
    $order = "SELECT * FROM table ORDER BY id DESC";  
    $result = mysql_query($order);  
    while ($line = mysql_fetch_array($result)) {
        $img = $line['picture'];
        $img_name = $line['picture_name'];
        printf('<div><img class="pic1" src="img/%s" alt="%s" width="400" height="100"/><p class="para1">',$img,$img_name);
        if ($valami == 1) {
        	$page = $line['page'];
        	printf('<a href="valahol.php?valami=%s"><img style="image_link" src="valami.jpg" alt="valami"></a>',$page);
        }
        echo $line['szoveg'].'</p></div>';
    }
?>
Szerintem én rosszul használom, tény hogy sokkal tömörebb, de nem átláthatóbb. Kérlek segíts ebben!
13

Írhatod több sorba is,

deejayy · 2010. Jan. 19. (K), 14.18
Írhatod több sorba is, tagoltan, tab-okkal, újsorokkal, php megeszi.
11

válasz

Don Oden · 2010. Jan. 13. (Sze), 01.00
Tabot megszokásból nem használom, korábbi projekteknél belémült. Aműgy előnyös akkor ha idővel fejlesztői környezetet váltassz, vagy más is beszál a fejlesztésbe, akkor előnyös ha mindenkinél azonosan jelenik meg a kód. Te könnyebben átlátod az övét és fordítva. Amúgy a legtőbb kódoláshoz használt eszköz támogatja a 4 szóközös tab-ot. Beállításoknál kell kereskgetni. Én személy szerint Eclipse-t, pspado-t és visual studio-t használok. Azoknál mind így van beállítva (persze alapból nem).

Amúgy a kódodat minnél jobban rétegekre bontod, annál átláthatóbb lesz, könnyebben bővíthető.

Ahogy korábban is említették az MVC nagyon jó erre a célra. Legjobb zend, kisebb projektnél simán megfelel mondjuk egy CodeIgniter.

Amit az mvc-ben még szeretek hogy nem kell külön template engine vagy külön db kezelő réteg (persze nem azt jelenti hogy nem lehet, de általában felesleges :))
12

tanulni, tanulni, taulni

unregistered · 2010. Jan. 14. (Cs), 14.27
Igen, azt tudom hogy vannak ilyen beállítások, sőt asszem alapból nálam (Panic féle Coda) a 4 space volt beállítva csak azt nem értettem hogy miért ajánlod inkább a tab helyett.

Hát akkor úgy érzem itt az ideje jobban megismerkednem ezekkel az általatok ajánlott megoldásokkal...

Köszönöm szépen (MINDENKINEK) az agytágítást!
14

tab

janoszen · 2010. Jan. 19. (K), 22.20
Én személy szerint egy rendkívül káros örökségnek tartom a négy szóközt. Úgy 20-30 évvel ezelőtt voltak olyan low level szerkesztők, amik a tabokkal nem működtek jól és valamiért azóta is tartja magát ez, hogy nem jó a tab. Mindazonáltal a 4 szóköznek csak hátránya van a tabokkal szemben, pl. nehezebb szóközöket tabra konvertálni, többet kell backspacelni ha ne adj Isten konzolban kényszerülsz szerkeszteni és egy-egy szóközöket el szoknak csúszkálni a kódok, ha valaki nem figyel oda.
15

Teljesen egyetértek, plusz

Baldric · 2010. Jan. 20. (Sze), 17.18
Teljesen egyetértek, plusz még megemlíteném hogy a legtöbb mai szerkesztőprogram támogatja a több sor csúsztatását, vagyis ha több sort is kijelölsz, és benyomod a tabot/shift+tab-ot (vagy más kombinációt), akkor egy tabbal növeli/csökkenti a sorok elejét, így egy blokkot könnyedén illeszthetsz be egy másik blokkba, anélkül hogy minden sort egyenként igazítanál. Persze az is igaz hogy a normális szerkesztőprogramok ugyanerre képesek akkor is, ha space-t használunk, csakhogy ebben az esetben átalakítja őket tab-ra.
17

Szóköz vs tab

fchris82 · 2010. Feb. 4. (Cs), 13.12
Én is jobban szeretem a szóközös megoldást. Egyrészt pl E-text Editorban a szóközöknél törlésnél is kettesével vagy négyesével törli őket, ha az kell. Másrészt pl YAML-ben szóközök kellenek, tehát én nem fogom most állítgatni a szerkesztőprogramokat, hogy hol szóközt, hol TAB legyen.
Továbbá teljesen biztos lehetek benne, hogy puttyal belépve a szerverre és kilistázva a kódot, pontosan ugyanazt fogom látni, mint ahogy a szerkesztőben láttam.

Konvertálásra én az UltraEditet szoktam használni, gond nélkül cserélgeti le a tabokat és szóközöket, oda-vissza.

Én eddig a "tabosan" készített fájloknál mindig találtam minimum 1-2 sort, ahol szóközök voltak TAB helyett, ami nem azonos beállítás esetén szétcsúszott kódot eredményezett. Hozzá kell tennem az igazság kedvéért, hogy ezekkel a kódokkal más problémák is voltak :D

A szóköz univerzális, mindig, mindenhol elérhető, még ha néha kényelmetlen is.
16

sql + php

errata · 2010. Feb. 3. (Sze), 20.16
sima insert:

$sql = "INSERT INTO `table` SET
        `1_oszlop` = 'adat 1',
        `2_oszlop` = 'adat 2',
        `3_oszlop` = 'adat 3',
        `4_oszlop` = 'adat 4'
        ";
$db->execute($sql);
sokkal jobban szeretem a SET-et mint a values-t mert:
1: átláthatóbb
2: ha bővíted a tábládat amíg ezek az oszlopnevek léteznek addig nem fut hibára a php kód
3: hasonlít az UPDATE-re :) (ON DUPLICATE KEY UPDATE ...)
4: francia idézőjelek meg rám ragadt valahol

ha a php kódba html kerül - itt megjegyezném hogy a php nagyon jó kis sablon kezelő, nem attól lesz valami MVC struktúrájú hogy Smarty-t használ - akkor:

if():
else:
endif;
for():
endfor;
stb stb...
ha nagy a php kód:

if($valami === true) {
   sok sok php code
} // endif
ha sok az if for stb...

if($valami1 === true) {
    if($valami2 === true) {
        if($valami3 === true) {
            sok sok php códe
        } //end if($valami3 === true)
    }//end if($valami2 === true)
}//end if($valami1 === true)

hirtelen ennyi jutott eszembe, ennél lehet több van
jah meg persze sok múlik a szerkesztőn is
én az aptana studió 1.5-t találom a legmegfelelőbbek önmagam számára
18

nyűgök

h31st · 2010. Feb. 5. (P), 13.57
vegyes html-php kódban valóban az alternatív syntax a megoldás
<?php
    if(...): ?>
    <?php else: ?>
    <?php endif;
?>

stb. sajnos ezzel (illetve minden php-ból küldött printnél) felmerül a probléma, hogy ha a forrás php-t indentáljuk logikailag, akkor az a html kimenet indentálásába is beleszól. ami persze nem a legnagyobb probléma, de már a php-ben is különböző szintre kerülhet az egy szinten álló elemek kiirkálása... másrészt, ha nestelni akarsz, be kell zárni mindent <?php ?> elemek közé, nem beszélve pl a változók <?php echo $v ?> beszúrásáról, és a végén több lesz a <?php ?> mint a html kód...
ezekre csak a markup teljes leválasztása ad megoldást, amivel más bajok vannak (de működőképes). printf-el szerintem jó lenne nem html kódot irkálni, kivéve talán, ha a template 'máshonnan' jön, és
<?php
    printf ($sablon, $v1, $v2...);
?>

formára lehet hozni, talán erre gondolt...
adatbázissal tényleg jobb nem direktben foglalkozni, hanem valami layerre bízni, pl nálam
<code><?php
$this->Database->prepare ('INSERT INTO tbl %s') ->set ($data) ->execute();
?></code>
formában történik, ahol $data egy tömb, a tábla mezőneveivel indexelve... létezik $Database->insert($tbl, $data) is, de azt nem szeretem...
viszont $_POST elemeit semmiképp nem kéne közvetlen adatbázisba tenni :)
19

erről eszembe jutott ami még

errata · 2010. Feb. 5. (P), 14.36
erről eszembe jutott ami még kimaradt
a view-ben:
<?php echo "szöveg" ?>
helyett
<?= "szöveg" ?> 
ezt használom.. (természetesen változókkal is működik)
20

http://hu.php.net/manual/en/i

h31st · 2010. Feb. 7. (V), 23.26
http://hu.php.net/manual/en/ini.core.php#ini.short-open-tag ezt figyelembe véve, de runtime is lehet állítgatni. sajna bonyolultabb template (majdnem) ugyanolyan ronda marad vele...
21

Ez valóban működik, ha be van

atropus · 2010. Feb. 10. (Sze), 10.30
Ez valóban működik, ha be van állítva a szerver oldali konfigurációban, mint short_open_tag. Ha szerencséd van, akkor a kódból is be lehet állítani az ini_set -tel de én nem használnék ilyen és hasonló short tageket a kódban, mert így más környezetben meglepetések érhetik az embert.