|
| gør komplex funktion med mange argumenter ~ Fra : scootergrisen |
Dato : 06-07-10 07:13 |
|
Jeg har en funktion som jeg bruger til at vise næsten samtlige
billeder på min hjemmeside.
Fordi funktionen bruges til mange forskellige billeder som har
forskellig behov så har jeg endt med en lang argument liste på ikke
mindre en 13 argumenter i funktionen :
function visbilled($almindeligbilledmappe, $billed, $tekst,
$visdelbilled = false, $linktilstortbilled = false, $ekstrakode = '',
$hovedbilled = false, $width = '', $height = '', $margin = false,
$visorginalbilled = false, $scooterbilled = false, $aldriglinkpabilled
= false){
Når jeg kalder funktionen kan det ser sådan her ud :
visbilled('1', 'billed.jpg', 'billed af kat')
Eller sådan her :
visbilled('1', 'links/' . $billed . '.jpg', $tekst, null, null, null,
null, '168', '149')
visbilled('1', 'overskriftfordataslidea.png', 'grafik venstre', null,
null, 'style="float:left;"', null, '4', '40')
visbilled('1', 'upload_vent.gif', 'vente billed', null, null,
'id="upload_ventvenligst"')
visbilled('0', 'd' . 'd' . $destination_kunfilnavn, 'Uploadet billed',
null, null, null, null, '500', null, null, null, null, true)
Nogen billeder skal have fast størrelse og nogen skal være med i en
css class eller id og nogen skal have style="" kode og nogen skal have
<a href=""></a> alt efter om de er store osv osv.
Men findes der ikke en smartere måde at lave min billed funktion på ?
Som det er nu skal jeg ned i min funktion og tælle hvor mange
argumenter der er når jeg skal indsætte for eksempel billedets bredde
for at det bliver sat det rigtige sted.
Jeg tænker at det måske kan virke bedre med objekt orienteret kode men
jeg har ikke erfaring med dette.
| |
Bertel Lund Hansen (06-07-2010)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 06-07-10 14:37 |
|
scootergrisen skrev:
> Fordi funktionen bruges til mange forskellige billeder som har
> forskellig behov så har jeg endt med en lang argument liste på ikke
> mindre en 13 argumenter i funktionen :
> function visbilled($almindeligbilledmappe, $billed, $tekst,
> $visdelbilled = false, $linktilstortbilled = false, $ekstrakode = '',
> $hovedbilled = false, $width = '', $height = '', $margin = false,
> $visorginalbilled = false, $scooterbilled = false, $aldriglinkpabilled
> = false){
Uden nogen synderlig omlægning kan du lave en lettelse. Når en
parameter får tildelt en default værdi af funktionen, behøver den
ikke optræde i kaldet til funktionen - *men*:
Det forudsætter at der ikke følger en specificeret parameter
efter. Lille eksempel:
function draw
($size,$color,$folder="C:/Windows",$artist="Bertel") {}
Et kald: draw (5,7);
Et andet kald: draw (200,8,"D:/Input");
Hvis du kan flytte om på parametrene så de mindst brugte står
sidst, kan du nok spare en del null-angivelser.
> Jeg tænker at det måske kan virke bedre med objekt orienteret kode men
> jeg har ikke erfaring med dette.
Hvis du laver en meget generel funktion, er du nødt til at kunne
specificere alle de generelle værdier. Det er sådan set
uafhængigt af programmeringssprog og design.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Birger Sørensen (06-07-2010)
| Kommentar Fra : Birger Sørensen |
Dato : 06-07-10 15:46 |
|
scootergrisen har bragt dette til os:
> Jeg har en funktion som jeg bruger til at vise næsten samtlige
> billeder på min hjemmeside.
>
>
> Fordi funktionen bruges til mange forskellige billeder som har
> forskellig behov så har jeg endt med en lang argument liste på ikke
> mindre en 13 argumenter i funktionen :
>
> function visbilled($almindeligbilledmappe, $billed, $tekst,
> $visdelbilled = false, $linktilstortbilled = false, $ekstrakode = '',
> $hovedbilled = false, $width = '', $height = '', $margin = false,
> $visorginalbilled = false, $scooterbilled = false, $aldriglinkpabilled
> = false){
>
>
> Når jeg kalder funktionen kan det ser sådan her ud :
>
> visbilled('1', 'billed.jpg', 'billed af kat')
>
> Eller sådan her :
>
> visbilled('1', 'links/' . $billed . '.jpg', $tekst, null, null, null,
> null, '168', '149')
> visbilled('1', 'overskriftfordataslidea.png', 'grafik venstre', null,
> null, 'style="float:left;"', null, '4', '40')
> visbilled('1', 'upload_vent.gif', 'vente billed', null, null,
> 'id="upload_ventvenligst"')
> visbilled('0', 'd' . 'd' . $destination_kunfilnavn, 'Uploadet billed',
> null, null, null, null, '500', null, null, null, null, true)
>
>
> Nogen billeder skal have fast størrelse og nogen skal være med i en
> css class eller id og nogen skal have style="" kode og nogen skal have
> <a href=""></a> alt efter om de er store osv osv.
>
> Men findes der ikke en smartere måde at lave min billed funktion på ?
> Som det er nu skal jeg ned i min funktion og tælle hvor mange
> argumenter der er når jeg skal indsætte for eksempel billedets bredde
> for at det bliver sat det rigtige sted.
> Jeg tænker at det måske kan virke bedre med objekt orienteret kode men
> jeg har ikke erfaring med dette.
Det ligner godt nok noget, der ikke er nemt at finde rundt i.
Men med generelle funktioner, er det et problem man ofte løber ind i.
Parametre med default, skal altid være sidst.
Når jeg møder den slags, kan jeg godt finde på at oprette et array, og
bruge det som parameter.
Altså oprette et array med alle parametrene - evt en funktion der gør
det -, og så ændre dem der ikke skal være default.
function MkImgParam() {
return Array( 'folder'=>'images', 'billede'=>'billednavn',
'tekst'=>'default tekst', 'del'=>false, 'link'=>false, 'ekstra'=>false,
'height'='200', 'width'=>'300', etc., osv.);
}
$this_img = MkImgParam();
$this_img[ 'billede'] = $billede.'.jpg';
$this_img[ 'width'] = '314';
$this_img[ 'hegiht'] = '76';
// altså æandre alle dem der ikke skal være default...
så kan du kalde funktionen med
visbillede( $this_img);
- men det kræver at du skriver din visbillede() funktion om, så den kan
tage array'et som parameter.
Du kan også gøre arrayet til en global variabel, så er det ikke
nødvendigt med parametren, men i funktionen skal du "hente" det med
global $this_img;
Du skal stadig skrive visbillede() om, og selvfølgelig sørge for at
$this_img indeholder aktuelle data, før funktionen kaldes.
Det gør nok ikke koden mindre, men - IMHO - meget mere overskuelig.
OOP er ganske effektivt, men fungerer bedst når alting er i objekter.
Det er måske i virkeligheden at foretrække, men du vil så skulle skrive
al din kode om.
Sekventiel kode blandet med OOP er noget makværk, som man altid står
sig bedst ved at holde sig fra.
Birger
--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk
| |
Jonathan Stein (06-07-2010)
| Kommentar Fra : Jonathan Stein |
Dato : 06-07-10 20:01 |
|
Birger Sørensen skrev:
> Når jeg møder den slags, kan jeg godt finde på at oprette et array, og
> bruge det som parameter.
Det er jeg også blevet glad for, men stærkt inspireret af CakePHP,
merger jeg arrayet med default-værdierne. Det kunne f.eks. være:
function visbillede($options) {
$options = array_merge(array(
'width' => 100,
'height' => 100,
'margin' => false), $options);
...
}
- og kaldet kunne så være:
visbillede(array('billede' => 'test.jpg', 'width' => 200));
M.v.h.
Jonathan
--
Er din email vigtig? Er du træt af, at din hjemmeside er nede?
Stabilt webhotel på redundant setup med daglig backup.
POP3, IMAP, PHP, JSP, Java, Perl, Python, Telnet, SSH, Cron-jobs m.v.
http://www.jsp-hotel.dk/
| |
Birger Sørensen (06-07-2010)
| Kommentar Fra : Birger Sørensen |
Dato : 06-07-10 21:35 |
|
Jonathan Stein kom med følgende:
> Birger Sørensen skrev:
>
>> Når jeg møder den slags, kan jeg godt finde på at oprette et array, og
>> bruge det som parameter.
>
> Det er jeg også blevet glad for, men stærkt inspireret af CakePHP, merger jeg
> arrayet med default-værdierne. Det kunne f.eks. være:
>
> function visbillede($options) {
> $options = array_merge(array(
> 'width' => 100,
> 'height' => 100,
> 'margin' => false), $options);
> ...
> }
>
> - og kaldet kunne så være:
> visbillede(array('billede' => 'test.jpg', 'width' => 200));
>
> M.v.h.
>
> Jonathan
Fikst
Den skal jeg huske - hvis jeg kan...
Birger
--
http://varmeretter.dk - billig, sund og hurtig mad
http://bbsorensen.dk
| |
Bertel Lund Hansen (06-07-2010)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 06-07-10 22:29 |
|
Jonathan Stein skrev:
> function visbillede($options) {
> $options = array_merge(array(
> 'width' => 100,
> 'height' => 100,
> 'margin' => false), $options);
> ...
> }
> - og kaldet kunne så være:
> visbillede(array('billede' => 'test.jpg', 'width' => 200));
Hvilken værdi har $options['width'] inden i funktionen efter
kaldet?
Test: den har værdien 200. Hvis man bytter om på
merge-rækkefølgen, er den 100:
$options = array_merge(
$options,
array(
'width' => 100,
'height' => 100,
'margin' => false)
);
Det er måske ikke specielt indlysende, men hvis man ved det og
kan stole på det, er det jo fint nok.
--
Bertel
http://bertel.lundhansen.dk/ FIDUSO: http://fiduso.dk/
| |
Johan Holst Nielsen (07-07-2010)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 07-07-10 08:12 |
|
On 2010-07-06 23:28, Bertel Lund Hansen wrote:
> Jonathan Stein skrev:
>
>> function visbillede($options) {
>> $options = array_merge(array(
>> 'width' => 100,
>> 'height' => 100,
>> 'margin' => false), $options);
>> ...
>> }
>
>> - og kaldet kunne så være:
>> visbillede(array('billede' => 'test.jpg', 'width' => 200));
>
> Hvilken værdi har $options['width'] inden i funktionen efter
> kaldet?
>
> Test: den har værdien 200. Hvis man bytter om på
> merge-rækkefølgen, er den 100:
>
> $options = array_merge(
> $options,
> array(
> 'width' => 100,
> 'height' => 100,
> 'margin' => false)
> );
>
> Det er måske ikke specielt indlysende, men hvis man ved det og
> kan stole på det, er det jo fint nok.
Hvis man læser dokumentationen - kan man se man kan stole på det ;)
Så der er intet "farligt" ved det.
Fra php.net/array_merge
"If the input arrays have the same string keys, then the later value for
that key will overwrite the previous one."
I øvrigt skal man jo huske at have input options som sidste - ellers så
man kan overskrive standard værdierne. Blot for at slå det 100% fast :)
Mvh
Johan
| |
Martin (07-07-2010)
| Kommentar Fra : Martin |
Dato : 07-07-10 10:44 |
|
On 07-07-2010 09:12, Johan Holst Nielsen wrote:
> On 2010-07-06 23:28, Bertel Lund Hansen wrote:
>> Jonathan Stein skrev:
>>
>>> function visbillede($options) {
>>> $options = array_merge(array(
>>> 'width' => 100,
>>> 'height' => 100,
>>> 'margin' => false), $options);
>>> ...
>>> }
>>
>>> - og kaldet kunne så være:
>>> visbillede(array('billede' => 'test.jpg', 'width' => 200));
>>
>> Hvilken værdi har $options['width'] inden i funktionen efter
>> kaldet?
>>
>> Test: den har værdien 200. Hvis man bytter om på
>> merge-rækkefølgen, er den 100:
>>
>> $options = array_merge(
>> $options,
>> array(
>> 'width' => 100,
>> 'height' => 100,
>> 'margin' => false)
>> );
Man kan også lave funktionen således
function showImage($path, $alt, array $options = null) {
$defaultOptions = array(
'width' => 100,
'height' => 200
);
extract($defaultOptions);
if ($options) extract($options);
// $height er nu 200
// $width er nu 100 (og i 2. kald af funktionen er den 20)
}
showImage('sti-til-billede', 'tekst');
showImage('sti-til-billede', 'tekst', array('width' => 20));
Dvs alle de oplysninger som ikke har en default værdi, ikke står inde i
noget default halløjsa - mens alle de værdier der kan sættes er inde i
options.
Det smarte ved denne måde er at man ikke kan komme til at lave kald til
funktionen som er forkerte og muligvis vil mangle en ting som gør
HTML'en eller noget helt 3. ugyldig
| |
Leif Neland (07-07-2010)
| Kommentar Fra : Leif Neland |
Dato : 07-07-10 09:48 |
|
"Bertel Lund Hansen" <splitteminebramsejl@lundhansen.dk> skrev i en
meddelelse news:ec7736hq4pifqtqamdenr035qk02e1ijv8@news.stofanet.dk...
> Jonathan Stein skrev:
>
>> function visbillede($options) {
>> $options = array_merge(array(
>> 'width' => 100,
>> 'height' => 100,
>> 'margin' => false), $options);
>> ...
>> }
>
>> - og kaldet kunne så være:
>> visbillede(array('billede' => 'test.jpg', 'width' => 200));
>
> Hvilken værdi har $options['width'] inden i funktionen efter
> kaldet?
>
> Test: den har værdien 200. Hvis man bytter om på
> merge-rækkefølgen, er den 100:
>
> $options = array_merge(
> $options,
> array(
> 'width' => 100,
> 'height' => 100,
> 'margin' => false)
> );
>
> Det er måske ikke specielt indlysende, men hvis man ved det og
> kan stole på det, er det jo fint nok.
>
Huskeregel: "Start med disse værdier (default) og overskriv med disse
($options)", så får man den rigtige rækkefølge.
Lige i dette tilfælde ville jeg ikke have billedet som en option, men en
parameter. Det giver jo ikke mening at kalde visbillede() uden et billede.
Altså: visbillede("mitbillede.jpg",array('width' => 100,'height' => 200));
Eller blot visbillede("ditbillede.jpg");
Leif
| |
|
|