jb4 Posted September 27, 2006 Report Share Posted September 27, 2006 Mēs esam sarakstījuši funkciju bibliotēkas. Bibliotēkās ir funkcijas, kurām padod atsevišķus gaidītus parametrus un tad viņas apstrādā tos parametrus un izdara gaidītās lietas. Viss ir jauki, bet vienu dienu mēs gribam, lai šī funkcija ņem vērā tūkstoš citu lietu, kuras līdz šim neesam padevuši kā parametrus. Rakstīt jaunu funkcijas versiju, kur paredzēt jaunos parametrus? Tas, ka var iekļaut f-jā neparedzētu parametru apstrādi, nav gluds risinājums. Un tā katru dienu jaunu funkciju? Šīs problēmas risināšanai pēdējā laikā izmantoju šādu metodi: uzrakstu jaunu f-jas versiju ar diviem parametriem - $input un $handler, kur $input ir viss tradicionālais ievads un $handler ir nosaukums f-jai, kura interpretēs $input ņemot vērā visu iespējamo nevis tikai tos dažus parametrus, kurus padevām vecajai f-jas versijai. Tālāk piemērs kodā f-jai, kas no asociatīva masīva, kas veidots formā [value]=>label uzģenerē HTML formā noderīgu <option> elementu sarakstu: <?php // Tipiskas f-jas function optionsList($options,$value) { foreach ( $options as $optValue=>$optLabel ) { ?> <option value="<?=$optValue?>"<?=($optValue==$value)?' selected="selected"':''?>><?=$optLabel?></option> <?php } } // F-jas, kādas iesaku rakstīt function optionsList2($options,$value,$optionsHandler=null) { if ( is_null($optionsHandler) ) { foreach ( $options as $optValue=>$optLabel ) { ?> <option value="<?=$optValue?>"<?=($optValue==$value)?' selected="selected"':''?>><?=$optLabel?></option> <?php } } else { foreach ( $options as $option ) { list($optValue,$optLabel) = call_user_func($optionsHandler,$options); ?> <option value="<?=$optValue?>"<?=($optValue==$value)?' selected="selected"':''?>><?=$optLabel?></option> <?php } } } ?> Apdarinātāji (handlers) ir foršā padarīšana. Tā man izdodas saglabāt loģikas nodalījumu no vizualizēšanas. Lai kāds būtu izvads, šādām funkcijām padodu jēlus, neapstrādātus datus, jo tur, no kurienes, es viņas izsaucu, man nav laika speciāli taisīt tieši konkrētai vietai noformētus datus. Ja kādai vietai vajag speciāli noformētus datus, tad tos noformēsim caur apdarinātāju. Cerams, ka noder arī jums. Link to comment Share on other sites More sharing options...
v3rb0 Posted September 27, 2006 Report Share Posted September 27, 2006 (edited) saprotu ka dropdowns ir kā labs piemērs, bet vai nesanāk tā ka tā daļa kas, universālajā f-jā būtu jābūt visiem kopīga ir tikai nosaukums, atverošā un aizverošā figuriekava, bet pārējais viss iet handlerī? ja gribetu php izplūst ar universālām f-jām, tad es taisītu kaut vai 10mit īsas f-jas un tad tās kombinētu kopā vienu iekš otras, idejiski kaut kas mazdrusciņ līdzīgi kā funkcionālajā programēšanā. Edited September 27, 2006 by v3rb0 Link to comment Share on other sites More sharing options...
Grey_Wolf Posted September 27, 2006 Report Share Posted September 27, 2006 hmm manupraat pastuulbi :( kaapeec viss jaserezgjii? LAi Skripts leenaak straadaatu + buutu gruutaak lasaams? Katrai probleemai savu f-ju un viss... Man pa siem gadiem sakraajusies neliela bibli. kur kaadas 20-30 daudzmaz unversaalas f-jas... taas kombineejot varu dabuut gandriiz visu man vajadziigo.... Link to comment Share on other sites More sharing options...
bubu Posted September 27, 2006 Report Share Posted September 27, 2006 Ha ha, a bet pythonā funkciju dekoratori šajā vietā sintaktiski radītu daudz skaistāku kodu - multimetodes. Nemaz nerunājot par normālu valodu funkciju overloadingu :) php rulz, protams. Link to comment Share on other sites More sharing options...
goldy Posted September 27, 2006 Report Share Posted September 27, 2006 neredzu jēgu tam visam, ju nu vienīgi jo sarezgītāk, jo labāk. tad labāk tiešām uztaisi klasi, vai kā savadāk sabāz funkcijas vienā failā ( tās kuras tev ceļo no viena projekta uz otru) un visas problēmas būs atrisinātas. bet šādi rādīt listbox nu ir pa traku. Link to comment Share on other sites More sharing options...
GedroX Posted September 27, 2006 Report Share Posted September 27, 2006 Varbūt šis ir tāds paslikts piemērs, bet doma ir akceptējama. Labāks piemērs būtu php funkcija usort(), kurai arī var definēt tādu kā handler-i, šajā gadījumā salīdzinošo funkciju, kura pasaka, kurš no diviem elementiem ir lielāks, bet visus elementus sakārto pati. Link to comment Share on other sites More sharing options...
Recommended Posts