Hogyan fejlesszünk gyorsabban, pontosabban és hatékonyabban

Szerző: Borsos Albert 2015-04-20 11:19 Szólj hozzá!

Gyorsabban, pontosabban és hatékonyabban? Azért ez elsőre eléggé paradoxonnak tűnhet, ennek ellenére lehetséges és nem is olyan nagy ördöngősség. Ebben a bejegyzésben főleg Yii Framework-höz lesznek azonnal használható tippek, de más keretrendszer esetén is használható.

Ahhoz, hogy gyorsabban, hatékonyabban és pontosabban tudjunk fejleszteni elsősorban egy fontos gondolkodásmódot kell elsajátítani. Ez pedig nem más mint az, hogy a gyakran ismételt feladatokat automatizáljuk. Ha fejlesztő vagy, akkor ez neked könnyen fog menni, de azt vettem észre, hogy akik nem úgy gondolkoznak mint mi, nekik ezt a gondolkodásmódot nehéz rögzíteniük.

Én nem szeretem ha monoton, unalmas dolgokkal megy el a fejlesztés. Mikre gondolok? A leggyakoribb dolgok, amik Neked is biztosan unalmasak pl.:

  • osztályok készítése
  • űrlapok gyártása
  • áttekintő táblázatok

Ezért szeretem a Yii Frameworkot, mert alapból van benne egy olyan funkció, hogy ezeket mind legenerálja a Gii modul segítségével. Nagyon jól meg lehet gyorsítani vele a munkavégzést. Eleinte egyenként írtam át a gyári template-eket Smarty-ra, aztán ezt hamar meguntam és a Gii-ben hoztam létre egy saját templatet.

View file-ok generálása

Az űrlapgeneráláshoz az alábbi útvonalon található a template:

framework/gii/generators/crud/templates

itt érdemes egy új mappát létrehozni és abba bemásolni a defaultban lévő template fileokat. Ezt mindenki saját kedvére módosíthatja. Én először a _form.php-t írtam át, majd az admin-ba is beletettem a saját GridView widgetem és minden sort kifejtettem array()-be, így megspórolom azt is, hogy ezt egyenként kelljen kibővíteni, ha kicsit módosítani szeretném az alap értékek megjelenítését. (pl státusz flag szöveges legyen)

Modellek generálása

Az OracleActiveRecord osztályomhoz hasonlóan lehet létrehozni egyedi model osztályt, ebben vehetjük fel azokat a függvényeket és attribútumokat amik minden modelünkben benne lennének. Pl. én itt létrehoztam egy wrapper-t a throw new Exception()-re. Ami így néz ki:

public function throw_exception($title = null){
    if (!is_null($title)) $title = '<h4>'.$title.'</h4>';
    throw new Exception(CHtml::errorSummary($this, $title, '', array('class'=>'')));
}

Egy ilyen függvényt nem lenne kellemes minden hibadobásnál leírni. De arra figyeljünk, hogy ezt ne a modelben hozzuk létre, hanem az AR osztályban(nem gii template, hanem mondjuk komponens vagy extension). Így pontosabban tudjuk karbantartani a kódunkat, mert csak egy helyen kell módosítani, ha frissíteni/bővíteni szeretnénk.

Ezen felül a saját model templatünket is érdemes létrehozni. Én ebben a beforeValidate(), afterValidate(), beforeSave(), afterSave(), beforeDelete() metódusokat fejtettem ki és tettem bele azokat a logikákat, amiket szinte mindig használok.

Controller generálás

Erre is van template, viszont ez 2 helyen is szerepel. A crud és a controller mappában is megtalálható a fent említett útvonalon. Én a create és update action-öket bővítettem ki és tettem egy tranzakcióba, mert a bonyolutabb űrlapok esetében nem csak egy rekordot szoktam menteni, ezért erre úgyis szükség van.

/**
 * Új hozzászólás mentése
 */
public function actionCreate(){
    $model = new Comments;
    // Uncomment the following line if AJAX validation is needed
    // $this->performAjaxValidation($model);
    if (isset($_POST['Comments'])) {
        $transaction = Yii::app()->db->beginTransaction();
        try {
            $model->attributes = Yii::app()->request->getPost('Comments');
            if (!$model->save()) {
                $model->throw_exception('<h4>Hozzászólás mentése nem sikerült</h4>');
            } else {
                $transaction->commit();
                Yii::app()->user->setFlash('success', '<h4>Hozzászólás sikeresen létrehozva!</h4>');
                $this->redirect(array('admin'));
            }
        } catch (Exception $e) {
            $transaction->rollback();
            Yii::app()->user->setFlash('error', $e->getMessage());
        }
    }
    $this->render('create', array(
        'model' => $model,
    ));
}<br>

Modulok

Egy modul olyan, mintha az alkalmazásunkon belül lenne még egy alkalmazás. Hasonló a mappastruktúrája is. Érdemes rászokni a modulok használatára, mert ezáltal jobban el lesznek szeparálva a fájljaink így sokkal könnyebben áttekinthetőek egy nagyobb projekt esetén. Modulra is létezik template fájl, ezt is ajánlott használni :)

Nem mellékes, hogy ha modulokat használunk, akkor a framework csak azokat a JS, CSS fájlokat fogja betölteni, amiket szükséges használnia. Így csökkenhet az alkalmazásunk mérete, betöltődési ideje.

Csomagoljuk be a widgeteket

Érdemes saját widgeteket is készíteni, ha nem is nulláról, de mondjuk egy gyári widgetből létrehozni egy saját, bővített verziót. Én a gyakran használt widgeteknél a beállításaira szoktam készíteni egy wrappert. Ez főleg akkor jó, ha alapból nagyon sok paramétert kell beállítani. Így a wrappernek csak néhány paramétert kell átadni.

public static function dropDownSelect2Model($model, $attribute, $source = null){
    $config = array(
        'asDropDownList' => false,
        'model' => $model,
        'attribute' => $attribute,
        'pluginOptions' => array(
            'tags' => $source,
            'maximumSelectionSize' => 1,
            'width' => '100%',
            'tokenSeparators' => array(',', '\n'),
        )
    );
    Yii::app()->controller->widget('albert.widgets.select2.Select2', $config);
}

+1 haladó tipp

Tervezzünk egy szabályrendszert az alkalmazásunkra. Itt például arra gondolok, hogy legyen egy egységes struktúrája annak, hogy hogyan tervezünk meg egy adatmodelt. Ha minden táblában szerepel egy user_create, date_create, user_update, date_update illetve egy status mező, akkor erre egy ActiveRecord osztályt lehet tervezni, a model-ekbe már generálás során fel lehet tölteni ezeket az attribútumokat. Ezzel is sok időt spórolhatunk.

A fenti néhány apróság az én munkámat nagyon meggyorsította, szóval érdemes alkalmazni :) Egyelőre ennyi, ami hirtelen eszembe jutott. Ha még beugrik valami, akkor bővítem a cikket.

 
A hozzászólások a Disqus segítségével jöttek létre