stijl bij lange variabele

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 volgende »

Ozzie PHP

Ozzie PHP

04/11/2013 21:50:38
Quote Anchor link
Het is voornamelijk een kwestie van stijl, maar ik ben toch wel benieuwd wat jullie doen als een parameter een lange waarde heeft. Stop je die waarde eerst in een variabele en geef je die variabele dan door aan de functie? Of stop je de lange parameter rechtstreeks in de functie?

Voorbeeld:
Stel een of andere functie (bijv. processMessage) vraagt om 3 parameters, $message (string), $show (boolean) en $code (int).

Stel nu dat de waarde van $message een vrij lange zin is, maak je hier dan een aparte variabele voor aan, of stop je de message rechtstreeks in de functie, maar laat je de parameters op de volgende regel doorlopen.

Voorbeeldje:

Doe jij dit (situatie A, je maakt een variabele $message aan en die stop je in de functie):

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$who
= 'jullie allemaal';
if ($status === true) {
   $message = 'Dit is best een vrij lange voorbeeldzin zoals ' . $who . ' denk ik wel kunnen zien.';
   $this->processMessage($message, true, 1);
}

?>

Of doe jij dit (situatie B, je stopt de lange waarde meteen in de functie)?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$who
= 'jullie allemaal';
if ($status === true) {
   $this->processMessage('Dit is best een vrij lange voorbeeldzin zoals ' . $who . ' denk ik wel
                          kunnen zien.'
, true, 1);
}

?>
 
PHP hulp

PHP hulp

28/11/2024 16:54:33
 
Eddy E

Eddy E

04/11/2013 21:59:50
Quote Anchor link
Over het algemeen direct in een functie.

Er wordt vaak gewaarschuwd voor het (onnodig) kopieren van variabelen (denk aan $naam = $_POST['naam']).
En hier doe je het helemaal onzinnig.

Of je moet $message dynamisch opbouwen, nog een functie (htmlentities oid) of later nog eens gebruiken... dan gooi ik het in een variabele.
Gewijzigd op 04/11/2013 22:00:25 door Eddy E
 
Ozzie PHP

Ozzie PHP

04/11/2013 22:11:19
Quote Anchor link
Eddy, we gaan even er vanuit dat we $message niet meer nodig hebben.

>> En hier doe je het helemaal onzinnig.

In welk opzicht?

>> Er wordt vaak gewaarschuwd voor het (onnodig) kopieren van variabelen (denk aan $naam = $_POST['naam']).

Klopt, helemaal mee eens. En vandaar ook mijn vraag.

Vanuit performance-oogpunt zal situatie B beter zijn, maar eigenlijk vind ik situatie A wel duidelijker, omdat je hier duidelijker kunt zien wat $message is. Nu is situatie B ook nog goed te lezen omdat het een vrij simpel voorbeeld is. Oké... een al wat lastiger voorbeeldje dan:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$message
= 'The file ' . $file . ' containing ' . $foo . 'could not be saved in ' . $path . '.' . $e->getMessage();
$this->logger->log($message, Logger::Warning, true);
?>

versus

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$this
->logger->log('The file ' . $file . ' containing ' . $foo . ' could not be saved in ' . $path .
                    $e->getMessage(), Logger::Warning, true);
?>

Ik ben benieuwd naar nog meer reacties...
Gewijzigd op 04/11/2013 22:12:19 door Ozzie PHP
 
Wouter J

Wouter J

05/11/2013 06:58:41
Quote Anchor link
Wat is het verschil? Waarom zou ik bij een lange argument waarde opeens willen weten wat het argument voorstelt?
 
Ward van der Put
Moderator

Ward van der Put

05/11/2013 07:25:46
Quote Anchor link
PSR-2: “Argument lists MAY be split across multiple lines, where each subsequent line is indented once. When doing so, the first item in the list MUST be on the next line, and there MUST be only one argument per line.”
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$this
->logger->log(
    'The file ' . $file . ' containing ' . $foo . ' could not be saved in ' . $path . $e->getMessage(),
    Logger::Warning,
    true
);
?>
 
Ozzie PHP

Ozzie PHP

05/11/2013 13:33:11
Quote Anchor link
>> Wat is het verschil? Waarom zou ik bij een lange argument waarde opeens willen weten wat het argument voorstelt?

Echt verschil is er niet... ik dacht alleen dat het wellicht makkelijker zou lezen.

@Ward: dat is inderdaad ook een optie. Zo heb ik het zelf eigenlijk nooit gedaan, maar het ziet er op zich wel oke uit. Doe jij het ook op die manier?
 
Ward van der Put
Moderator

Ward van der Put

05/11/2013 13:44:44
Quote Anchor link
Ozzie PHP op 05/11/2013 13:33:11:
@Ward: dat is inderdaad ook een optie. Zo heb ik het zelf eigenlijk nooit gedaan, maar het ziet er op zich wel oke uit. Doe jij het ook op die manier?

Ja, want met drie ingesprongen regels zie je hier dat log() drie argumenten gebruikt. Dat is de gedachte achter de PSR-recommendation.

Overigens geldt dat alleen bij de limiet van circa 80 tot 120 karakters. Korte expressies plaats je gewoon op één regel. Ga je echter uitschrijven over meerdere regels, dan schrijf je meteen alles uit met de logica "één regel per argument". Bij half uitschrijven plus half aaneenschrijven krijg je willekeur.
 
Ozzie PHP

Ozzie PHP

05/11/2013 13:50:51
Quote Anchor link
>> Bij half uitschrijven plus half aaneenschrijven krijg je willekeur.

Goed punt... dat herken ik inderdaad wel. Alleen die 2 laatste regels, en vooral de allerlaatste, zijn wel een beetje sneu :) Een regel waar alleen maar true op staat :)

Extremer voorbeeld. Jij zou dan dus ook dit doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
$this
->logger->log(
    'The file ' . $file . ' containing ' . $foo . ' could not be saved in ' . $path . $e->getMessage(),
    Logger::Warning,
    true,
    1,
    false,
    12,
    true,
    false
);
?>

En niet dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
$this
->logger->log(
    'The file ' . $file . ' containing ' . $foo . ' could not be saved in ' . $path . $e->getMessage(),
    Logger::Warning, true, 1, false, 12, true, false    
);
?>
 
Ward van der Put
Moderator

Ward van der Put

05/11/2013 13:55:03
Quote Anchor link
Ja, juist dan zou ik het doen. Probeer anders maar eens het 7e argument terug te vinden. Regels tellen is makkelijker dan komma's zoeken. Bovendien kun je dan ook nog commentaar per regel en dus per argument toevoegen.
 
Ozzie PHP

Ozzie PHP

05/11/2013 14:03:01
Quote Anchor link
Oké, leuke tip. Daar kan ik denk ik wel wat voordeel uithalen. Ik ga het ook eens proberen :)
 
Ozzie PHP

Ozzie PHP

07/11/2013 02:23:35
Quote Anchor link
Ward, toch nog even een vraagje... die argumenten over meerdere regels vind ik wel mooi!

Maar wat doe je nu als 1 van de argumenten een heel lange string is die niet op 1 regel past?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
$this
->foo(
  'Dit is een ongelofelijk, belachelijk lange zin die te lang is om op 1 regel te plaatsen zoals je waarschijnlijk wel kunt zien. Maar hoe verdeel je die over meerdere regels?',
  true,
  false
);
?>

Ga je dan dit doen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$this
->foo(
  'Dit is een ongelofelijk, belachelijk lange zin
   die te lang is om op 1 regel te plaatsen zoals
   je waarschijnlijk wel kunt zien. Maar hoe verdeel
   je die over meerdere regels?'
,
  true,
  false
);
?>

Of ga je dan nog eens extra inspringen of iets dergelijks?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$this
->foo(
  'Dit is een ongelofelijk, belachelijk lange zin
     die te lang is om op 1 regel te plaatsen zoals
     je waarschijnlijk wel kunt zien. Maar hoe verdeel
     je die over meerdere regels?'
,
  true,
  false
);
?>
 
Ward van der Put
Moderator

Ward van der Put

07/11/2013 07:24:16
Quote Anchor link
Dan zou ik hier toch de versie met drie aparte regels voor drie argumenten gebruiken.

Maar ik begrijp wat je bedoelt: waar ligt de grens dan? Als het dramatisch wordt, zou ik de aanbevolen limiet van 80 karakters aanhouden. Alleen zó blijft de tekst makkelijk te lezen, bewerken, vertalen, printen...

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
/*      1 0       2 0       3 0       4 0       5 0       6 0       7 0       8 0
---------+---------+---------+---------+---------+---------+---------+---------+  */

$bar->setFoo(
    'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
        philosophi Graeco sermone tractavissent, ea Latinis litteris
        mandaremus, fore ut hic noster labor in varias reprehensiones
        incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
        hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
        remissius agatur, sed tantum studium tamque multam operam ponendam in
        eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
        contemnentes Latinas, qui se dicant in Graecis legendis operam malle
        consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
        vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
        dignitatis esse negent.'
,
    true,
    false
);
?>
Gewijzigd op 07/11/2013 07:24:38 door Ward van der Put
 
Ozzie PHP

Ozzie PHP

07/11/2013 14:33:04
Quote Anchor link
Ah oke... maar je springt de string (zeg dat eens 10x achter elkaar) dus wel in zie ik. Je doet dus niet dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$bar
->setFoo(
    'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
     philosophi Graeco sermone tractavissent, ea Latinis litteris
     mandaremus, fore ut hic noster labor in varias reprehensiones
     incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
     hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
     remissius agatur, sed tantum studium tamque multam operam ponendam in
     eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
     contemnentes Latinas, qui se dicant in Graecis legendis operam malle
     consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
     vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
     dignitatis esse negent.'
,
    true,
    false
);
?>

Of laten we eens heel gek doen... dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$bar
->setFoo(
    '
        Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
        philosophi Graeco sermone tractavissent, ea Latinis litteris
        mandaremus, fore ut hic noster labor in varias reprehensiones
        incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
        hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
        remissius agatur, sed tantum studium tamque multam operam ponendam in
        eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
        contemnentes Latinas, qui se dicant in Graecis legendis operam malle
        consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
        vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
        dignitatis esse negent.
    '
,
    true,
    false
);
?>
Gewijzigd op 07/11/2013 15:00:08 door Ozzie PHP
 
Ward van der Put
Moderator

Ward van der Put

07/11/2013 14:55:33
Quote Anchor link
Ozzie PHP op 07/11/2013 14:33:04:
Ah oke... maar je springt de string (zeg dat eens 10x achter elkaar) dus wel in zie ik.
Ja, want met die inspringingen zie je nog steeds dat het drie argumenten zijn. Stel je maar eens hetzelfde voor met drie van die argumenten (waar in het voorbeeld nu slechts booleans staan).

Een lastiger voorbeeld is deze autoloader met een anonieme functie. Toch blijft duidelijk wat de drie argumenten van spl_autoload_register() zijn en waar de anonieme functie begint en eindigt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
spl_autoload_register(
    function(
$classname)
        {

            $classname = ltrim($classname, '\\');
            $filename = (string) null;
            if ($last_namespace_position = strrpos($classname, '\\')) {
                $namespace = substr($classname, 0, $last_namespace_position);
                $classname = substr($classname, $last_namespace_position + 1);
                $filename = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
            }

            $filename .= str_replace('_', DIRECTORY_SEPARATOR, $classname) . '.php';
            $filename = __DIR__ . DIRECTORY_SEPARATOR . $filename;
            require $filename;
        },

    true,
    true
);
?>

Eén regel is hier langer dan 80 karakters, maar zit nog binnen de 120 karakters. Dat vind ik een duidelijkere oplossing dan $namespace afkorten tot $ns: afkortingen doen soms meer afbreuk aan de leesbaarheid dan lange regels code. De interne PHP-constante heet immers ook DIRECTORY_SEPARATOR en niet DIR_SEP.
 
Ozzie PHP

Ozzie PHP

07/11/2013 15:02:34
Quote Anchor link
Ward, excuus... ik was de php tags vergeten in mijn vorige bericht :-/
Kun je nog even reageren op mijn vraag?

Wat betreft jouw laatste bericht... waarom doe je bijv. niet dit?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
spl_autoload_register(
    function(
$classname) {
        $classname = ltrim($classname, '\\');
        $filename = (string) null;
        if ($last_namespace_position = strrpos($classname, '\\')) {
            $namespace = substr($classname, 0, $last_namespace_position);
            $classname = substr($classname, $last_namespace_position + 1);
            $filename = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
        }

        $filename .= str_replace('_', DIRECTORY_SEPARATOR, $classname) . '.php';
        $filename = __DIR__ . DIRECTORY_SEPARATOR . $filename;
        require $filename;
    },

    true,
    true
);
?>

Of zorg je altijd dat alleen de allereerste regel van het argument op de beginpositie staat, en dat de rest inspringt?
 
Ward van der Put
Moderator

Ward van der Put

07/11/2013 15:38:23
Quote Anchor link
Kan ook, over de K&R-stijl versus de Allman-stijl heb ik al eens wat geschreven in een boek...

Belangrijk is vooral overzicht op een relatief klein schermoppervlak. Stel dat je snel wat moet fixen op een notebook omdat een site er ergens uit ligt. Dan wil je vooral niet per ongeluk op een verkeerde plaats iets toevoegen of verwijderen.

Geen van de laatste voorbeelden vind ik in dat opzicht wezenlijk beter of slechter dan de andere.
 
Ozzie PHP

Ozzie PHP

07/11/2013 15:44:44
Quote Anchor link
>> Kan ook, over de K&R-stijl versus de Allman-stijl heb ik al eens wat geschreven in een boek...

Ik wist niet dat die stijlen een naam hadden... wat is het wezenlijke verschil?

Maar als ik het goed begrijp is het dus enigszins een kwestie van persoonlijke voorkeur?
 
Wouter J

Wouter J

07/11/2013 15:52:41
Quote Anchor link
Het is kwestie van persoonlijke voorkeur en voorkeur van de context. Als ik bijv. iets maak voor symony moet ik me houden aan hun code standards, als ik iets schrijf voor doctrine moet ik me houden aan de doctrine code standards.

Binnen een bedrijf heb je als het goed is ook code standards. En als het helemaal goed is zorgen al deze standards dat ze compatible zijn met de psr standards, aangezien dat ervoor zorgt dat alle php mensen over de wereld jou code begrijpen en kunnen integreren in hun project.
 
Ozzie PHP

Ozzie PHP

07/11/2013 15:56:06
Quote Anchor link
Maar deze 3 opties zijn dus allemaal "goed", alleen is het net wat je zelf het prettigst vindt (of hebt afgesproken). Correct?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
---------+---------+---------+---------+---------+---------+---------+---------+  */
$bar->setFoo(
    'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
        philosophi Graeco sermone tractavissent, ea Latinis litteris
        mandaremus, fore ut hic noster labor in varias reprehensiones
        incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
        hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
        remissius agatur, sed tantum studium tamque multam operam ponendam in
        eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
        contemnentes Latinas, qui se dicant in Graecis legendis operam malle
        consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
        vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
        dignitatis esse negent.'
,
    true,
    false
);
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
$bar
->setFoo(
    'Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
     philosophi Graeco sermone tractavissent, ea Latinis litteris
     mandaremus, fore ut hic noster labor in varias reprehensiones
     incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
     hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
     remissius agatur, sed tantum studium tamque multam operam ponendam in
     eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
     contemnentes Latinas, qui se dicant in Graecis legendis operam malle
     consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
     vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
     dignitatis esse negent.'
,
    true,
    false
);
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$bar
->setFoo(
    '
        Non eram nescius, Brute, cum, quae summis ingeniis exquisitaque doctrina
        philosophi Graeco sermone tractavissent, ea Latinis litteris
        mandaremus, fore ut hic noster labor in varias reprehensiones
        incurreret. Nam quibusdam, et iis quidem non admodum indoctis, totum
        hoc displicet philosophari. Quidam autem non tam id reprehendunt, si
        remissius agatur, sed tantum studium tamque multam operam ponendam in
        eo non arbitrantur. Erunt etiam, et ii quidem eruditi Graecis litteris,
        contemnentes Latinas, qui se dicant in Graecis legendis operam malle
        consumere. Postremo aliquos futuros suspicor, qui me ad alias litteras
        vocent, genus hoc scribendi, etsi sit elegans, personae tamen et
        dignitatis esse negent.
    '
,
    true,
    false
);
?>
 
Ward van der Put
Moderator

Ward van der Put

07/11/2013 16:05:28
Quote Anchor link
Kwestie van smaak inderdaad. Ik noemde deze voorbeelden ook omdat de PSR-recommendation er geen duidelijk antwoord op geeft. Het zijn ook wel extreme voorbeelden, die in het wild weinig voorkomen.

De K&R-stijl is vernoemd naar Brian Kernighan en Dennis Ritchie, de auteurs van het beroemde standaardwerk The C Programming Language uit 1978. Dit wordt ook wel de One True Brace Style en afgekort 1TBS of OTBS genoemd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?
if ($iets) {
    // <...>
}
?>

De Allman-stijl is vernoemd naar Eric Allman en ziet er zo uit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?
if ($iets)
{

    // <...>
}
?>

Verwaarloosbaar detail, zou je misschien zeggen. Maar wacht tot we de code gaan uitbreiden.

Bij de K&R-stijl is duidelijk bij welke if een else hoort:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?
if ($iets) {
    // <...>
} else {
    // <...>
}
?>

Bij de Allman-stijl kan de else echter uit beeld verdwijnen, letterlijk omdat je niet verder kijkt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?
if ($iets)
{

    // <...>
}
else
{
    // <...>
}
?>

In dat leidt tot ellende:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?
if ($iets)
{

    // <...>
}
/**
 * Nieuwe blok PHP-code
 *
 * Oeps, nu gaat het fout! De Allman-stijl kan verwarrend zijn.
 * Staat de if nu op zich? Of wordt de if nog gevolgd door een elseif of else?
 */

else
{
    // <...>
}
?>

En ja: de PSR-recommendation gebruikt beide stijlen door elkaar :)
 
Wouter J

Wouter J

07/11/2013 16:09:18
Quote Anchor link
Nog een extra toevoeging van Ward. In de tijd dat programmeren net een beetje opkwam gebruikte zo'n beetje iedereen Vim. In vim heb je handige shortcuts waarbij je snel van het begin { naar het eind } kan bewegen, om zo bijv. snel de hele functie te kunnen kopiëren. Deze shortcuts werken alleen als de { of } op een nieuwe regel staan, vandaar dat dat vroeger voornamelijk werd gebruikt.

De PSR recommendation gebruikt ze door elkaar, maar niet willekeurig. Over het algemeen wordt de K&R stijl gebruikt, behalve bij classes en methods.
 

Pagina: 1 2 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.