ik heb ooit een keer een heel mooi boekhoudscript gemaakt en deze moet nu een beetje aangepast worden
eigelijk heel veel

het is van jaren allemaal hardcoded in elkaar gezet en eigenlijk bijna geen gebruik van functies

ik heb dus op heel veel paginas 1 en dezelfde code staan die eigenlijk gewoon in een functie zouden moeten

maar op 1 of andere manier weet ik niet meer hoe ik meerdere outputs krijg

input is datum, accountid, userid

output is een hele waslijst
die ik dus individueel moet kunnen opvragen indien dit zou kunnen met een functie
ik zal hier ff een voorbeeld geven van 1 van de codes die er nu in staan





$sqldranken = "SELECT * FROM systeem_invoertotaal WHERE account='$accountid' AND id_user='$userid' AND soort='dranken' AND invoer_over='$datum' ORDER BY id ASC";
$resultaatdranken = $db->sql_query($sqldranken) or die(mysqli_error());
							

$eindtotaaldrankenbtwlaagafgerond = '0';
$eindtotaaldrankenbtwhoogafgerond = '0';

while($omzetdranken = mysqli_fetch_assoc($resultaatdranken)){
$btwsoort = ''.$omzetdranken['btwhoogte'].'';	
															
if($btwsoort == btwlaag) {
$omzetdrankenbtwlaag = mysqli_fetch_array($db->sql_query("SELECT * FROM systeem_invoertotaal WHERE account='$accountid' AND id='$omzetdranken[id]' AND id_dame='$userid' AND soort='dranken' AND btwhoogte='btwlaag' AND invoer_over='$datum';"));

$totaaldrankenbtwlaagafgerond = $omzetdrankenbtwlaag[aantal] * $omzetdrankenbtwlaag[bedrag];												$totaaldrankenbtwhoogafgerond = '0';
												
}
elseif($btwsoort == btwhoog) {
$omzetdrankenbtwhoog = mysqli_fetch_array($db->sql_query("SELECT * FROM systeem_invoertotaal WHERE account='$accountid' AND id='$omzetdranken[id]' AND id_dame='$userid' AND soort='dranken' AND btwhoogte='btwhoog' AND invoer_over='$datum';"));

$totaaldrankenbtwhoogafgerond = $omzetdrankenbtwhoog[aantal] * $omzetdrankenbtwhoog[bedrag];
$totaaldrankenbtwlaagafgerond = '0';
}
else {
$totaaldrankenbtwlaagafgerond = '0';
$totaaldrankenbtwhoogafgerond = '0';
		
}

$eindtotaaldrankenbtwlaagafgerond = $eindtotaaldrankenbtwlaagafgerond + $totaaldrankenbtwlaagafgerond;
$eindtotaaldrankenbtwhoogafgerond = $eindtotaaldrankenbtwhoogafgerond + $totaaldrankenbtwhoogafgerond;							
}




dit is maar een klein stukje maar ik moet gewoon weer ff snappen hoe ik 2 outputs uit een functie krijg
of meerdere

:)

mag ook iets anders zijn als ik het maar op verschillende plekken kan gebruiken
met alles geef ik je gelijk, het zou in meeste gevallen beter zijn met zoiets
(indien ik iets beter zou zijn in nieuwe php scripting)

onderhoud valt mee omdat ik mijn script eigelijk altijd bouw dat het zichzelf opruimt en controleert
en ik maak het bijna altijd gelijk perfect

alleen de manier hoe ik iets maak is vaak via een omweg

dit ben ik dus langzaam stukje bij beetje aan het aanpassen

om deze reden nu dus een paar boekhoudpagina's updaten
reden hiervoor is dat een boekhouder heeft gevraagd of ik iets kon toevoegen in bestaand script

echter bleek hetgeen iets moeilijker te zijn dan ik in eerste instantie dacht en daarom wil ik het geheel herschrijven in verbeterde code zodat ik in toekomst niet weer tegen een boom in mijn bos loop :)
Nog even los van welke technieken en methoden je hiervoor in zou moeten zetten om iets nieuws te maken -en de vraag is of dit allemaal nodig of wenselijk is- zou je ook gewoon kunnen kijken naar de knelpunten en ongewenste situaties die op dit moment bestaan:

- in het verleden is de aardappelstempel iets te royaal gehanteerd, dit alles moet nu ontward worden
- het is nogal gevaarlijk om een soort van mix van een test- en een live-omgeving te hebben, idealiter houd je deze inderdaad strict gescheiden; voor je het weet / in een onbewaakt moment laat je testcode los of live data, en dan heb je de poppen echt aan het dansen (hoe zit het met backups? :p)
- de applicatie zelf leent zich niet echt (?) om makkelijk verplaatst te worden; op dit moment is deze dus een redelijke baksteen; als je deze op zijn minst opsplitst in een "test" en een "live" versie zou deze super makkelijker verplaatst en geupdate moeten kunnen worden; je zult dus moeten gaan nadenken over een soort van modulaire aanpak, waarbij de onderdelen die per omgeving verschillen (denk aan interne paden, databasegegevens, opbouw van interne applicatielinks en andere site-specifieke instellingen) uit een configuratie-bestand komen en/of dynamisch opgebouwd kunnen worden met deze configuratie; wat dus heel belangrijk is is dat je gaat nadenken over de algehele architectuur van jouw applicatie die je in staat stelt om makkelijk te ontwikkelen (en te updaten) zonder de live omgeving omver te gooien

Er valt iets voor te zeggen om iets te bouwen via beproefde methoden, en hier kennis van nemen kan je heel veel inzicht opleveren en is natuurlijk verstandig. Maar de aanpak van de bouw en de vorm van het eindproduct staat niet in steen gehouwen; het is geen noodzakelijke voorwaarde om de bouw van een applicatie precies/letterlijk volgens bepaalde methodieken te laten verlopen om tot een succesvol resultaat te komen. Natuurlijk moet je kennis hebben van de mogelijkheden en gevaren, maar een maatwerk applicatie kan prima een maatwerk aanpak volgen die precies "tailored to fit" is voor de doeleinden van genoemde applicatie.

Mijn eerste stap zou denk ik zijn: zorgen dat ik een aparte test-versie van mijn live applicatie heb die ook daadwerkelijk in een soort van "test modus" kan draaien, helemaal losgekoppeld van de live omgeving. De code hiervan... ik weet niet hoe moeilijk het is om deze los te weken van de live situatie, maar ik zou zeker een poging ondernemen.

Vervolgens gooi je de code van de testomgeving in een eenvoudig code versioning systeem (zou mogelijk niet eens voor GIT gaan) en als je dat gedaan hebt kun je in ieder geval wijzigingen om test en live uit elkaar te trekken volgen in een soort van historie en kun je dit stapsgewijs bewerkstelligen.

Tegelijkertijd opent dit de mogelijkheid om te "spelen" met de locale variant zonder enige implicaties voor de live omgeving (uiteraard op voorwaarde dat deze twee omgevingen op dat moment ook echt 100% gescheiden zijn :P). Op deze manier heb je voor jezelf al een enorme vrijheid gecreëerd om dingen uit te proberen, want op dit moment is dit systeem waarschijnlijk een blok aan je been.

En daarlangs zou je dus een ander (geversioned) systeempje op kunnen gaan zetten waarbij je gaat nadenken over paginaopbouw, algehele systeemstructuur etc, en/of je zou eens een uitstapje naar de database kunnen nemen en kijken hoe e.e.a. handiger/efficiënter opgeslagen kan worden en hoe je dit eventueel van A naar B migreert.

Dit alles dus naar aanleiding van de opzet van een testomgeving die niet (langer) afhankelijk is van jouw live applicatie.
Idealiter wil je ook vanuit de live omgeving de live database terug kunnen halen naar de testomgeving zodat je echt relevant testmateriaal hebt waarmee je kunt experimenteren. En als deze test database dan een keer vernaggeld is: geen probleem, je haalt gewoon de live database weer terug alsof je op een RESET-knop drukt. Hiermee heb je de perfecte zandbak waarin je helemaal los kunt gaan.
er gaat zeker in toekomst en ik hoop snel een echte goede test omgeving komen maar op dit moment heb ik dat nog niet
maar even om terug te komen bij mijn eerste vraag...

zou dit kunnen, of zoiets ...???


function berekening_dranken($in1,$in2,$in3){
  $uit0 = ;
  $uit1 = ;
  $uit2 = ;
  $uit3 = ;
 $uit4 = ;
 $uit5 = ;
 $uit6 = ;
 $uit7 = ;
 $uit8 = ;
 $uit9 = ;
  return [$uit0,$uit1,$uit2,$uit3,$uit4,$uit5,$uit6,$uit7,$uit8,$uit9];
}



$dranken = berekening_dranken(1,2,3);

echo ''.$dranken[uit0].'<br>';
echo ''.$dranken[uit1].'<br>';
echo ''.$dranken[uit2].'<br>';
echo ''.$dranken[uit3].'<br>';
echo ''.$dranken[uit4].'<br>';
echo ''.$dranken[uit5].'<br>';
echo ''.$dranken[uit6].'<br>';
echo ''.$dranken[uit7].'<br>';
echo ''.$dranken[uit8].'<br>';
echo ''.$dranken[uit9].'<br>';



in de functie komt dan dus een sql select met allerlij berekeningen.
je doet niks met $in1, $in2 en $in3?
Het zou een stuk handiger werken als je de variabelen en indexen zinvolle namen geeft ipv 1,2,3 etc.
Ik denk dat TS het abstract bedoeld. Het antwoord is ja dit kan. Maar hou functies liefst kort. Besef ook dat een functie ook een andere functie kan aanroepen die dan een klein stukje van de werkzaamheden voor zijn rekening neemt. Je mag vele verschillende functies aanmaken maar je moet in één zin kunnen uitleggen wat de taak is van een functie. Deze taak moet eenduidig zijn.
je doet niks met $in1, $in2 en $in3?

Nee dat is alleen een invoer waarmee ik gegevens ophaal die ik dus in die functie nodig heb

Het script dat ik gaf was een voorbeeld
Uiteraard komen daar namen in


Ik kan functie kleiner maken maar dan moet ik bv 10 kleine functies maken
Die bij elkaar dus veel groter zullen zijn dan die ene functie
Want elke functies zou dan een select krijgen met een while

Enz enz

Dus wat is wijsheid...

Ik denk 1 goede functie die het meeste berekent

Tuurlijk ga ik proberen het deels te splitsen
Zodat alles lekker snel verloopt

Maar doel van deze functie moet zijn dat ik persoonlijk makkelijk dingen kan aanpassen zonder problemen

En niet dat ik eerst een half bos moet kappen
Om dan uiteindelijk de goede boom te vinden
En dan daarna weer het bos moet terug planten

Lol


De vraag is eigenlijk: wat doe je vervolgens met deze data. Als dit in feite een rapportage van het een of ander omvat die je op een webpagina weergeeft dan zou het waarschijnlijk zinniger zijn om dit gewoon uit te schrijven, en inderdaad de herhalende delen met basistaken (zoals het berekenen van hoge/lage BTW) in functies te vangen.

Ik snap eerlijk gezegd de obsessie om alles in één functie te vangen cq proppen niet. Een functie is (of zou) een generiek ding (moeten zijn) die je vaker hergebruikt. Een functie zou één enkele of een aantal simpele taken voor zijn rekening moeten nemen, maar niet alles moeten doen.

Op het moment dat je een functie in een pagina in zijn totaliteit maar één keer aanroept dan heeft zo'n functie niet zoveel bestaansrecht... tenzij je functies gebruikt als middel om code te groeperen. Maar daarvoor zijn methoden of classes of wellicht complete PHP-bestanden (desnoods zonder OOP) een beter middel om hetzelfde doel te bereiken.

Dit haakt ook weer terug op mijn eerdere opmerking over het structureren van je code. Ik kan op dit moment niet goed beoordelen of functies in deze vorm en opzet de beste manier zijn om jouw doel te bereiken, maar gezien je alles tegelijkertijd door de (één) functie wilt laten regelen is een voorzichtige schatting dat dit niet, of sterker nog, verre van, optimaal is.

Geef ons een concreet voorbeeld van wat je uiteindelijk met behulp van deze functie(s) wilt kunnen doen en hoe deze interactie met elkaar hebben. Dan is het voor ons veel makkelijker om te bepalen of dit een gezond gebruik van deze constructie is. Functies zijn bij lange na niet een soort van heilige graal die alles oplossen... vooral niet als ze zijn toegespitst op een zeer specifiek uniek doel.
>> aaaaaaaa geen bestaande troep aub (sorry dat ik dat troep noem)

Je haalt nu de woede op je hals van een hele grote groep ontwikkelaars die veel meer verstand van zaken hebben dan jij. Dus pas een beetje op wat je zegt.

[waarheid]Was je applicatie in Symfony of Laravel geschreven dan zat je nu niet in de problemen[/waarheid]

Reageren