Jump to content
php.lv forumi

Recommended Posts

  • Replies 539
  • Created
  • Last Reply

Top Posters In This Topic

Top Posters In This Topic

Posted Images

Posted (edited)

Boolean flagi argumentos sux smagi, pilnīgi nelasāmi. Labāk izveidot vnk atsevišķu funkciju, kas izsauc konkrēto funkciju ar konkrēto boolean flagu, bet funkcijai vismaz ir lasā nosaukums.

 

saveOrder($asDraft = false);

 

saveOrderAsDraft(){

    return saveOrder(true);

}

 

Internāli klasēs lietot tādas metodes vēl ok, bet uz ārpuse nerullē.

Arī šis piemērs nav īsti pareizs, jo tas, vai flagi ir slikti vai nē, ir atkarīgs no tā, vai tu modificē behavior vai arī entity. Tādam "saveOrderAsDraft" vispār nevajadzētu eksistēt, jo draft ir Order īpašība, un ar persistance layer šim steitam diez vai būs kāds sakars.

 

Lūk:

class Order {
    private $isDraft = false;

    public setDraft($draft) {
        $this->isDraft = $draft;
    }

    public isDraft() {
        return $this->isDraft();
    }
}

// ...

$order->setDraft(true);
$db->save($order);

Taču oriģinālajā rakstā autoram ir pilnīga taisnība - no šādas inline konfigurācijas aļa flagiem vajadzētu izvairīties cik vien iespējams. Ne vienmēr tas ir praktiski un reāli izdarāms, taču, jā, tā tam vajadzētu būt.

 

Ps. Jurčik, tas, ko Tu te proponē saucas parameter hell. Un risinājums tam ir konfigurācijas konstrukti. 

// WTF?
function doStuff($relative, $secondOnly = false, $merge = false, $thing = false, $whatever = null, $oneMore = null, $booHoo = false) {
    //...
}

$x = doStuff(true, false, false, null, false, null, false);
// WTF?

// vai arī...

function doStuff(DoStuffOptions $options) {
    //..
}

$options = new DoStuffOptions()
    ->withRelative(true)
    ->secondOnly()
    ->doAMerge()
    ->addThing($thing)
    ->withWhatever($whatever)
    ->addMore($more)
    ->doABooHoo()
;

$x = doStuff($options);
Edited by F3llony
Posted (edited)

>Ps. Jurčik, tas, ko Tu te proponē saucas parameter hell. Un risinājums tam ir konfigurācijas konstrukti.

Tu gribi teikt, ka manā koda piemērā man jātaisa speciāla klase DIVIEM boolean parametriem? Kaut gan jebkurš normāls IDEs un arī dažu advanced text editoru lietotājs var apskatīties, ko tie parametri nozīmē, sekundes laikā?

Edited by jurchiks
Posted

Apskatīties jau var, var arī atvērt dokumentāciju un palasīt un vēl daudz ko. Pats taču sāki runāt par "self documenting" kodu, un f(true,false) nu nekādi tāds nav, jo ir kaut kas kaut kur jāskatās.

Posted

Pliks boolean ir tāds pats ļaunums kā random skaitļi parametros vai aprēķinos (piemērs par meaning of life = 42). Ja izsaukums toties izskatās "doShit($with_this_stuff, YES_MORE, NOT_SURE, YES_PLS)", nevis "doStuff($with_this_stuff, true, false, true)", tad viss ir ok.

Posted

Javā var darīt šādi:

public class Foo {
    public static Baz bar() {
        // Well, how cool is this, eh?
        return new Baz() {{
            isFoo = true;
            isBaz = true;
            method = () -> "Hello World!";
        }};
    }

    private static class Baz {
        boolean isFoo = true;
        boolean isBaz = true;
        ReturnValue method;
    }

    private interface ReturnValue {
        String thing();
    }
}

Posted

Es tādos gadījumos mēdzu uzrakstīt - "doFunc($data, $isDev = true);" pie izsaukuma. Varbūt tā nedrīkst darīt?

Posted (edited)

Ja izsaukums toties izskatās "doShit($with_this_stuff, YES_MORE, NOT_SURE, YES_PLS)", nevis "doStuff($with_this_stuff, true, false, true)", tad viss ir ok.

Kā tas ir ok, ja tu tāpat nezini, ko pieprasa YES_MORE, NOT_SURE, YES_PLS? Atšķirība tikai nosaukumā.

Vismaz izdomā meaningful nosaukumus piemēriem, ja gribi, lai tos uztver nopietni...

 

Javā var darīt šādi:

Ir links uz dokumentāciju? Google nespēj pēc keywordiem ' java constructor "{{" ' neko jēdzīgu atgriezt.

 

Edit: nvm, found it - double-brace initialization.

Bet skatoties pēc stackoverflow komentāriem, izskatās, ka diezgan dārgs/slikti optimizēts pasākums...

Edited by jurchiks
Posted

Kā tas ir ok, ja tu tāpat nezini, ko pieprasa YES_MORE, NOT_SURE, YES_PLS? Atšķirība tikai nosaukumā.

Vismaz izdomā meaningful nosaukumus piemēriem, ja gribi, lai tos uztver nopietni...

 

Ir links uz dokumentāciju? Google nespēj pēc keywordiem ' java constructor "{{" ' neko jēdzīgu atgriezt.

 

Edit: nvm, found it - double-brace initialization.

Bet skatoties pēc stackoverflow komentāriem, izskatās, ka diezgan dārgs/slikti optimizēts pasākums...

Atkarīgs kā izmanto. Ja veido jaunu instanci 10,000 reizes sekundē, obviously. Ja izmanto vienreiz lai nokonfigurētu kaut kādu konfigu, efekts ir 0. Tā pat, kā ar 10000 citām lietām visās valodās. 

Posted

Vismaz izdomā meaningful nosaukumus piemēriem, ja gribi, lai tos uztver nopietni...

"doStuff($with_this, DO_THING_A, DONT_DO_THING_B)" - labāk?

 

 

Tas jau vairāk tāds filozofisks skatījums.

Ja skatamies uz programmēšanas valodu kā konstrukciju, ar ko likt kādai ierīcei darboties konkrētā veidā, tad mēs varētu teikt, ka HTML kods dod browserim programmu, pēc kuras sastādīt attēlu uz ekrāna (vai atskaņot noteiktas skaņas accesibility iekārtā, vai veidot noteiktu attēlu, ko nosūtīt printerim, utt...).

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...