Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web servers, web development, networking and security services. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

deWiTTERS Tao kodiranja

Kооnsоlо vam pomaže da kreirate sopstvene igrice! Pratite ovaj blog za detaljne članke. Za najnovije vesti i trendove u programiranju igrica, pratite me na twitteru . I ne zaboravite da nudimo nаjbolje alatke za pravljenje RPGa ! I kad smo kod toga, zašto da ne probate i našu super inovativnu indie igricu Mystic Mine .

Pоčetna > Programiranje > deWiTTERS Tao kodiranja

deWiTTERS Tao kodiranja

____________________________________________________________________

Ovaj vodič opisuje stil kodiranja koji sam razvio tokom godina. Moj stil nije mnogo rasprostranjen. Ustvari, ne poznajem nikoga ko se iole približio mom čudnom načinu programiranja. Ali meni se tako dopada i želim svejedno to da podelim sa vama (vi srećnici!). Koristim taj stil za sve programske jezike: C, C++, Java, C#, Python,… .

Ako vam je potreban samo kratak pregled stila, izlistajte do kraja stranice i pogledajte kako su pojedini izvorni kodovi prepisani za moj deWiTTERS Stil, i videćete kako lepo to sve izgleda.

Zašto stil kodiranja?

____________________________________________________________________

Svaki programer koristi određeni stil, ponekad dobar, ponekad loš. Stil kodiranja može dati kodu jednoobrazan izgled. Algoritme može učiniti jasnijim ili kompleksnijim. Postoje 2 glavna razloga za određeni stil kodiranja:

  1. Razvoj čistog i čitljivog koda tako da, kad neko drugi treba da prođe kroz njega, može prilično brzo da ga pročita. I što je još važnije, kada se vratite na neki stari kod koji ste napisali pre godinu dana, ne počnete da razmišljate: “Ne mogu da se setim da sam bio toliko uzaludan...”.
  2. Kada radite u timu, najbolje je da svi koriste isti stil tako da kod dobije jednoobrazan izgled.

S obzirom da sam veći deo koda sam razvio, ne moram da razmišljam o drugom razlogu. A s obzirom da sam veoma tvrdoglav, neću preuzeti nečiji tuđi stil. Zbog toga je moj stil poptuno optimizovan za proizvodnju čistog i čitljivog koda.

Osnovna pravila

____________________________________________________________________

Pokušao sam da snimim najvažnije aspekte stila kodiranja u okviru sledećih pravila:

  1. Sve treba da bude što je razumljivije moguće.
  2. Sve treba da bude što je čitljivije moguće, osim ako se time ne remeti prethodno pravilo.
  3. Sve treba da bude što je jednostavnije moguće, osim ako se time ne remeti prethodno pravilo.

Najbolji način postupanja po ovim pravilima je učiniti sve što jednostavnijim, osim ako to ne utiče nepovoljno na razumevanje ili čitljivost. Ili da citiramo Alberta Ajnštajna:

    Učinite sve što je moguće jednostvanijim, ali ne jednostavnijim od toga.

Kao programer, uvek se morate truditi da poštujete navedena pravila, čak iako ne pratite moj stil kodiranja.

Pisanje razumljivog i čitljivog koda postalo je moguće nastankom modernih programskih jezika. Dani u kojima je kompletno programiranje rađeno u asembleru, davno su iza nas. Stoga moj stil pokušava da se što više približi našem prirodnom jeziku. Skoro da možete reći da se moj kod čita kao knjiga. To je verovatno i razlog zbog kojeg je moj kod slabo dokumentovan. Jedva da uopšte dokumentujem! Dokumentovanje čak smatram “lošim” (i to ne u najgorem smislu te reči). Samo onda kada uradim nešto čudno, dodam komentar da objasnim zašto sam to uradio. Prema mom skromnom mišljenju, komentari ne bi trebalo da govore šta vaš kod radi, neka vaš kod sam to kaže.

    Svaka luda može napisati kod koji kompjuter može da razume. Dobri programeri pišu kod koji ljudi mogu da razumeju.

    Martin Fowler

Identifikatori

____________________________________________________________________

Počnimo od najvažnijeg elementa stila kodiranja: identifikatora. Svi identifikatori, kao i ostatak koda i komentara treba da budu napisani na engleskom. Nije neuobičajeno da softverski projekti prelaze s jedne osobe na drugu, iz jedne kompanije u drugu, koja se nalazi na suprotnoj strani sveta. Pa pošto nikada ne znate gde će vaš kod sledeće biti, pišite sve na engleskom jeziku.

Promenljive

____________________________________________________________________

Promenljiva imena treba da budu napisana malim slovima, a reči razdvojene donjom crtom. To najviše podseća na prirodno pisanje i zato je najčitljivije. Donja crta zamenjuje prazno mesto u normalnom pisanju. Promenljiva pod nazivom “RedPushButton” ne može da se tako lako i brzo pročita kao “red_push_button”, verujte mi.

Ako želite da promenljive budu razumljive, morate im dati očigledna imena. Jasno je da promenljive predstavljaju određene vrste "objekta" ili "vrednosti", pa ih imenujte shodno tome. Molim vas, ne gubite vreme sa jkuidsPrefixing vndskaVariables ncqWith ksldjfTheir nmdsadType jer to jednostavno nije razumljivo ni čisto. Ako imate promenljivu "godine", jasno je da je to INT ili neoznačena prečica. Ako je "ima fajla", onda mora biti niz. Lako! Ponekad će neke promenljive biti razumljivije ako uključite i tip u njih, kao na primer za grafičke tastere kao što su "reprodukuj_taster" (play_button) "otkaži_taster" (cancel_button). <>

Postoje određeni prefiksi i postfiksi koji mogu uticati na bolju čitljivost promenljivih. Sledi spisak najčešćih:

is_, has_ (je_, ima_)
Koristite ih za sve logičke vrednosti tako da ne može biti greške o njihovoj vrsti. Takođe se dobro uklapa uz sve uslovne naredbe.
the_
Počnite sve globalne promanljive sa “the_”, što čini vrlo jasnim to da se radi samo o jednom pojmu.
_count (_broj)
Koristite _count da predstavite broj elemenata. Nemojte koristiti množinu kao “buliti” umeto “bullet_count” jer će množina predstavljati nizove.

Nizovi ili druge promenljive koje predstavljaju liste moraju biti napisani u množini, kao neprijatelji, zidovi i oružje. Ipak, ne morate raditi to za sve vrste nizova jer određeni nizovi ne predstavljaju zapravo listu stavki. Pojedini primeri za to su “char filename[64]” ili “byte buffer[128]“.

Konstantne ili Finalne

____________________________________________________________________

Konstantne ili finalne moraju uvek biti napisane VELIKIM SLOVIMA, a reči razdvojene donjom crtom, što će ih učiniti čitljivim, kao MAX_CHILDREN, X_PADDING ili PI. Ova upotreba je široko rasprostranjena i treba se koristiti da bi se izbeglo brkanje sa normalnim promenljivim.

Možete upotrebiti MAX i MIN u vašim konstantnim imenima da predstavite vrednosne granice.

Tipovi

____________________________________________________________________

Tipovi definišu klasifikaciju promenljivih. To je prilično apstraktan termin, pa ne možemo upotrebiti engleski jezik kao referencu za njihovo pisanje. Ali svakako bi trebalo da napravimo vidnu razliku između njih i drugih indentifikatora. Dakle, za tipove koristim složene reči sa više velikih slova (UpperCamelCase). Za svaku klasu, strukturu, nabrajanje i drugo što možete postaviti ispred promenljivih deklaracija, koristite UpperCamelCase.

Imenujte svoje tipove na takav način da možete koristiti ista imena za generičke promenljive, na primer:

HelpWindow help_window;
FileHeader file_header;
Weapon weapons[ MAX_WEAPONS ];

Tok programa

____________________________________________________________________

ako, osim ako, inače

Postoji nekoliko načina za pisanje ako-uslovnih naredbi. Počnimo od zagrada. Postoje 3 osnovna načina da postavite zagrade:

    if(condition)

    if (condition)

    if( condition )

Nikada nisam video engleski tekst u kojem su zagrade postavljene kao u prvom primeru, pa zašto bismo onda tako kodirali? Reči jednostavno nisu pravilno odvojene. Drugi primer postavlja zagrade uz uslov umesto uz uslovnu naredbu, dok su zagrade ustvari deo uslovne naredbe, a ne uslova, tako da je poslednji primer najbolji. Prednost poslednjeg primera je i ta što se tako ima bolji uvid u strukturu zagrada.

    if (!((age > 12) && (age < 18)))

    if( !((age > 12) && (age < 18)) )

Ja bih, lično, ovaj kod drugačije napisao, ali ovo je samo u svrhu primera.

E sad, šta raditi sa zakrivljenim zagradama? Nemojte ih koristiti! Nažalost, C, C++, Java ili C#ne dozvoljavaju to, samo Python. Tako da ih možemo zanemariti, ali ono što možemo uraditi jeste da postavimo zagrade da izgledaju kao Python program, jednostavno i čisto:

    if( condition ) {
        statements;
    }
    else if( condition ) {
        statements;
    }
    else {
        statements;
    }

Kada uslov postane predugačak morate da podelite red. Pokušajte da ga podelite pre operatora i tamo gde su uslovi najmanje povezani. Poravnajte sledeći red uz prethodni i upotrebite uvučeni red da otkrijete ugneždenu strukturu. Ne stavljajte zakrivljenu zagradu odmah iza uslova, ali u ovom slučaju postavite je na naredni red kako biste učinili pod-blok čistim.

    if( (current_mayor_version < MIN_MAYOR_VERSION)
        || (current_mayor_version == MIN_MAYOR_VERSION
            && current_minor_version < MIN_MINOR_VERSION) )
    {
        update();
    }

Kada postoji samo jedna naredba nakon uslova, možete preskočiti zakrivljenu zagradu, ali svakako postavite naredbu u sledeći red, osim ako nije povratni red ili prelomni.

    if( bullet_count == 0 )
        reload();

    if( a < 0 ) return;

dok (while) sekvenca

Dok-sekvence napisane su na isti način kao uslovne strukture. Ja koristim 4 prazna mesta za svaki uvučeni red.

    while( condition ) {
        statements;
    }

Za radi-dok sekvence, postavite dok u isti red sa završnom zagradom. Na taj način neće biti zabune, ako je to dok na kraju ili početku pod-bloka.

    do {
        statements;
    } while( condition )

za (for)

Jedina svrha za sekvence jeste iteracija (ponavljanje). To je ono što one rade! Za-sekvence se uvek mogu zameniti dok-sekvencama, ali molim vas, ne radite to. Kada postavljate iteraciju nad nekim elementima, pokušajte da upotrebite “za”, a ako to ne funkcioniše, upotrebite “dok”. “Za” struktura je prilično direktna:

    for( int i = 0; i < MAX_ELEMENTS; i++ ) {
        statements;
    }

Koristite i, j, k, l, m za iteraciju nad brojevima, a “to” za iteraciju nad objektima.

prebaci (switch)

Naredbe za prebacivanje imaju sličnu strukturu kao ako i dok strukture. Jedina stvar koju treba da razmotrite je dodatno uvlačenje reda. Takođe, ostavite dodatna mesta odmah nakon preloma.

    switch( variable ) {
        case 0:
            statements;
            break;

        case 1:
            statements;
            break;

        default:
            break;
    }

Funkcije

____________________________________________________________________

Funkcije vrše stvari i njihovo ime bi ovo trebalo da učini jasnim. Stoga, uvek uključite i glagol, bez izuzetka! Koristite isto imenovanje kao kod promenljivih, a to znači mala slova, a reči odvojene donjom crtom. To će vam omogućiti da pravite male, lepe rečenice u vašem kodu koje će svi razumeti.

Takođe se uverite da funkcija zaista radi ono što joj ime govori, ni manje ni više. Dakle, ako imate funkciju pod nazivom “učitaj_izvori” uverite se da ona učitava samo izvore i ne radi ništa osim toga. Ponekad će vas brza inicijalizacija dovesti u iskušenje u funkciji učitaj_izvori jer ste je već pozvali iz višeg nivoa, ali to će vas kasnije samo uvaliti u nevolju. Moj deWiTTERS Stil koristi veoma malo komentara, tako da funkcija definitivno treba da radi ono što joj ime govori. A kada funkcija vrati nešto, uverite se da je iz njenog imena jasno šta vraća.

Neke funkcije dolaze u “jin i jang” paru i morate biti dosledni nazivima. Neki primeri su uzmi/podesi, dodaj/ukloni, ubaci/izbriši, napravi/uništi, počni/zaustavi, uvećanje/umanjenje, novo/staro, početak/završetak, prvi/poslednji, gore/dole, naredni/prethodni, otvoreni/zatvoreni, učitaj/sačuvaj, pokaži/sakri, omogući/onemogući, preuzmi/suspenduj itd.

Sledi jednostavna funkcija poziva. Upotrebite prazninu odmah iza početne zagrade i odmah nakon završne zagrade, isto kao kod ako-struktura. Takođe, ostavite prostor odmah iza zapete, kao u engleskom jeziku.

    do_something( with, these, parameters );

Kada funkcija poziva postane predugačka, morate je podeliti u nekoliko redova. Izravnajte naredne redove sa prethodnim tako da struktura postane očigledna, i prelomite red posle zapete.

    HWND hwnd = CreateWindow( "MyWin32App", "Cool application",
                              WS_OVERLAPPEDWINDOW,
                              my_x_pos, my_y_pos,
                              my_width, my_height
                              NULL, NULL, hInstance, NULL );

Definicija

Sledi primer definicije funkcije:

    bool do_something_today( with, these, parameters ) {
        get_up();
        go_to( work, car );
        work();
        go_to( home, car );
        sleep();

        return true;
    }

Uverite se da vaše funkcije nisu predugačke. Ili da citiram Linusa:

    Maksimalna dužina funkcije obrnuto je proporcionalna složenosti i stepenu uvučenosti te funkcije. Dakle, ako imate konceptualno jednostavnu funkciju koja je prosto jedna dugačka (ali jednostavna) naredba-slučaj, u kojoj morate da radite mnogo malih stvari za mnogo različitih naredbi, u redu je imati dužu funkciju. S druge strane, ako imate složenu funkciju, i ako mislite da manje nadaren srednjoškolac na prvoj godini neće razumeti šta predstavlja ta funkcija, trebalo bi da se pridržavate maksimalnih ograničenja što je više moguće. Upotrebite pomoćne funkcije sa opisnim imenima (možete tražiti od kompilatora da izvšri in-line funkciju, ako smatrate da je to potrebno, i on će sigurno to bolje odraditi nego što biste vi mogli).

Razredi

____________________________________________________________________

Za imenovanje razreda koristim isti UpperCamelCase kao za tipove. Ne zamarajte se stavljanjem ‘C’ prefiksa ispred svakog razreda, to je samo gubljenje bajtova i vremena.

Kao i svemu ostalom, dajte i razredima jasna i očigledna imena. Dakle, ako je razred dete razreda “Window”, imenujte ga kao “MainWindow”.

Kada pravite novi razred, zapamtite da sve počinje od strukutre podataka.

    Podaci dominiraju. Ako ste izabrali pravilnu strukturu podataka i dobro organizovali stvari, algoritmi će se skoro uvek sami pokazivati. Strukture podataka, ne algoritmi, centralni su za programiranje.

    Fred Brooks

Nasleđivanje

Odnos “je” treba modelovati kroz nasleđivanje, “ima” treba modelovati kroz sadržaj. Uverite se da niste prekomerno upotrebili nasleđe, to je odlična tehnika, ali samo onda kada se pravilno koristi.

Članovi

Definitivno treba da napravite razliku između članova i normalnih promenljivih. Ako to ne uradite, kasnije ćete zažaliti. Neke od mogućnosti njihovog imenovanja su m_Član (m_Member) ili fČlan (fMember). Ja više volim da koristim moji_članovi za nestatičke članove i naši_članovi za statičke. Na taj način ćete dobiti lepe rečenice u telima metoda kao

    if( my_help_button.is_pressed() ) {
        our_screen_manager.go_to( HELP_SCREEN );
    }

Za sve ostalo, sve što važi za imenovanje promenljivih, važi i za članove. Postoji jedan problem koji još nisam uspeo da rešim, a odnosi se na logičke članove. Zapamtite da logičke vrednosti uvek moraju imati “je” (is) ili “ima” (has) u sebi. Kada to kombinujete sa “moj_” (my_) dobijate lude stvari poput “moj_je_star” (my_is_old) i “moj_ima_decu” (my_has_children). Za ovo još nisam našao savršeno rešenje, pa ako imate predloge, molim vas ostavite komentar ispod ovog posta!

Ne treba da označite članove razreda kao javne. Nekad se to čini bržim, i time boljim, ali grdno se varate (kao što sam se i ja mnogo puta do sad prevario). Treba da prođete kroz javne metode da biste došli do članova razreda.

Metode

Sve što važi za funkcije, važi i za metode, pa zato uvek uključite glagol u ime. Uverite se da niste uključili ime razreda u imenima metoda.

Struktura koda

____________________________________________________________________

Izravnajte slične redove kako biste kodu dali bolji izgled, ovako:

    int object_verts[6][3] = {
        {-100,  0, 100}, {100, 0,  100}, { 100, 0, -100},
        {-100, 11, 100}, (100, 0, -100}, {-100, 0, -100}
    };

    RECT rect;
    rect.left   = x;
    rect.top    = y;
    rect.right  = rect.left  + width;
    rect.bottom = rect.right + height;

Nikada ne stavljajte višestruke naredbe u isti red, osim ako za to nemate dobar razlog. Jedan takav razlog bi mogao biti da se isti redovi mogu staviti jedan nakon drugog, radi jasnoće, ovako:

    if( x & 0xff00 ) { exp -= 16; x >>= 16; }
    if( x & 0x00f0 ) { exp -=  4; x >>=  4; }
    if( x & 0x000c ) { exp -=  2; x >>=  2; }

Povezane promenljive istog tipa mogu se izneti u zajedničkoj rečenici. To kod čini kompaktnijim i pruža lepši izgled. Ali nikad ne iznosite nepovezane promenljive u istoj naredbi!

    int x, y;
    int length;

Prostor za ime, paketi

____________________________________________________________________

Prostori za ime ili paketi treba da budu napisani malim slovima, bez donjih crta. Upotrebite prostor za ime za svaki modul ili sloj koji napišete, tako da različiti slojevi budu jasni u kodu.

Dizajn

____________________________________________________________________

Kada otpočnem projekat, ne radim neki poseban dizajn unapred. Imam samo globalnu strukturu u svojoj glavi i počnem da kodiram. Kod se razvija, hteli vi to ili ne, pa mu dajte šansu da se razvije.

Razvijanje koda znači preradu lošeg koda, a posle određenog programiranja, vaš kod će postati loš. Ja koristim sledeća pravila da zadržim dobru strukturu u kodu:

  1. Kada funkcije postanu prevelike, podelite problem u manje pomoćne funkcije;
  2. Ako razred sadrži suviše članova i metoda, podelite deo razreda u pomoćne razrede i uključite pomoćni razred u glavni razred (ne koristite nasleđe za to!). Uverite se da pomoćni razred nije referenca glavnog niti da koristi glavni razred u bilo kom smislu;
  3. Kada modul sadrži previše razreda, podelite ga u više modula pri čemu modul višeg nivoa koristi modul nižeg nivao;
  4. Kada završite primenu određenih elemenata ili ispravite programsku grešku, pročitajte ponovo ceo fajl koji ste izmenili kako biste se uverili da je sve u najboljem redu.

Neki projekti mogu postati veliki, veoma veliki. Način da se izborite sa tom rastućom složenošću jeste da podelite projekat na različite slojeve. U praksi, slojevi se primenjuju kao prostori za imena. Niže slojeve koriste viši slojevi. Na taj način svaki sloj obezbeđuje funkcionalnost onom iznad njega, a najviši sloj omogućava funkcionalnost korisniku.

Fajlovi

____________________________________________________________________

Fajlovi bi trebalo da budu imenovani na osnovu razreda koji sadrže. Ne stavljajte više od jednog razreda u fajl, tako ćete znati gde da gledate kada budete tražili određeni razred. Struktura direktorijuma treba da predstavlja prostor za imena.

Struktura .h fajlova

C ili C++ fajlovi zaglavlja pokazuju interfejs implementacije. To je ključno znanje u dizajniranju postavke .h fajlova. U razredu prvo definišite “javni” interfejs koji mogu koristiti i drugi razredi, zatim definišite sve “zaštićene” metode i članove. Na taj način prvo se pokazuju najvažnije informacije ljudima koji koriste razred. Ja ne koristim privatne metode ili članove, tako da su svi članovi grupisani na dnu izjave razreda. Na taj način dobijate brzi pregled sadržaja razreda pri dnu. Grupišite metode prema njihovom značenju.

    /*
     * license header
     */

    #ifndef NAMESPACE_FILENAME_H
    #define NAMESPACE_FILENAME_H

    #include <std>

    #include "others.h"

    namespace dewitters {

        class SomeClass : public Parent {
            public:
                Constructor();
                ~Destructor();

                void public_methods();

            protected:
                void protected_methods();

                int     my_fist_member;
                double  my_second_member;

                const static int MAX_WIDTH;
        };

        extern SomeClass the_some_class;
    }

    #endif

Struktura java .cs fajlova

.java ili .cs fajlovi ne obezbeđuju interfejs za klasu, oni samo sadrže implementaciju. S obzirom da su strukture podataka važnije od algoritama, definišite članove pre metoda. Na taj način, kada budete pretraživali kod, steći ćete brz uvid u razred preko podataka njegovih članova. Slični metodi treba da se grupišu zajedno.

Sledi površan pregled .java ili .cs fajlova:

    /*
     * license header
     */
    package com.dewitters.example;

    import standard.modules.*;

    import custom.modules.*;

    class SomeClass extends Parent {
        public final int MAX_WIDTH = 100;

        protected int     my_first_member;
        protected double  my_second_member;

        Constructor() {
        }

        Methods() {
        }
    }

Dosetke

____________________________________________________________________

Neki ljudi vole da stave male dosetke u kodove, dok drugi ne vole tu vrstu smešnih stvari. Ja mislim da ih možete upotrebiti sve dok te dosetke ne utiču na čitljivost koda ili izvršenje programa.

deWiTTERS Style vs. others

____________________________________________________________________

Ovde ću vam predstaviti neke žive akcijske kodove. Ukrao sam neke kodove od drugih i prepisao ih u svom stilu. Sami odlučite da li je moj stil bolji ili nije. Prema mom mišljenju, možete brže čitati moj kod jer je kraći, a svi identifikatori su pažljivo imenovani.

Ako mislite da ste videli kod koji može počistiti moj stil, ostavite komentar ispod ovog posta i ja ću ga napisati u najneobičnijem ‘deWiTTERS’ stilu i postaviti ovde.

Indian Hill C Stil

/*
 *	skyblue()
 *
 *	Determine if the sky is blue.
 */

int			/* TRUE or FALSE */
skyblue()

{
	extern int hour;

	if (hour < MORNING || hour > EVENING)
		return(FALSE);	/* black */
	else
		return(TRUE);	/* blue */
}

/*
 *	tail(nodep)
 *
 *	Find the last element in the linked list
 *	pointed to by nodep and return a pointer to it.
 */

NODE *			/* pointer to tail of list */
tail(nodep)

NODE *nodep;		/* pointer to head of list */

{
	register NODE *np;	/* current pointer advances to NULL */
	register NODE *lp;	/* last pointer follows np */

	np = lp = nodep;
	while ((np = np->next) != NULL)
		lp = np;
	return(lp);
}

Prepisano u deWiTTERS stilu:

bool sky_is_blue() {
    return the_current_hour >= MORNING && the_current_hour <= EVENING;
}

Node* get_tail( Node* head ) {
    Node* tail;
    tail = NULL;

    Node* it;
    for( it = head; it != NULL; it = it->next ) {
        tail = it;
    }

    return tail;
}

“Commenting Code” od Ryana Campbella

/*
 * Summary:     Determine order of attacks, and process each battle
 * Parameters:  Creature object representing attacker
 *              | Creature object representing defender
 * Return:      Boolean indicating successful fight
 * Author:      Ryan Campbell
 */
function beginBattle(attacker, defender) {
    var isAlive;    // Boolean inidicating life or death after attack
    var teamCount;  // Loop counter

    // Check for pre-emptive strike
    if(defender.agility > attacker.agility) {
        isAlive = defender.attack(attacker);
    }

    // Continue original attack if still alive
    if(isAlive) {
        isAlive = attacker.attack(defender);
    }

    // See if any of the defenders teammates wish to counter attack
    for(teamCount = 0; teamCount < defender.team.length; i++) {
        var teammate = defender.team[teamCount];
        if(teammate.counterAttack = 1) {
            isAlive = teammate.attack(attacker);
        }
    }

    // TODO: Process the logic that handles attacker or defender deaths

    return true;
} // End beginBattle

Prepisano u deWiTTERS stilu:

function handle_battle( attacker, defender ) {
    if( defender.agility > attacker.agility ) {
        defender.attack( attacker );
    }

    if( attacker.is_alive() ) {
        attacker.attack( defender );
    }

    var i;
    for( i = 0; i < defender.get_team().length; i++ ) {
        var teammate = defender.get_team()[ i ];
        if( teammate.has_counterattack() ) {
            teammate.attack( attacker );
        }
    }

    // TODO: Process the logic that handles attacker or defender deaths
}




Published (Last edited): 15-01-2013 , source: http://www.koonsolo.com/news/dewitters-tao-of-coding/