[Alg] Netjes programmeren - (niet syntax/outlining related)*

Pagina: 1
Acties:
  • 574 views sinds 30-01-2008
  • Reageer

  • Waster
  • Registratie: September 2006
  • Laatst online: 14-04 17:49
Ik heb al redelijk wat ervaring met talen met php en javascript, maar ik vind het lastig om mijn codes overzichtelijk te houden. Met opmaaktalen als html, css of xml lukt het wel, maar met scripttalen ;( Ik wilde verdergaan aan een php-project van een paar maanden geleden en ik kon er geen kaas van maken (onduidelijke variabelen, if-statements en functies die dwars door elkaar staan, te veel script op een pagina, onduidelijke paginaverdeling, te weinig documentatie enz.). Daarom wil ik leren netjes te programmeren. Daarbij bedoel ik: wat moet ik documenteren, hoe zorg ik voor een duidelijke verdeling van de verschillende pagina's, wat moet ik in functie's zetten, hoe zorg ik voor goede namen voor mijn documenten, functies, variabelen. Ik ben een scriptkiddie, maar ik ga straks verder op een opleiding en ik wil mijn slechte gewoontes alvast afleren.
Weet iemand wat voor boeken of tutorials op internet mij zouden kunnen helpen?

Modbreak:Zoals je aan de topic-titel en de 'topic-waarschuwing' van dit topic kunt zien, is het niet de bedoeling dat het hier over uitlijning, gebruik van whitespace, haakjes, etc.... gaat.

[ Voor 9% gewijzigd door whoami op 07-06-2007 11:03 ]


  • MisterData
  • Registratie: September 2001
  • Laatst online: 27-11 20:42
Probeer je code meer te schrijven als een verhaal: begin bij het begin (variabelen initialiseren en duidelijke namen geven, vertellen waar ze voor zijn), deel je code vervolgens op in kleine brokjes die iets doen (en de lastige dingen documenteer je). Lees het daarna nog eens door om te kijken of het te volgen is voor iemand anders. Als iemand anders het kan volgen, dan kun jij dat ook als je de code na een paar maanden weer eens voor ogen krijgt :)

Uiteraard spreekt het voor zich dat je netjes tabs/indenting gebruikt :) Functies maak je het liefst niet groter dan op je scherm past (eventuele documentatie in de code daargelaten). Verder moet je voor functies eigenlijk de Unix-filosofie toepassen; één functie moet één ding doen, en dat goed doen.

[ Voor 25% gewijzigd door MisterData op 06-06-2007 17:43 ]


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 01:41

MueR

Admin Devschuur® & Discord

is niet lief

Ik denk dat je weinig boeken of tutorials zult vinden over netjes programmeren, omdat iedere programmeur er een eigen stijl op na houd. Zie bijvoorbeeld onderstaand verschil:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Stijl 1
if ($var == true)
{
  // doe iets
}
// Stijl 2
if ($var)
{
  // doe iets
}
// Stijl 3
if ($var == true) {
  // Doe iets
}

Enzovoorts....

Wat je natuurlijk wel kan doen, is je structuur duidelijk opzetten. Je zou bijvoorbeeld met classes kunnen gaan werken, wanneer je veel bewerkingen op 1 object (bijvoorbeeld een user) moet doen.
Ook is het maken van documentatie bij een functie altijd handig. Bijvoorbeeld aangeven welke variabelen er opgegeven moeten worden, welk type deze zijn (int, string, float, bool etc), en een korte omschrijving van het nut van de functie.
PHP:
1
2
3
4
5
6
7
8
9
10
11
/**
 * Deletes the user
 *
 * @param int $UserID The user's ID
 * @param bool $Delete Delete the user?
 * @return bool User deleted?
 */
function deleteUser($UserID, $Delete)
{
  // Deleten die hap
}

Anyone who gets in between me and my morning coffee should be insecure.


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ik heb wel mezelf aangeleed om veel whitespace te gebruiken, als je je code na een paar maanden er weer bijpakt kan je er teminste nog iets van maken. Zowiezo veel inspringen, rustig een paar tabjes, niet met 1 of 2 spaties gaan kloten. Duidelijke statements gebruiken, dus:
PHP:
1
2
3
4
if( $var == true )
{

}

ipv
PHP:
1
if($var)?$do:$else;

Er zijn hier trouwens een aantal onderwerpen over langsgekomen.

[ Voor 32% gewijzigd door Megamind op 06-06-2007 17:55 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Netjes programmeren gaat imho verder dan 'mooi indenteren/veel whitespace gebruiken/consistent zijn met naamgeving/commentaar'.
Netjes programmeren houd -imho- ook in dat je je houd aan bepaalde principes; geef een class / method niet teveel verantwoordelijkheid / taken (single responsability principe), zorg voor voldoende abstractie, maar overdrijf er ook niet in, etc...

https://fgheysels.github.io/


  • pietje63
  • Registratie: Juli 2001
  • Laatst online: 01-12 12:26

pietje63

RTFM

Wat ik bij de laatste paar sites ook gedaan heb is meer (en gedocumenteerde) logica in bestanden en mappen.
een map met pagina-specifieke scripts, een map met algemene includes, een map met taalbestanden.
Verder in het begin van je bestand middels een comment aangeven wat er allemaal in te vinden is.

Ik ben ook geen prof. ofzo qua dit, maar ik heb wel gemerkt dan anderen hierdoor makkelijker met mijn code om kunnen gaan.

De grootste Nederlandstalige database met informatie over computers met zoekfunctie!!


  • ruurdkrekt
  • Registratie: November 2003
  • Laatst online: 18-11 15:30
Met php 5 kun je heel mooi object georienteerd programmeren. Dan hou je mooi bepaalde functionaliteit in 1 class. Bovenin je class kun je dan bijvoorbeeld een stukje commentaar zetten met wat de class doet, de functie zeg maar. En dan voor elke functie weer een klein commentaar blok met de werking.

Zoals pietje63 ook al aangeeft houdt dit je geheel overzichtelijk en is het voor anderen ook aangenamer om jouw code te lezen.

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Megamind schreef op woensdag 06 juni 2007 @ 17:53:
Ik heb wel mezelf aangeleed om veel whitespace te gebruiken, als je je code na een paar maanden er weer bijpakt kan je er teminste nog iets van maken. Zowiezo veel inspringen, rustig een paar tabjes, niet met 1 of 2 spaties gaan kloten. Duidelijke statements gebruiken, dus:
PHP:
1
2
3
4
if( $var == true )
{

}

ipv
PHP:
1
if($var)?$do:$else;

Er zijn hier trouwens een aantal onderwerpen over langsgekomen.
Waarom geen spatie na if?
Zoals in de topic-warning al staat te lezen: laat het geneuzel over whitespace, etc... achterwege

[ Voor 8% gewijzigd door whoami op 06-06-2007 20:10 ]

Motor-forum.nl


Verwijderd

Als je netjes wilt programmeren is het verstandig eens iets te lezen over design patterns. Dat leert je op een iets abstractere manier naar problemen kijken, waardoor je vaak met een meer solide oplossing komt.

Waarom mond een topic over "netjes coden" toch altijd uit in gemierenneuk over haakjes, spaties en control structures?

  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Verwijderd schreef op woensdag 06 juni 2007 @ 19:09:
Als je netjes wilt programmeren is het verstandig eens iets te lezen over design patterns. Dat leert je op een iets abstractere manier naar problemen kijken, waardoor je vaak met een meer solide oplossing komt.

Waarom mond een topic over "netjes coden" toch altijd uit in gemierenneuk over haakjes, spaties en control structures?
Hij vraagt er specifiek om.

edit: hmm, nee, toch verkeerd gelezen... twee maal ;)

[ Voor 5% gewijzigd door Bananeman op 06-06-2007 19:13 ]

Motor-forum.nl


  • Marcks
  • Registratie: April 2007
  • Laatst online: 02:57
Afgezien van het overzichtelijk coden, moet je ook de documentatie niet onderschatten. Ik ben persoonlijk niet zo'n fan van commentaar (code zie ik graag kort en krachtig), maar een lijstje van 'moeilijke' variabelen met een omschrijving kan best handig zijn als 'kladblaadje'. Ook een overzichtelijke lijst van functies en dergelijke, is vaak handig (functie blabla vereist parameters dit en dat, van het type zus en zo en retourneert dit van het type dat). Bij ingewikkelde programma's (of stukjes daarvan) wil het ook nog wel eens helpen om een flowchart te maken. Houd dan de blokken die je in het schema hebt verwerkt, ook aan als 'blokken' in je code.

Ik veronschuldig mij bij voorbaat voor het bovenstaande.


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

waarom begin je niet eens bij je eigen code?

Overloop al de code waar je je aan ergert, schrijf voor jezelf op WAT je er slecht aan vindt.
Herschrijf dan die code volgens wat je hebt genoteerd.

Programmeren is altijd een beetje trial en error ;)

ASSUME makes an ASS out of U and ME


Verwijderd

H!GHGuY schreef op woensdag 06 juni 2007 @ 19:22:
waarom begin je niet eens bij je eigen code?

Overloop al de code waar je je aan ergert, schrijf voor jezelf op WAT je er slecht aan vindt.
Herschrijf dan die code volgens wat je hebt genoteerd.

Programmeren is altijd een beetje trial en error ;)
Op zich een prima tip. Maar los van trial and error weet elke doorgewinterde programmeur dat het uitvinden van het wiel een kostbare bezigheid kan zijn. Mijn ervaring is dat als je een goed gevulde gereedschapskist hebt, met behalve ervaring óók kennis (van design patterns en andere deeloplossingen), je veel beter in staat bent te bepalen woe een applicatie in elkaar hoort te zitten. En dat je dus voor je een regel code hebt geschreven, al een aardig idee hebt van wat je gaat doen.

  • M-ThijZ
  • Registratie: Maart 2003
  • Laatst online: 01-12 09:48

M-ThijZ

Riding on Rails

Marcks schreef op woensdag 06 juni 2007 @ 19:13:
Ook een overzichtelijke lijst van functies en dergelijke, is vaak handig (functie blabla vereist parameters dit en dat, van het type zus en zo en retourneert dit van het type dat).
Alsjeblieft niet zeg! Dat zou betekenen dat je bij een wijziging van de functie ook meteen je oh zo handige kladblaadje moet bijwerken. Zorg er in ieder geval voor dat je het DRY principle in gedachten houdt.

[ Voor 1% gewijzigd door M-ThijZ op 06-06-2007 19:37 . Reden: Link gefix0red ]


  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024

Mei

Waarom wel?
Modbreak:En je zag de topicwaarschuwing niet :?

[ Voor 15% gewijzigd door RobIII op 06-06-2007 19:37 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Verwijderd schreef op woensdag 06 juni 2007 @ 19:09:
Als je netjes wilt programmeren is het verstandig eens iets te lezen over design patterns. Dat leert je op een iets abstractere manier naar problemen kijken, waardoor je vaak met een meer solide oplossing komt.
Idd, en dat is wat ik ook probeerde aan te halen in m'n eerste post in dit topic.
Echter, je moet je ook niet blindstaren op de patterns zelf, maar kijk eerder naar de principes die erachter kunnen zitten, zoals 'Single Responsability' (je method / class heeft 1 verantwoordelijkheid, en niet meer), het Liskov principe, etc...

Ga dus geen monolitische blokken code gaan schrijven, maar zorg ervoor dat iedere class / method een wel-omlijnd doel heeft. Abstraheer als je kan.

Als je deze dingen toepast, en ook voor een aantal goede tests zorgt, dan is het meteen ook makkelijker om je code te wijzigen, mocht dit nodig zijn. (Refactoring of wijzigingen die nodig zijn omwille van een wijziging in de specificaties / business logica)
Marcks schreef op woensdag 06 juni 2007 @ 19:13:
Afgezien van het overzichtelijk coden, moet je ook de documentatie niet onderschatten. Ik ben persoonlijk niet zo'n fan van commentaar (code zie ik graag kort en krachtig), maar een lijstje van 'moeilijke' variabelen met een omschrijving kan best handig zijn als 'kladblaadje'. Ook een overzichtelijke lijst van functies en dergelijke, is vaak handig (functie blabla vereist parameters dit en dat, van het type zus en zo en retourneert dit van het type dat). Bij ingewikkelde programma's (of stukjes daarvan) wil het ook nog wel eens helpen om een flowchart te maken. Houd dan de blokken die je in het schema hebt verwerkt, ook aan als 'blokken' in je code.
Hou het dan wel bij nuttige documentatie. Een statement als 'i++' bv voorzien van een comment 'verhoog i met 1' is behoorlijk onzinnig.
Als je je daarentegen vasthoud aan SRP, dan zullen je methods/functies zowiezo al behoorlijk kort zijn, en kunnen ze betrekkelijk 'self-documenting' zijn. Als je daarnaast dan nog eens goede namen kunt verzinnen voor die methods, dan is het nog wat duidelijker, en als je die method voorziet van een stuk commentaar waarin je globaal uitlegt wat die functie doet, wat het doel van die functie is, wat de output ervan is, en wat de betekenis van de argumenten die je evt aan die method meegeeft, dan ben je helemaal goed bezig.

[ Voor 57% gewijzigd door whoami op 06-06-2007 20:12 ]

https://fgheysels.github.io/


  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Deze vraag heb ik mezelf een paar weken terug ook gesteld.
ik ben dan wel een amatuer, maar ik heb geleerd dat je bijna niet kunt overdrijven met functies
(of classes, maar mijn host is php4)


Alle functies die met elkaar in verband staan groepeer je zodat je makelijk nieuwe functies kunt toevoegen aan je bestaande functies, gebruikmakende van je eigen functies.
Dat impliceerd dat je veel "kleine" functies zal hebben, zoals eerder aangehaald, functies die maar 1 ding doen.
Functies hoor je ook goed te documenteren, en uitgebreid schijven = makelijker leesbaar. dingen compact schrijven doe je alleen je er snelheid mee kunt winnen (parsetijd).


1 belangrijke regel die ik heb gevonden is, zorg dat je AL je data hebt, voor alleer je begint te echo'n.
Dit is mijn gouden tip, daarmee concentreer je je variabelen op 1 plek in het document (bovenaan), waarna je duidelijk ziet wat de output wordt.


Een andere gouden tip, is alles relatief houden, met name vooral je links, en je mapnamen.
Dit is een energie vragende regel, maar mocht je je bedenken over je site-structuur, dan kun je in een wip heel je site wijzigen.
Vooral bij links is het ook intressant, omdat je op deze manier vorige $_GET waardes kun behouden.
code:
1
2
$setting = '?page=' . $_GET['page'] . '&';
<a href="<?php echo $setting; ?>page=1">pagina 1</a>

*ik gebruik geen shorttags
Alles wat de bezoeker zou willen opslaan in een bookmark, sla ik op in $settings (taal, layout, fontsize)
Zelfs al zul je initieel er geen gebruik van maken, is het verstandig om zoweinig met absolute waardes/paden te werken. Nogmaals, het loont de moeite.

Mijn slechte manier van programmeren is dat ik niet consequent ben

bij uitgebreide functies doe ik het zo:
code:
1
2
3
4
5
6
7
funtion foobar(){
     for ( $i = 0 ; $i < 100 ; $i++){
        if ( $i = 10) {
              foo = 'bar';
        }
    }
}



bij kleinere gebeurt het zo
code:
1
2
3
4
5
funtion foobar(){
    for ( $i = 0 ; $i < 100 ; $i++){
    if ( $i = 10)  foo = 'bar';
    }
}



in inline doe ik het zoals bij het link-voorbeeld.
Dit om maar aan te tonen: "Le goût et les couleurs, ça ne se discute pas"
* ieder zijn smaak, zin manier van doen, zijn manier van denken

http://www.softfocus.be/


  • Waster
  • Registratie: September 2006
  • Laatst online: 14-04 17:49
Bedankt voor de veel nuttige reacties. Zoals de moderators ook zeggen was dit topic was inderdaad niet bedoeld om over whitespace en inspringen te neuzelen.

Maar wat zijn precies design patterns? Ik zie een heel leuke beschrijving, maar heb je dan niet een boek nodig waar oplossingen van design patterns instaan?
H!GHGuY schreef op woensdag 06 juni 2007 @ 19:22:
waarom begin je niet eens bij je eigen code?

Overloop al de code waar je je aan ergert, schrijf voor jezelf op WAT je er slecht aan vindt.
Herschrijf dan die code volgens wat je hebt genoteerd.

Programmeren is altijd een beetje trial en error ;)
Daar ben ik het mee eens, maar wat Cheatah zegt is het niet handig om steeds het wiel opnieuw uit te vinden. Daarom vroeg ik me af of er gewoon een boek is die een solide basis vormt wanneer ik wat grotere projecten moet programmeren. Laat ik het dan anders vragen. Hoe hebben jullie dan geleerd om netjes te programmeren? Ook met een boek? Of hebben jullie alles ook zelf moeten ontdekken wat het prettigste en overzichtelijkste werkt?

Een van mijn problemen is dat ik te weinig tijd neem om het project voor te bereiden. Als ik een plan heb en deze globaal heb uitgewerkt begin ik met programmeren om later tegen de lamp te lopen. Dan moet je later weer dingen aanpassen in een toch al rommelige code. Sommige mensen hier noemen dat volgens mij spaghettiecode. Daarom een vraag aan jullie, hoe moet ik het proces precies zien? Ik zag in een ander topic dat er drie weken een project werd voorbereid zonder één regel code te schrijven. Hoe lang zou je ongeveer met voorbereiden bezig moeten zijn en hoeveel tijd ben je dan bezig met het programmeren zelf? Want als je alles in blokjes en functies zou opdelen, dan betekend het volgens mij ook dat je van te voren goed nagedacht moet hebben over de structuur.

  • Mei
  • Registratie: Juni 2005
  • Laatst online: 17-10-2024

Mei

Mei schreef op woensdag 06 juni 2007 @ 19:36:
[...]


Waarom wel?
[modbreak]En je zag de topicwaarschuwing niet :?[/modbreak]
Nee, serieus overheen gelezen.

Dat elke functie slechts één ding moet doen is wel een handige om te onthouden. Krijg je wat minder een kluwen van functies van. Bedankt voor de tip :)

Verwijderd

Maar wat zijn precies design patterns? Ik zie een heel leuke beschrijving, maar heb je dan niet een boek nodig waar oplossingen van design patterns instaan?
Lees er eerst eens wat meer over op google etc, vervolgens zou je kunnen denken aan het aanschaffen van Head First Design Patterens van Freeman & Freeman (O'Reilly, 0596007124), eenvoudig te doorgronden boek :)

Kijk bijvoorbeeld eens naar MVC (model-view-controller) een belangrijk principe wat zorg draagt (of moet zorgdragen) voor het gescheiden houden van layout en logic etc.

[ Voor 18% gewijzigd door Verwijderd op 06-06-2007 21:21 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Waster schreef op woensdag 06 juni 2007 @ 21:09:
Maar wat zijn precies design patterns? Ik zie een heel leuke beschrijving, maar heb je dan niet een boek nodig waar oplossingen van design patterns instaan?
Design patterns zijn 'standaard-patronen / oplossingen' om een bepaald probleem op te lossen. Een boek is handig, aangezien je daar wel wat meer uitleg in over vind.
Het GoF boek, en Design Patterns Explained
zijn 2 uitstekende boeken. Het eerste boek is wat 'droog', maar het 2de geeft je zeker een goed inzicht in wat DP's zijn, en hoe je zelf naar DP's kunt toewerken. (Er wordt uitleg gegeven over 'commonality/variability analyse', en is zeker interessant).
Als je meer over Design Patters op een wat hoger niveau wilt weten (bv Unit of Work, Specification), dan is Patterns of Enterprise Application Architecture van Fowler wellicht iets voor je.
Daarom vroeg ik me af of er gewoon een boek is die een solide basis vormt wanneer ik wat grotere projecten moet programmeren.
Zowiezo hebben we een apart boekentopic, waar je misschien eens een kijkje kan nemen.
Laat ik het dan anders vragen. Hoe hebben jullie dan geleerd om netjes te programmeren? Ook met een boek? Of hebben jullie alles ook zelf moeten ontdekken wat het prettigste en overzichtelijkste werkt?
Hoe leer je dat ... boeken, leren van anderen, ontdekken, doen.
Als ik een plan heb en deze globaal heb uitgewerkt begin ik met programmeren om later tegen de lamp te lopen. Dan moet je later weer dingen aanpassen in een toch al rommelige code.
Eigenlijk zou je niet bang mogen zijn om je code aan te passen, zonder nieuwe functionaliteit bij te voegen. Gewoon aanpassen dus, om het design beter te maken (refactoring). Natuurlijk bestaat de vrees dan wel dat je iets kapot maakt wat daarvoor wel goed werkte. Echter, hierbij kunnen unit-tests een hulpmiddel zijn.

[ Voor 10% gewijzigd door whoami op 06-06-2007 21:24 ]

https://fgheysels.github.io/


  • NetForce1
  • Registratie: November 2001
  • Laatst online: 23:17

NetForce1

(inspiratie == 0) -> true

Test Driven Development kan ook een heel handig hulpmiddel zijn om een mooi systeem op te zetten, maar het blijft natuurlijk een hulpmiddel, geen garantie... Verder raad ik je aan een fatsoenlijke IDE te gebruiken zodat je normaal kunt refactoren zonder bang te zijn dat je van alles sloopt.

De wereld ligt aan je voeten. Je moet alleen diep genoeg willen bukken...
"Wie geen fouten maakt maakt meestal niets!"


  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Waster schreef op woensdag 06 juni 2007 @ 21:09:

Daar ben ik het mee eens, maar wat Cheatah zegt is het niet handig om steeds het wiel opnieuw uit te vinden. Daarom vroeg ik me af of er gewoon een boek is die een solide basis vormt wanneer ik wat grotere projecten moet programmeren. Laat ik het dan anders vragen. Hoe hebben jullie dan geleerd om netjes te programmeren? Ook met een boek? Of hebben jullie alles ook zelf moeten ontdekken wat het prettigste en overzichtelijkste werkt?
Wat erg goed werkt is de kunst afkijken van anderen. Er is veel source code gratis te downloaden, daar kun je veel uit leren. Natuurlijk is er ook veel "slechte" source code te downloaden, dus weet waar je het van afkijkt. Het kan geen kwaad om eens wat coding standards te downloaden en deze aandachtig te lezen. Er is geen perfecte stijl die bij elke programmeertaal en elke programmeur past. Het is deels een kwestie van smaak en afspraken die je onderling (in geval van een team van programmeurs) met elkaar maakt.
Een van mijn problemen is dat ik te weinig tijd neem om het project voor te bereiden. Als ik een plan heb en deze globaal heb uitgewerkt begin ik met programmeren om later tegen de lamp te lopen. Dan moet je later weer dingen aanpassen in een toch al rommelige code. Sommige mensen hier noemen dat volgens mij spaghettiecode. Daarom een vraag aan jullie, hoe moet ik het proces precies zien? Ik zag in een ander topic dat er drie weken een project werd voorbereid zonder één regel code te schrijven. Hoe lang zou je ongeveer met voorbereiden bezig moeten zijn en hoeveel tijd ben je dan bezig met het programmeren zelf? Want als je alles in blokjes en functies zou opdelen, dan betekend het volgens mij ook dat je van te voren goed nagedacht moet hebben over de structuur.
Er is een verschil tussen "clean" programmeren (in de zin van: whitespacing e.d.) en gestructureerde software bouwen. Het laatste is een absolute voorwaarde als je met grotere projecten bezig gaat. Het kan er bijvoorbeeld aan bijdragen dat je ontwikkeltijd niet uit de klauwen loopt, het aantal fouten zo laag mogelijk is, de onderhoudbaarheid zo goed mogelijk is, je met een team aan het project kunt werken, etc. Gestructureerd werken is een absoluut vereiste voor grotere projecten maar is ook zeker zinvol voor kleine projectjes.

Motor-forum.nl


  • alx
  • Registratie: Maart 2002
  • Niet online

alx

Ik kan me voorstellen dat je na een hele trits aan tips in dit topic niet weet waar/hoe je moet beginnen. Hoe begin je nou met een goede opzet als je die lege pagina voor je hebt, wat zijn goede abstracties en dan moet je ook nog ergens design patterns toepassen :?

Netals bij leren schrijven in het algemeen, kun je ook netter leren programmeren door goede voorbeelden te lezen (en evt later wat proberen aan te passen). Ga op zoek naar enkele goed geschreven stukken code van het type dat relevant is voor je (hier web script programming) en met een doel dat je interesseert (bv producten tonen, zoeken, gegevens beheer, whatever). Goede code herkennen is veel makkelijker dan goede code schrijven. Het hoeft helemaal niet een complete app te zijn. Bedenk (of typ in een kladje) voor jezelf waarom je die code goed vindt. Na een paar keer ga je zelf wat aanpassen of schrijven. Voel je bij het zelf schrijven vrij om structuren, abstracties en opzet te kopieren (in tegenstelling tot letterlijke code). Dit is bij het schrijven in het algemeen common practise. (Bij programmeren ook, maar ik heb het idee dat minder programmeurs dat toegeven, dan bij boek/artikel auteurs het geval is.)

Tenslotte, netjes (code) schrijven leer je niet in een week (of maand). Neem af en toe (zeg iedere week) een keer de tijd om je skills op dit punt aan te scherpen. Vraag ook eens een keer iemand om wat commentaar op je eigen code te geven. Er gaat geen (wetensch) artikel een tijdschrift in voordat velen hun commentaar hebben geuit.

  • Chester
  • Registratie: September 2003
  • Niet online
Als je nog geen eigen programmeer stijl hebt gevonden, raad ik je aan het boek Code Complete van Steve McConell door te nemen. Daar staan heel wat nuttige dingen in :)

[ Voor 3% gewijzigd door Chester op 06-06-2007 21:41 ]

"The test of a work of art is, in the end, our affection for it, not our ability to explain why it is good." - Stanley Kubrick | Trakt


  • pderaaij
  • Registratie: Oktober 2005
  • Laatst online: 18-08 20:16
Geen idee of het slim is, maar misschien is het eens de moeite waard om naar voorbeelden in combinatie met PHP frameworks te bekijken.

Kijk naar wat tutorials en voorbeelden van bijvoorbeeld CakePHP. Kijk hoe ze het daar scheiden door middel van het MVC pattern.

Verwijderd

een paar regels die ik volg zijn(voor PHP vooral, niet bewust in deze volgorde).

# 1 functie doet 1 ding en doet dat goed

# een class/functie is geheel voor zichzelf verantwoordelijk.
in PHP5 kun je private gebruiken maar in PHP4 is de regel gewoon nooit direct met de variable van een class werken. maak daar een simpele get/set method voor. ook andere methode's van de zelfde class kunnen die methode gebruiken om met class variable werken. dus i.p.v $this->fp gebruik je $this->get_fp();. op die manier kun je ook de naam van je variable aanpassen zonder dat de andere methode's hier iets van werken.

# check, check, double check.
naast dat je altijd moet kijken of de argumenten die een functie ontvangt wel van het juiste type moet je ook kijken of de inhoudt relevant is. dus een bijvoorbeeld een strpos functie controlleert niet alleen of haystack een string is maar ook of haystack wel enige bytes bevat. dus
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
 function strpos($haystack, $needle, $offset)
 {
  if(!is_string($haystack)){
    trigger_error("Haystack is not an string but if it was an empty string i would't know.", E_USER_WARNING);
   return false;
  }
  if((!is_string($haystack)) OR (strlen($haystack) < 1)){
    trigger_error("Haystack is not an string or its an empty string.", E_USER_WARNING);
   return false;
  }

}


# als je een object bijvoorbeeld als reference moet terug geven is het makkelijker een array terug te geven in plaats van de functie een return-by-refernce te maken. niet alleen zijn dan alle functie's homogeen en geven dus altijd kopieen terug ook maakt het het makkelijker om bijvoorbeeld extra info mee te geven. daarnaast is het zo gedaan: $return_array = array(0 => &$object, 1 => $debug); return $return_array. in PHP5 is dit geloof ik niet meer nodig maar het blijft een nette methode om objecten en andere reference's terug te geven.

# gebruik E_USER_WARNING en E_USER_NOTICE.
E_WARNING is bedoeld voor interne PHP functies. E_USER_WARNING is voor user functies. zelfde gaat op voor E_NOTICE en E_USER_NOTICE.

# geef boolean FALSE terug in als er een error was, TRUE of een waarde voor success.
door consistent FALSE terug te geven en een E_USER_WARNING error te geven wordt error-handling een heel stuk makkelijk omdat het in 1 opslag duidelijk is of een functie heeft gewerkt. vergeet niet met de === operator te checken dat je FALSE hebt en niet bijvoorbeeld de waarde 0 wat een success kan zijn. als FALSE een geldige return waarde kan zijn gebruik ik meestal NULL hoewel ik niet zeker weet hoe === NULL reageert wordt NULL wel gezien als een apart type geloof ik.

# vermijd type-juggeling.
hoewel dit een welkome functie is voor beginnend programmeurs is het een kwaal geest voor de meer complexere functies. regelmatige checks op type zoals in punt 3 voorkomen dat je bijvoorbeeld een float geeft aan een functie die een integer verwacht. door expliciet naar integer te casten voordat je de parameter doorgeeft voorkom je dit soort fouten een float wordt ge-trunked. een string wordt ge-interpeteerd en boolean's worden een 1 of een 0. de rest wordt dan 0. door in de functie niet alleen te kijken naar type maar ook inhoudt kun je dit soort onverwachte cast vroegtijdig stoppen en afhandelen.

# 1 class per file
omdat php classess niet kan opdelen in meedere files wordt het helemaal een ramp om meedere classess te defineeren in 1 enkele file.

# stop functies met soortgelijke functionaliteit in een class zonder constructor of anderre OO functionaliteit. dus geen $this gaan gebruiken. omdat PHP geen verschill maakt tussen een globale functie en een methode die statische wordt aangeroepen je deze functies in een class stoppen en zo krijg je een soort namespace effect waarbij je dus heel makkelijk een soort van liberies kunt gaan makken die je dan aanroept via (libery name)::(function name). op die manier vervuil je de globale namespace niet en hoe je geen prefix te bedenken voor je functies. daarnaast staat heel duidelijk in de manual dat de global namespace aan PHP is voorbehouden en PHP kan dus zo een functie toevoegen met dezelfde naam waarna je applicatie het dus niet meer doet.

# noem class bestanden 'classname.class.php' en liberies 'libery.lib.php'.
hoewel dit meer een persoonlijke voorkeur is doe je er goed aan om je bronbestanden duidelijk te verdelen in 'classes', 'liberies', 'functies' en 'direct uitvoerbaar' welke dus direct door php mogen worden geopened. de andere zijn bedoeld voor eenmalige inclusion met include_once.

# 1 include header voor je hele project.
zoals elke goede programmeur probeer je presentatie en functie zoveel mogelijk te scheiden. door 1 header te maken welke al je classes en functies include wordt het erg makkelijk om je gehele codebase in 1 keer te laden en voortebereiden.

# gebruik constanten waarvoor ze bedoeld zijn.
constanten zijn uitermate geschikt om globale configuratie's te regelen zoals de include directory of de standaard plaatjes directory. door gebruik te maken van een enkele include header kun je al je constants op 1 plek defineeren.

# het eerste wat je moet doen is je error_reporting op E_ALL zetten.
zet op de volgende regel alvast je productie reporting maar comment het uit zoals:
PHP:
1
2
 error_reporting(E_ALL);
 //error_reporting(E_ALL ^ E_NOTICE ^ E_USER_NOTICE);


# wees kort maar duidelijk met documentatie in de broncode.
geef bij elke class definitie een kort stukje text over wat de class moet doen en voeg bij elke functie een kort stukje text met wat de functie moet doen. deze documentatie is natuurlijk geen vervanging maar meer een bij fail-safe voor mensen die je code doorspitten. echte documentatie over hoe jou code werkt en wat welke functie/class doet moet natuurlijk in een documentatie bestand.

# definieer altijd al je variable voordat je begint met de werkelijk uitvoer van een functie. de de logische structuur van elke functie is:
1) check argumenten
2) defineer variable en initaliseerd deze met een default waarde.
3) voer de functie uit.
4) verzamel het resultaat en geeft dat terug.

# vermijd het gebruik van }else{ clausule's.
in plaats van een else te defineeren maak je van de IF self de else. dus je check of het tegenover gestelde, dat wat de else zou uitvoeren waar is. zoniet dan skip je de if en ga je verder. op die manier vermijd je onodig indenten en wordt je code een heel stuk duidelijker. hier een voorbeeld.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// hoe het dus niet moet

 $fp = fopen("filename.txt", "rb");
  if($fp !== false){
   $data = fread($fp, filesize($filename));
    if(is_string($data)){
     return $data;
    }else{
      trigger_error("Failed to read data from file-pointer.", E_USER_WARNING);
     return false;
    }
  }else{
    trigger_error("Failed to open file-pointer.", E_USER_WARNING);
   return false;
  }

// hoe het ook kan

 $fp = fopen("filename.txt", "rb");
  if($fp === false){
    trigger_error("Failed to open the file-pointer.", E_USER_WARNING);
   return false;
  }

 $data = fread($fp, filesize("filename.txt"));
  if((!is_string($data)) OR (strlen($data) < 1)){
    trigger_error("Failed to read data from file-pointer.", E_USER_WARNING);
   return false;
  }

   if(!fclose($fp)){
    trigger_error("Sluiten is wel zo netjes. ik geeft ik een notice omdat een warning soms wat overdreven is.", E_USER_NOTICE);
   }

 return $data;

en je ziet dat het een veel schonere manier van omgaan met logische structuren is omdat de consiqentie wordt getest. natuurlijk werkt dit alleen met boolean logica dus waarbij als het het een niet is dan moet het wel het ander zijn.

ik zou zo nog wel even door kunnen gaan met 'good coding habbits' voor PHP. veel ervan geldt ook voor andere programmeer talen zoals C of Java. eigenlijk zouden we hier een stiky van moeten maken omdat veel van de problemen die we terug zien in PHP-topics zijn wel terug te lijden zijn naar 1 van deze adviezen. ook geeft ik toe dat sommige mischien wat overdreven zijn maar over het algemeen lijdt dit wel tot structureel nette code waar bug's makkelijk zijn te vinden aanpassingen vlot zijn gemaakt.

  • Shinji
  • Registratie: Februari 2002
  • Laatst online: 22:19
Waar ik zelf altijd mee zit (vooral met PHP bezig) is dat ik wel diverse classes en functies netjes krijg, maar om het dan tot een geheel te weven in zeg een index.php blijf ik lastig vinden. Dat bestand word dan bij mij al snel onoverzichtelijk.

  • EdwinG
  • Registratie: Oktober 2002
  • Laatst online: 30-11 19:23
Verwijderd schreef op woensdag 06 juni 2007 @ 23:09:
# geef boolean FALSE terug in als er een error was, TRUE of een waarde voor success.
door consistent FALSE terug te geven en een E_USER_WARNING error te geven wordt error-handling een heel stuk makkelijk omdat het in 1 opslag duidelijk is of een functie heeft gewerkt. vergeet niet met de === operator te checken dat je FALSE hebt en niet bijvoorbeeld de waarde 0 wat een success kan zijn. als FALSE een geldige return waarde kan zijn gebruik ik meestal NULL hoewel ik niet zeker weet hoe === NULL reageert wordt NULL wel gezien als een apart type geloof ik.
Daar hebben we is_null() voor.

Bezoek eens een willekeurige pagina


  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Chester schreef op woensdag 06 juni 2007 @ 21:41:
Als je nog geen eigen programmeer stijl hebt gevonden, raad ik je aan het boek Code Complete van Steve McConell door te nemen. Daar staan heel wat nuttige dingen in :)
Hier ben ik het mee eens! Ik vind het een erg goed boek, het is fijn geschreven, informatief met de nodige humor, en er staan duidelijke voorbeelden in. De stof kan met mede geinteresseerden tot leuke discussie leiden.

[ Voor 3% gewijzigd door storeman op 07-06-2007 00:24 ]

"Chaos kan niet uit de hand lopen"


Verwijderd

Vaak heb ik hetzelfde probleem. Het enige wat (voor mij) lijkt te werken zijn duidelijk afscheidingen.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
////////////////////////////////////////
// Controleren of X wel aan Y voldoet //
////////////////////////////////////////
function foobar()
    {
    for ( $i=0 ; $i<100 ; $i++)
        {
        if ( $i=10)
            {
            foo='bar';
            }
        }
    }

/////////////////////
// Uitvoeren van Z //
/////////////////////
etc...

Dus behalve goede whitespace (waar je het dus niet over wilt hebben) zet ik voor elk nieuw stukje code / onderdeel een soort van titel, zodat je tijdens het scrollen makkelijk een bepaald stukje terug kan vinden. Uiteindelijk komt het er op neer dat je begrijpt wat het script doet, door alleen maar de titels te lezen. Het is lastig om op gang te komen en in het begin moet je de titels vaak wijzigen om te leren doeltreffende en korte stukken tekst op te schrijven. Veelgebruikte titels bijvoorbeeld:

* controleren of user cookie heeft
* controleren of cookie nog geldig is
* nieuwe cookie opslaan
* verbinden met database
* sql query opgeven (t.b.v. uitlezen pageviews)
* sql query uitvoeren
* resultaten sql querie verwerken
* verwerkte resultaten (pageviews) weergeven
* etc...

Verwijderd

weet ik, maar === NULL is netter omdat het een duidelijke expressie is terwijl is_null() een functie call is. daarnaast is het consistenter omdat === betekent check waarde EN type. wat precies in het rijtje === true en === false past.

al blijft het natuurlijk een stukje persoonlijke stijl de vraag was meer of er uitzondering bestaat die gelijk is aan NULL === NULL. voor === true en === false bestaan die niet maar NULL is een speciaal geval.

@tygetjuh
wat ik meestal doe is dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 function vorige_functie()
 {
 }

// nieuw block van functies die iets met mekaar te maken hebben
// ================================(tot het einde van je scherm ofzo)

 function new_function_of_a_diffrent_catagory()
 {
 }

 function another_function_of_the_same_catagory()
 {
 }

// nog een block van functies, ge-ordered naar samenhang en grote
// ================================================================

 function big_function_starting_something()
 {
 }

 function _smaller_function_assisting_big_function()
 {
 }

 function i_also_start_a_chain_of_function_calls()
 {
 }

 function _and_i_help_him_with_it()
 {
 }

ook gebruik ik een enkele underscore als prefix in de naam om aan te geven dat die functie bedoeld is als helper functie en dus normal niet direct zou moeten worden aangeroepen. met PHP5 los je dat natuurlijk op met het private keyword. maar in PHP4 is een enkele underscore genoeg om aan te geven dat de programmeur zich op glad ijs bevindt. een dubble underscore '__' wordt door php gezien als magical en is dus voorbehouden aan speciale functionaliteit zoals '__wakeup()' en '__tostring()'.

[ Voor 48% gewijzigd door Verwijderd op 07-06-2007 00:54 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Verwijderd schreef op donderdag 07 juni 2007 @ 00:41:
Dus behalve goede whitespace (waar je het dus niet over wilt hebben) zet ik voor elk nieuw stukje code / onderdeel een soort van titel, zodat je tijdens het scrollen makkelijk een bepaald stukje terug kan vinden.
Boven alle niet-triviale functies een korte beschrijving zitten is niets mis mee. Als je echter die beschrijving continue nodig hebt om een functie te vinden zijn je functienamen niet goed.

{signature}


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Naar mijn idee is de belangrijkste eigenschap van netjes programmeren: "Separation of Concerns". Het concept is al zo oud als ik weet niet wat, het is ook toepasbaar in de echte wereld. Het werkt in OO, maar ook in andere soorten talen (misschien minder efficient) zoals PHP (als je niet OO werkt). Ook templating kan separation of concerns zijn.

Het enige risico bij separation of concerns is mijns insziens dat je de verantwoordelijkheden niet kunt plaatsen en ze op de verkeerde plaats zet.

Fat Pizza's pizza, they are big and they are cheezy


  • 4of9
  • Registratie: Maart 2000
  • Laatst online: 13-12-2024
Ik zou willen verwijzen naar het boek Code Complete van Steve McConnell. Dat boek gaat precies hierover. (hoewel OO niet echt heel uitgebreid aan bot komt).

Hmm iemand was me voor :)

[ Voor 8% gewijzigd door 4of9 op 07-06-2007 09:58 . Reden: ff laten weten dat ik gezien heb dat het al genoemd was :) ]

Aspirant Got Pappa Lid | De toekomst is niet meer wat het geweest is...


Verwijderd

Modbreak:Ik denk dat de titel, de topicwaarschuwing, en de modbreaks in dit topic toch duidelijk zijn ?

[ Voor 84% gewijzigd door whoami op 07-06-2007 11:11 ]


  • g4wx3
  • Registratie: April 2007
  • Laatst online: 12-10 08:33
Modbreak:Ik denk dat de titel, de topicwaarschuwing, en de modbreaks in dit topic toch duidelijk zijn ?

[ Voor 88% gewijzigd door whoami op 07-06-2007 11:11 ]

http://www.softfocus.be/


  • orf
  • Registratie: Augustus 2005
  • Laatst online: 22:14

orf

Voor commentaar ben ik erg fan van phpDoc. Je commentaar is consistent; een fatsoenlijke editor / ide gebruikt het voor hints en je kunt een mooie chm file bakken.

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
Goede code schrijven, iedereen heeft er een mening over en bijna iedereen heeft zijn eigen unieke methode.... overeenkomsten tussen iedereen is het gebruiken van een coding standard, gebruik van een goede omgeving, het schrijven van documentatie en het makkelijk toe voegen van nieuwe functionaliteiten of het wijzigen van bestaande functionaliteiten.

Mijn tips: lees het boek Code Complete, lees veel andermans code en veel van je oude code en noteer voor je zelf wat je goed vind en slecht...

Pascal


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Ikzelf werk erg veel via interfaces. Daarin implementeer ik als het ware de functionaliteit die ik verwacht, niet hoe ik deze waar ga maken. Aan de ene kant van de interface kan iedereen er vanuit gaan dat die interface zo werkt, en aan de andere kant kan de implementatie gewoon doen wat hij wil zolang hij zich aan het gewenste resultaat voldoet. In principe krijg je hierdoor een soort topdown approach.

Voorbeeldje van iets waar ik de laatste tijd mee bezig ben geweest:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
package com.janoz.news;

import java.util.List;

import com.janoz.news.vo.NZB;

public interface NZBProcessor {

    /**
     * Process a NZB object. This might be downloading it or storing it.
     * @param nzb The to be processed NZB object
     * @throws RetrieveException 
     */
    public void processNZB(NZB nzb) throws RetrieveException;
    
    /**
     * Validates the configuration of this object. Throws an exception 
     * if the configuration has errors.
     * @throws RetrieveException 
     */
    public void validate() throws RetrieveException;
    
    /**
     * 
     * @return A list of NZB objects currently in the queue
     * @throws RetrieveException
     */
    public List<NZB> getQueue() throws RetrieveException;
}

In mijn gehele applicatie ga ik gewoon uit van een werkende NZBProcessor. Hoe deze werkt maakt me daar geen kont uit. De daadwerkelijke implementatie is redelijk uitgebreid (koppeling met sabnzbd), maar bij de implementatie hoef ik helemaal niks van de rest van de applicatie te weten. Door deze scheiding zo duidelijk neer te leggen blijft alles mooi overzichtelijk en heeft een aanpassing op de ene plek in de code nauwelijks gevolgen voor de rest van je applicatie.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • Waster
  • Registratie: September 2006
  • Laatst online: 14-04 17:49
Meer reacties dan ik had durven denken _/-\o_ . Heel veel nuttige tips van Docey ook, bedankt.

Maar ik ga ook zeker even kijken in het boekentopic. Eerlijk gezegd kende ik dat forum (Software Engineering & Architecture) helemaal niet :o en misschien had mijn topic daar ook niet misstaan.

Ik heb code complete al een aantal keren gehoord en die kwam ook in het boekentopic voor dus ik zal zeker kijken naar dit boek in de boekwinkel. Helaas wel 15 dagen levertijd -O- Ik heb nu nog geen een boek over programmeren, maar wel een hele stapel boekenbonnen. In Utrecht, in de boekwinkel selexyz, schijnt een aparte afdeling Informatica te zijn. Daar ga ik dus zoeken naar boeken over programming om mijn boekenkast te vullen. Als er nog andere boekentips zijn die van mij een betere programmeur kunnen maken hoor ik het nog graag :) .

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Een van de belangrijkste aspecten mijns inziens is dat je eerst na gaat denken over wat je precies wil bereiken. Als je dat duidelijk weet, ga je bedenken HOE je het wil bereiken. Aan de hand daarvan werk je een class structuur uit. Pas op het moment dat je de functionaliteit voor ogen hebt, en een datastructuur hebt, ga je functionaliteit implementeren.

Applicaties waar je gewoon meteen induikt en dus lekker uit gaat werken lopen eigenlijk altijd op een rotzooitje uit.

Verder moet je code leesbaar zijn. Als je codedocumentatie nodig hebt (ik zeg niet dat het slecht is,
integendeel), is je code te slecht.

Tenslotte: 1 functie per functie. Een functie doet maar '1' ding, en is in princiepe op 1 scherm weer te geven. Wordt 'ie langer dan dat, dan is je functie waarschijnlijk te complex en moet je gaan splitten.

https://niels.nu


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:32

Janoz

Moderator Devschuur®

!litemod

Hydra schreef op donderdag 07 juni 2007 @ 15:53:
Verder moet je code leesbaar zijn. Als je codedocumentatie nodig hebt (ik zeg niet dat het slecht is,
integendeel), is je code te slecht.
Mwah, hier ben ik het niet helemaal mee eens. uiteraard moet je code redelijk selfexplaining zijn, maar zeker wanneer je wat complexere dingen aan het implementeren bent wil je de draad nog wel eens kwijtraken wanneer je een paar weken later nog eens in de code duikt (of in de code van iemand anders).

Wat ik zelf vaak doe is eerst in psuedo code uitschrijven wat er moet gebeuren in een functie. Dat schrijf ik dan heel highlevel uit in woorden. Dit zijn over het algemeen regeltjes van een paar woorden die elk meerdere regels code vertegenwoordigen. De comentaar regeltjes laat ik gewoon staan en ik schrijf de code er tussen.

Vaak voeg ik ook nog een beetje commentaar toe, maar dat zijn vooral kleine stukjes om aan te geven waarom ik iets doe, en niet wat ik doe. Vaak zijn dit kleine reminders over waarom ergens een +1 bij moest of waarom ik ergens vanuit kan gaan.

Bij de methode's zelf schrijf ik vervolgens wel wat uitgebreidere documentatie. Over het algemeen een beschrijving van de parameters en van de teruggegeven waarden. Daarnaast beschrijf ik ook even een paar randgevallen (of een parameter bijvoorbeeld wle of neit null mag zijn).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Hydra schreef op donderdag 07 juni 2007 @ 15:53:
[..]
Applicaties waar je gewoon meteen induikt en dus lekker uit gaat werken lopen eigenlijk altijd op een rotzooitje uit. [..]
Ik weet niet of dit per definitie waar is. Test Driven Development is toch wel een vorm waarbij je direct de code induikt zonder eerst een structuur op te zetten. Zelf duik ik graag in het diepe en schrijf de tests later. Noem het voor het gemak een organische vorm van programmeren.

  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Verwijderd schreef op donderdag 07 juni 2007 @ 16:11:
[...]
Ik weet niet of dit per definitie waar is. Test Driven Development is toch wel een vorm waarbij je direct de code induikt zonder eerst een structuur op te zetten. Zelf duik ik graag in het diepe en schrijf de tests later. Noem het voor het gemak een organische vorm van programmeren.
Hmm, toch even nuanceren.
Bij Test Driven Development is het zo dat je eerst je Test schrijft, aan de hand van een use-case. Op dat moment ga je dus wel al gaan nadenken over 'hoe wil ik die code gebruiken', 'hoe moet de interface van m'n classes, m'n API er uit zien'.
Deze manier van werken levert in de meeste gevallen wel duidelijke, verstaanbare interfaces/api's op (self-explaining zoals Janoz het noemt, intention-revealing zoals Eric Evans het noemt).
Hydra schreef op donderdag 07 juni 2007 @ 15:53:
Verder moet je code leesbaar zijn. Als je codedocumentatie nodig hebt (ik zeg niet dat het slecht is,
integendeel), is je code te slecht.
Oei, ik heb net een method signature geschreven (de method moet ik nog implementeren), maar die method heeft wel al 22 lijnen commentaar die uitlegt wat die method doet, waarom ze bestaat, en in welke gevallen ze nodig is....
Om maar eens aan te geven dat ik het niet eens ben met jouw statement. :)

[ Voor 28% gewijzigd door whoami op 07-06-2007 16:17 ]

https://fgheysels.github.io/


  • YopY
  • Registratie: September 2003
  • Laatst online: 06-11 13:47
even over het topic gevlogen, wat ik wel zie is dat enkele mensen gelijk over design patterns enzo beginnen, maar niet over nog een stapje hoger; software ontwerpen. Voordat je met een programma begint - in wat voor taal dan ook - moet je eerst een algemeen ontwerpje maken. Maak een analyse van het programma - wat heb ik nodig, wat moet het doen, etc. Vervolgens maak je klassediagrammen, bekijk je deze, kijk je of die wat abstracter kan, etc etc etc.

Een proper ontwerp, of zelfs maar het behouden van een proper ontwerp, is de helft van een mooi en overzichtelijk programma.

Verwijderd

whoami schreef op donderdag 07 juni 2007 @ 16:15:
Hmm, toch even nuanceren.
Bij Test Driven Development is het zo dat je eerst je Test schrijft, aan de hand van een use-case.
Daar heb je uiteraard helemaal gelijk in. Kijk alleen even naar de context waarin Hydra zijn statement maakte. Daar wordt gesteld dat je eigenlijk enkel kan gaan programmeren als je eerst volledig in beeld hebt wat je wilt gaan doen (class diagrammen etc). Dat is bij tdd niet aan de orde, dan duik je er gewoon in.
YopY schreef op donderdag 07 juni 2007 @ 16:18:
Een proper ontwerp, of zelfs maar het behouden van een proper ontwerp, is de helft van een mooi en overzichtelijk programma.
Het is tevens de helft van je gemaakte kosten. En doorgaans voor niets aangezien een klant over het algemeen niet weet wat hij precies wil. De kans op 'left-over-code' wordt alleen maar groter op het moment dat je van te voren te veel gaat documenteren.

[ Voor 30% gewijzigd door Verwijderd op 07-06-2007 16:26 ]


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op donderdag 07 juni 2007 @ 16:11:
[...]
Ik weet niet of dit per definitie waar is. Test Driven Development is toch wel een vorm waarbij je direct de code induikt zonder eerst een structuur op te zetten. Zelf duik ik graag in het diepe en schrijf de tests later. Noem het voor het gemak een organische vorm van programmeren.
Dit klinkt heel eerlijk gezegd als de luie manier van TDD. Net zoals bij incremental prototyping is het helemaal niet de bedoeling dat je maar gewoon begint en ziet waar je eindigd.

Bij een kleine tool kom je wel weg met gewoon beginnen (ben nu zelf met iets simpels bezig wat me inclusief tests 3 dagen gaat kosten en daar hoeft echt geen compleet design voor gemaakt te worden), maar vooral met grote complexe systemen zul je, als je niet vooraf goed na gaat denken, op een enorme teringbende uitkomen.
whoami schreef op donderdag 07 juni 2007 @ 16:15:
Oei, ik heb net een method signature geschreven (de method moet ik nog implementeren), maar die method heeft wel al 22 lijnen commentaar die uitlegt wat die method doet, waarom ze bestaat, en in welke gevallen ze nodig is....
Om maar eens aan te geven dat ik het niet eens ben met jouw statement. :)
Natuurlijk zijn er uitzonderingen, maar gemiddeld genomen moet code te begrijpen zijn aan de hand van alleen de code. Als commentaar NODIG is om de code te begrijpen moet je eerst eens bij jezelf te rade gaan of de functie niet te complex is, en opgesplitst zou moeten worden.
Verwijderd schreef op donderdag 07 juni 2007 @ 16:22:
Daar heb je uiteraard helemaal gelijk in. Kijk alleen even naar de context waarin Hydra zijn statement maakte. Daar wordt gesteld dat je eigenlijk enkel kan gaan programmeren als je eerst volledig in beeld hebt wat je wilt gaan doen (class diagrammen etc). Dat is bij tdd niet aan de orde, dan duik je er gewoon in.
Ik zeg niet dat je voor 't kleinste tooltje de volledige classdiagrammen moet gaan tekenen, maar sowieso kan dit, als je het handig aanpakt, gewoon tijd schelen. Er zijn genoeg tools die uit UML classes voor je uit kunnen genereren. Uiteindelijk scheelt het je gewoon tijd.

Daarnaast vraagt de TS om tips om 'netter' te programmeren. Ietwat overkill aan design is dan niet weg, dan leert 'ie tenminste hoe hij die stap uit moet voeren.
Het is tevens de helft van je gemaakte kosten. En doorgaans voor niets aangezien een klant over het algemeen niet weet wat hij precies wil. De kans op 'left-over-code' wordt alleen maar groter op het moment dat je van te voren te veel gaat documenteren.
Ik heb vooral ervaring met grote complexe systemen, maar wat denk je dat meer kost: vooraf een design maken of achteraf functionaliteit erbij frotten met alle gevolgen van dien? Het is heel simpel; de analyse fase is gewoon een onderdeel van het werk. Dankzei de analyse fase weet je niet alleen wat je moet gaan doen, maar ook hoe je het moet gaan doen en hoeveel tijd het je kost. Aan de hand van je analyse je tijdsinschattingen bijstellen kan over het algemeen wel. Ergens achter in het project gaan melden dat het een paar maanden uit gaat lopen, daar kom je niet mee weg.

En wat het verhaal betreft dat een klant niet weet wat 'ie wil: dat is het verschil tussen een architect en een programmeur.
YopY schreef op donderdag 07 juni 2007 @ 16:18:
even over het topic gevlogen, wat ik wel zie is dat enkele mensen gelijk over design patterns enzo beginnen, maar niet over nog een stapje hoger; software ontwerpen. Voordat je met een programma begint - in wat voor taal dan ook - moet je eerst een algemeen ontwerpje maken. Maak een analyse van het programma - wat heb ik nodig, wat moet het doen, etc. Vervolgens maak je klassediagrammen, bekijk je deze, kijk je of die wat abstracter kan, etc etc etc.

Een proper ontwerp, of zelfs maar het behouden van een proper ontwerp, is de helft van een mooi en overzichtelijk programma.
Het is sowieso een misconceptie dat een design pattern een doel is. De reden dat iedere ontwikkelaar het design pattern boek gelezen moet hebben, is dat in elk ontwerp (design) bepaalde bekende patronen (patterns) terugkomen. Als je die herkent, kun je snel, simpel en degelijk toepassen wat je al weet.

Helaas zijn er een hoop mensen die OF het implementeren van DPs als doel op zich zien, OF gewoon het niet helemaal gesnopen hebben en een singleton als simpleton gaan implementeren :)

[ Voor 16% gewijzigd door Hydra op 07-06-2007 17:11 ]

https://niels.nu


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Hydra schreef op donderdag 07 juni 2007 @ 17:06:
[...]

Natuurlijk zijn er uitzonderingen, maar gemiddeld genomen moet code te begrijpen zijn aan de hand van alleen de code. Als commentaar NODIG is om de code te begrijpen moet je eerst eens bij jezelf te rade gaan of de functie niet te complex is, en opgesplitst zou moeten worden.
Da's de theorie van self-documenting code, en die is op zich best mooi, en als je code 'self - documenting' is, is dat mooi meegenomen.
Om dan echter meteen te zeggen dat je code niet goed is, als je code niet 'self documenting' is, vind ik persoonlijk wel wat te ver gaan.

https://fgheysels.github.io/


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
whoami schreef op donderdag 07 juni 2007 @ 17:08:
[...]
Da's de theorie van self-documenting code, en die is op zich best mooi, en als je code 'self - documenting' is, is dat mooi meegenomen.
Om dan echter meteen te zeggen dat je code niet goed is, als je code niet 'self documenting' is, vind ik persoonlijk wel wat te ver gaan.
Vandaar mijn 'gemiddeld genomen'. Het is geen theorie trouwens, het is een werkwijze. En ik zeg niet dat je code meteen 'niet goed is'. Ik zeg dat je moet proberen je code self-documenting te maken.

https://niels.nu


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hydra schreef op donderdag 07 juni 2007 @ 17:06:
Natuurlijk zijn er uitzonderingen, maar gemiddeld genomen moet code te begrijpen zijn aan de hand van alleen de code. Als commentaar NODIG is om de code te begrijpen moet je eerst eens bij jezelf te rade gaan of de functie niet te complex is, en opgesplitst zou moeten worden.
Hier hebben we al eens lang een breed over gediscussierd, ik geloof toen nog met mark platvoet die zoiets beweerde zoals jij nu doet. Aan code kun je aflezen wat het doet, je kunt er niet aan aflezen waarom het dat doet - wat de achterliggende gedachtes waren om het op die manier te doen.

Als het proces niet zo complex is is dat idd prima, alleen zijn er ook processen die wél complex zijn en waarbij je aan alleen het hoe niet genoeg informatie hebt - het waarom is vele malen belangrijker, zeker bij het opsporen van moeilijk te vinden bugs (waarbij de fout meestal niet eens zit in de code zelf maar in de achterliggende gedachtengang).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
.oisyn schreef op donderdag 07 juni 2007 @ 17:23:
Hier hebben we al eens lang een breed over gediscussierd,
Daar was ik niet bij, sorry :)
ik geloof toen nog met mark platvoet die zoiets beweerde zoals jij nu doet. Aan code kun je aflezen wat het doet, je kunt er niet aan aflezen waarom het dat doet - wat de achterliggende gedachtes waren om het op die manier te doen.
Joh.
Als het proces niet zo complex is is dat idd prima, alleen zijn er ook processen die wél complex zijn en waarbij je aan alleen het hoe niet genoeg informatie hebt - het waarom is vele malen belangrijker, zeker bij het opsporen van moeilijk te vinden bugs (waarbij de fout meestal niet eens zit in de code zelf maar in de achterliggende gedachtengang).
Ik snap niet wat er moeilijk te begrijpen is aan het statement dat je moet proberen je code self-documenting te maken. Als het proces zo complex is dat dat niet duidelijk wordt, heb je sowieso waarschijnlijk veel meer aan een stel flowcharts die in je technische documentatie het hoe en wat uitleggen. Daarnaast zal een functioneel ontwerp die processen sowieso al in kaart brengen, of ga je iets dergelijks 'uit je hoofd' uitwerken?

[ Voor 3% gewijzigd door Hydra op 07-06-2007 17:49 ]

https://niels.nu


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hydra schreef op donderdag 07 juni 2007 @ 17:48:
Ik snap niet wat er moeilijk te begrijpen is aan het statement dat je moet proberen je code self-documenting te maken.
Ik snap niet wat er moeilijk te begrijpen is aan mijn alinea die je hier quote. Ik zeg niet dat je je code niet self-documenting moet maken. Ik zeg dat self-documenting code niet alle mogelijke zinnige documentatie die je in de comments wilt hebben afdekt.
Als het proces zo complex is dat dat niet duidelijk wordt, heb je sowieso waarschijnlijk veel meer aan een stel flowcharts die in je technische documentatie het hoe en wat uitleggen.
Klopt, maar aparte flowcharts hebben het nadeel dat ze niet gemaintained worden bij code changes, terwijl dat bij comments over het algemeen wel gebeurt. Daarnaast is het handiger een fout te spotten als de documentatie naast de source te lezen is ipv in een apart document.
Daarnaast zal een functioneel ontwerp die processen sowieso al in kaart brengen, of ga je iets dergelijks 'uit je hoofd' uitwerken?
Een functioneel ontwerp houdt zich niet bezig met de kleinste details.

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
.oisyn schreef op donderdag 07 juni 2007 @ 18:13:
Ik snap niet wat er moeilijk te begrijpen is aan mijn alinea die je hier quote. Ik zeg niet dat je je code niet self-documenting moet maken. Ik zeg dat self-documenting code niet alle mogelijke zinnige documentatie die je in de comments wilt hebben afdekt.
Maar dat zeg ik toch nergens?
Klopt, maar aparte flowcharts hebben het nadeel dat ze niet gemaintained worden bij code changes, terwijl dat bij comments over het algemeen wel gebeurt. Daarnaast is het handiger een fout te spotten als de documentatie naast de source te lezen is ipv in een apart document.
Mwoa, als je aan 't ontwikkelen bent hoop ik sowieso dat je in ieder geval twee schermen hebt, dus die vlieger gaat niet echt op. Verder is het een kwestie van voorkeuren, ik lees liever vooraf een document wat de complexe processen beschrijft dan dat ik dat uit code en de documentatie daarin moet halen. Flowcharts zeggen sowieso vaak meer dan woorden.

En dat flowcharts niet bijgehouden worden als processen wijzigen, tja. In veel gevallen wordt code-documentatie net zo min bijgehouden. Beiden is gewoon fout.
Een functioneel ontwerp houdt zich niet bezig met de kleinste details.
Ik vind een "complex proces" niet te rijmen met "de kleinste details". De kleinste details zullen over het algemeen juist prima af te dekken zijn met duidelijke code.

Mijn punt is dat je moet proberen je code self-documenting te maken en daarnaast processen / code waarbij dat niet mogelijk is moet documenteren. Dat was wat ik zei op de vorige pagina, en ik geloof niet dat dat door jou niet gesteund wordt.

https://niels.nu


Verwijderd

Hydra schreef op donderdag 07 juni 2007 @ 17:06:
En wat het verhaal betreft dat een klant niet weet wat 'ie wil: dat is het verschil tussen een architect en een programmeur.
Ja tuurlijk, een architect weet wel wat een klant wil! Wat stom van mij zeg. Complete Agile stromingen zijn in het leven geroepen omdat er niets zo variabel lijkt te zijn als een klant, maar daarbij zijn ze natuurlijk even vergeten dat er ook architecten op deze aardkloot rondlopen :+
.oisyn schreef op donderdag 07 juni 2007 @ 17:23:
Hier hebben we al eens lang een breed over gediscussierd, ik geloof toen nog met mark platvoet die zoiets beweerde zoals jij nu doet. Aan code kun je aflezen wat het doet, je kunt er niet aan aflezen waarom het dat doet - wat de achterliggende gedachtes waren om het op die manier te doen.
Yup, ik had toen inderdaad dezelfde mening als Hydra nu. Maar dan ben ik wel helemaal op terug gekomen onder andere door bovenstaand argument.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op donderdag 07 juni 2007 @ 18:32:
[...]
Ja tuurlijk, een architect weet wel wat een klant wil! Wat stom van mij zeg. Complete Agile stromingen zijn in het leven geroepen omdat er niets zo variabel lijkt te zijn als een klant, maar daarbij zijn ze natuurlijk even vergeten dat er ook architecten op deze aardkloot rondlopen :+
Grappig genoeg zijn veel bedrijven helemaal aan het terugkomen van het hele agile software development gebeuren omdat het in de praktijk helemaal niet zo geweldig blijkt te werken. Mensen verwarren Agile met lapswanzerig werken omdat juist voor Agile development een flinke dosis discipline komt kijken. Daarnaast kun je niet in de eindfasen van een project opeens met compleet nieuwe requirements op de proppen komen. Klinkt leuk in theorie, in de werkelijk leidt dat bij grote projecten tot chaos.

Wat betreft wat een klant wel en niet wil: een consultant weet klantenwensen iteratief te vertalen naar functional specs. Het is ontzettend kortzichtig maar meteen te stellen dat een klant niet weet wat 'ie wil. Er zijn genoeg kleine shitty webdesignbedrijfjes die, daarvanuitgaande, maar gewoon aan de slag gaan, een stuk 'werkende' software over de schutting gooien, en dan met hun handje op gaan staan om geld te vangen.

Requirements opduikelen is een iteretief proces, en ongetwijfeld komen daar prototypes bij kijken, maar je bent er als consultant voor verantwoordelijk om voordat je het implementatietraject ingaat duidelijk te hebben wat (en dan heb ik het niet over de exacte locatie van elk knopje) er gebouwd gaat worden. Wil een klant meer? Prima, maar dan ga je hetzelfde proces door. Je gaat niet gewoon grote wijzigingen erbij frotten, dat gaat 9 van de 10 keer mis.
Yup, ik had toen inderdaad dezelfde mening als Hydra nu. Maar dan ben ik wel helemaal op terug gekomen onder andere door bovenstaand argument.
Bedankt voor de mededeling.

https://niels.nu


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Tja, bedrijven die terugkomen op Agile processen: laat ons zeggen dat er altijd voor- en tegenstanders zijn, en dat er altijd mensen / bedrijven zijn die goede ervaringen hebben met agile, en anderen die dan weer slechte ervaringen hebben. Agile Development is niet zomaar 'lapzwanzerig werken'; Agile Development houdt in dat je je
- nog geen zorgen maakt over problemen die er nu nog niet zijn
- je zodanig ontwikkelt dat je code onderhoudbaar is, en makkelijk aan te passen is indien nodig. (<- en daar slaat agile op).

Dat wil echter niet zeggen dat Agile Development helemaal geen analyse / requirements whatever nodig heeft. Integendeel. Bij Agile Development heeft men ook 'user stories' nodig.
Daarnaast kun je niet in de eindfasen van een project opeens met compleet nieuwe requirements op de proppen komen.
Tja, wie denk je dat er met de requirements op de proppen komt ? De klant. En je gaat de klant toch niet vertellen dat hij z'n mening niet mag veranderen ? De klant is nl. ... de klant. Diegene die betaald.
Maar, laat ons eerlijk zijn, ik denk niet dat het veel voorkomt dat de doelstellingen / requirements van een project ergens in de eindfase echt nog drastisch wijzigen. Waar het wel om gaat, is dat de 'business' kan wijzigen. Nieuwe business-regels, nieuwe wetten, etc.... en dan is het noodzakelijk dat je je applicatie snel & veilig kan aanpassen aan die nieuwe regels.
Mwoa, als je aan 't ontwikkelen bent hoop ik sowieso dat je in ieder geval twee schermen hebt
In de bedrijven waar ik gewerkt heb / werk, zijn de mensen die 2 schermen hebben, een minderheid (jammergenoeg). Die vlieger, dat je 2 schermen hebt, gaat dus niet op. :)
Verder ben ik het met .oisyn eens dat de commentaar in je code meestal van een groter belang is dan externe documenten, en wel om de redenen die oisyn al aangehaald heeft.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 23:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Hydra schreef op donderdag 07 juni 2007 @ 18:25:
Ik vind een "complex proces" niet te rijmen met "de kleinste details". De kleinste details zullen over het algemeen juist prima af te dekken zijn met duidelijke code.
Complex betekent niet groot, het betekent ingewikkeld. Een voorbeeld: ik heb zat 10-regelige functies geschreven die best complex zijn - over het algemeen zijn dat functies met een hoge dosis wiskunde. Het ontwerp van die functie is niet meer dan "test of een kubus en een kegel elkaar snijden", met ergens nog een documentje over de achterliggende wiskundige onderbouwing. Echter, de wiskundige onderbouwing en de daadwerkelijke implementatie zitten dusdanig anders in elkaar wegens het gebruik van SSE en cache-coherency optimalisaties dat ik comments nodig heb om te begrijpen waarom ik dingen anders heb opgeschreven.
whoami schreef op donderdag 07 juni 2007 @ 19:13:
In de bedrijven waar ik gewerkt heb / werk, zijn de mensen die 2 schermen hebben, een minderheid (jammergenoeg). Die vlieger, dat je 2 schermen hebt, gaat dus niet op. :)
Ik geloof dat iedereen bij ons inmiddels met 3 schermen op z'n bureau staat - 2 voor de PC en 1 voor de Xbox360 of PS3 :P. Ik zweer idd bij 2 schermen en ben ook degene die het bij ons heeft geintroduceerd

[ Voor 47% gewijzigd door .oisyn op 07-06-2007 19:31 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

.oisyn schreef op donderdag 07 juni 2007 @ 19:21:
[...]
Ik geloof dat iedereen bij ons inmiddels met 3 schermen op z'n bureau staat - 2 voor de PC en 1 voor de Xbox360 of PS3 :P. Ik zweer idd bij 2 schermen en ben ook degene die het bij ons heeft geintroduceerd
Hmm, ik heb tot nu toe pas 1 keer met 2 desktops gewerkt en dat wat een laptop met een extra scherm. Bij klanten werk ik meestal op systemen die zelfs zwaar onderdoen voor mijn (overigens vrij vlotte) laptop...

Volgens mij doe ik toch iets verkeerd. :p

Fat Pizza's pizza, they are big and they are cheezy


  • ? ?
  • Registratie: Mei 2007
  • Niet online

? ?

..

[ Voor 132% gewijzigd door ? ? op 25-01-2013 09:52 ]


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

era.zer schreef op vrijdag 08 juni 2007 @ 13:44:
Eigenlijk is het simpel:
3 lagen die elk hun ding doen en informatie uitwisselen

* The data layer manages the physical storage and retrieval of data
* The business layer maintains business rules and logic
* The presentation layer houses the user interface and related presentation code.

Zo krijg je een code dat een duidelijk input en output geeft. Als er iets wil veranderen, kan het op één plaats en alles blijft mooi werken.

De stijl van je code daar maak ik me minder zorgen om, of je nu (true) (!false) of true==false gebruikt moet je zelf weten, ik gebruik gewoon wat het beste typt en leest.
Mooie code is georganiseerde code, that's all
Dat is naar mijn idee te kort door de bocht.

Ik ben het met je eens dat een opsplitsing in logische lagen essentieel is, maar 3 lijkt me aan de ene kant niet voldoende en bovendien heb je binnen een laag nog genoeg logica die het totaal niet te onderhouden kan maken. Hier heb je bijvoorbeeld iets van MVC, IoC of ORM nodig. Of simpelweg een toepasselijk design pattern, zoals State.

Overigens kun je in de meeste gevallen volgens mij vooruit met 3 lagen met daarnaast (laagoverstijgend over datalaag, servicelaag en eventueel presentatielaag) je domeinmodel. Alle lagen kennen de laag direct onder zich en het domeinmodel. Het domeinmodel kent niets, behalve eventueel een util module. De presentatielaag is eventueel met DTO's af te scheiden van de rest van de applicatie. Dat is aangenaam, want een verandering in domeinmodel heeft dan (in theorie) geen gevolgen voor de presentatielaag.

Mijn punt is iig dat 3 lagen soms te beperkt is, bijvoorbeeld als je ergens nog een abstractielaag nodig hebt o.i.d. met het oog op hergebruik.

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

Ik let er meestal op dat de opbouw en layout hetzelfde is voor elk script dat ik schrijf.

Dus bijvoorbeeld:
- Sessies, cookies en ander header gerelateerd materiaal.
- Externe functies, objecten etc inladen.
- Functies maken die alleen voor deze pagina gelden.
- Posts, sessies, cookies etc uitlezen en vars maken.
- Bovenstaande controleren, wijzigen, verwijderen, update
- De uiteindelijke kern
- De DB
- Afsluiten
- Boven elk deel zet ik in één regel wat er gebeurd.
- De gecompliceerde delen vul ik aan met extra comments.

Daarnaast gebruik ik ook vaak dezelfde namen voor pagina's, variabelen, functies, objecten, databases, tabellen, etc. Dat wil zeggen als delen overeenkomen. Ondanks dat je er niet om vraagt is het ook verstandig om je functies e.d. altijd universeel op te bouwen en dezelfde soort functies te gebruiken. Voor een loop kun je bijvoorbeeld while, do while, for en foreach gebruiken en heb je natuurlijk een keuzen aan verschillende vergelijkingen. Probeer waar mogelijk dit gelijk te houden. Ik vind de for loop met positieve vergelijkingen fijn werken, dus waar mogelijk, gebruik ik die.

Voor mij is dit een prettige manier van werken. Uiteindelijk hanteer je je eigen manieren. Als je er maar genoeg mee aan de slag bent gegaan.

Ik ken je kennis van PHP overigens niet, maar wanneer je nog niet veel ervaring hebt is het handig om één groot goed boek te gebruiken ipv 10 verschillende + internet tutorials. Later kun je alsnog naar andere boeken kijken hoe anderen het doen.

[ Voor 25% gewijzigd door Verwijderd op 09-06-2007 01:59 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

Ik wil hier graag 2 opmerkingen geven:

Staar je niet blind op design patterns. Ze worden niet alleen te weinig gebruikt, ze worden ook teveel gebruikt. Mensen staren zich blind op design patterns en denken dat als ze in hun code maar genoeg design patterns hebben, ze brilliante code hebben.
Design patterens lossen _specifieke_ problemen op een _specifieke_ manier op. Ga _altijd_ na of jouw probleem wel dat is wat het design pattern oplost. Zoniet zijn er waarschijnlijk betere oplosingen.
Design patterns zijn niet meer dan een set "algemene richtlijnen voor betere code" toegepast op specifieke problemen. Leer dus eerder die "richtlijnen" dan de design patterns.
# vermijd het gebruik van }else{ clausule's.
in plaats van een else te defineeren maak je van de IF self de else. dus je check of het tegenover gestelde, dat wat de else zou uitvoeren waar is. zoniet dan skip je de if en ga je verder. op die manier vermijd je onodig indenten en wordt je code een heel stuk duidelijker. hier een voorbeeld.
Dat wordt nu net veelal afgeraden. Dit is eigenlijk een discussie die eerder hoort bij de spaties/haakjes, dus ik zal ze hier niet voeren. Enkel "guard clauses" wil ik hier even vermelden als alternatief. Wikipedia weet je er vast meer over te vertellen.

edit: Ik zie net dat dit laatste net is wat je zelf vertelt... ik had enkel het eerste fragmentje code bekeken. Mijn excuses

[ Voor 4% gewijzigd door H!GHGuY op 10-06-2007 16:48 ]

ASSUME makes an ASS out of U and ME


Verwijderd

Een paar maanden geleden ben ik op http://c2.com/cgi/wiki? terecht gekomen. Het is de eerste wiki, waarop al meer dan tien jaar vaklui hun ervaringen en observaties beschrijven. Conversaties zijn af en toe moeilijk te volgen, en structuur op pagina's is er niet vaak, maar toch is het erg goed leesvoer.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
whoami schreef op donderdag 07 juni 2007 @ 19:13:
Tja, bedrijven die terugkomen op Agile processen: laat ons zeggen dat er altijd voor- en tegenstanders zijn, en dat er altijd mensen / bedrijven zijn die goede ervaringen hebben met agile, en anderen die dan weer slechte ervaringen hebben. Agile Development is niet zomaar 'lapzwanzerig werken'; Agile Development houdt in dat je je
- nog geen zorgen maakt over problemen die er nu nog niet zijn
- je zodanig ontwikkelt dat je code onderhoudbaar is, en makkelijk aan te passen is indien nodig. (<- en daar slaat agile op).
Het punt is niet zozeer dat Agile slecht is, het punt is dat het vaak slecht wordt toegepast. Het probleem met grote systemen is dat het vaak moeilijk/complex is om er later fundamentele wijzigingen in aan te brengen. Agile of niet, je moet wel weten waar je aan gaat beginnen en wat je op gaat leveren. Een project is nooit 'open ended' want dat betekent risico, en noch de klant noch de leverancier zit te wachten op risico's.
Dat wil echter niet zeggen dat Agile Development helemaal geen analyse / requirements whatever nodig heeft. Integendeel. Bij Agile Development heeft men ook 'user stories' nodig.
Ik weet wat Agile is/inhoudt.
Tja, wie denk je dat er met de requirements op de proppen komt ? De klant. En je gaat de klant toch niet vertellen dat hij z'n mening niet mag veranderen ? De klant is nl. ... de klant. Diegene die betaald.
De klant wil vooraf weten wat 'ie krijgt en hoeveel hij hiervoor moet betalen. Dit wordt dan redelijk exact beschreven. Als de klant dan later dingen wil wijzigen, prima, dan wordt een nieuwe assessment gemaakt waarin bekeken wordt in hoeverre het in de huidige architectuur mogelijk is, en hoeveel tijd (en dus geld) dat gaat kosten.

Het is heel simpel: wijzigingen kosten tijd, en dus geld. Als een klant na 'tekenen' nog grote wijzigingen wil, zal hij hiervoor extra moeten betalen. Niemand heeft hier zin in (zowel de klant als de leverancier niet), dus is het zaak zoveel mogelijk van te voren de functionele specs duidelijjk te krijgen.
Maar, laat ons eerlijk zijn, ik denk niet dat het veel voorkomt dat de doelstellingen / requirements van een project ergens in de eindfase echt nog drastisch wijzigen. Waar het wel om gaat, is dat de 'business' kan wijzigen. Nieuwe business-regels, nieuwe wetten, etc.... en dan is het noodzakelijk dat je je applicatie snel & veilig kan aanpassen aan die nieuwe regels.
Agile beschrijft hoe je kunt zorgen dat je applicatie makkelijker gewijzigd kan worden. Zet het dus modulair op in plaats van er een groot monolithisch systeem van te maken. Dit zorgt dus dat de impact of change lager wordt. Agile betekent absoluut niet dat je niet vooraf gaat bedenken wat je gaat doen, het zorgt alleen dat de impact lager wordt.
In de bedrijven waar ik gewerkt heb / werk, zijn de mensen die 2 schermen hebben, een minderheid (jammergenoeg). Die vlieger, dat je 2 schermen hebt, gaat dus niet op. :)
Tja. Als een bedrijf gaat bezuinigen op schermen hoef ik er niet te werken, sorry.
.oisyn schreef op donderdag 07 juni 2007 @ 19:21:
Complex betekent niet groot, het betekent ingewikkeld. Een voorbeeld: ik heb zat 10-regelige functies geschreven die best complex zijn - over het algemeen zijn dat functies met een hoge dosis wiskunde. Het ontwerp van die functie is niet meer dan "test of een kubus en een kegel elkaar snijden", met ergens nog een documentje over de achterliggende wiskundige onderbouwing. Echter, de wiskundige onderbouwing en de daadwerkelijke implementatie zitten dusdanig anders in elkaar wegens het gebruik van SSE en cache-coherency optimalisaties dat ik comments nodig heb om te begrijpen waarom ik dingen anders heb opgeschreven.
Bedankt voor dit prachtige voorbeeld van een uitzonderingsgeval :) Optimalisaties zijn goeie voorbeelden van dingen die goed gedocumenteerd moeten worden. Zelf heb ik een tijd terug een reader gemakt die ints uit een grote string kan lezen. Tuurlijk kan ik een subtring uit die string plukken en (in .net) een Convert.ToInt32() doen daarop, maar dan maak je een extra object aan. Normaal geen probleem, maar wel als het duizenden keren per seconde moet. En die functie moet je dan ook goed documenteren, al is het alleen al om te voorkomen dat iemand later zonder te begrijpen waarom het zo gedaan wordt die functie veranderd in wat ik hierboven beschreven heb.

Maar nogmaals: dit zijn over het algemeen uitzonderingen, dus vandaar dat ik meen dat je je best moet doen om je code self-documenting te maken.
Ik geloof dat iedereen bij ons inmiddels met 3 schermen op z'n bureau staat - 2 voor de PC en 1 voor de Xbox360 of PS3 :P. Ik zweer idd bij 2 schermen en ben ook degene die het bij ons heeft geintroduceerd
Zelf heb ik er twee omdat m'n laptop (Consultant, ga dus vaak naar klanten) maar 1 uitgang heeft, maar er zijn genoeg developers hier die gewoon 3 schermen aan hun machine hebben hangen.

https://niels.nu


Verwijderd

Hydra schreef op maandag 11 juni 2007 @ 11:43:
Ik weet wat Agile is/inhoudt.
No offence, maar ik krijg sterk het vermoeden dat je het niet weet. Want bijvoorbeeld ook met agile kosten wijzigingen tijd en geld. Je doet het nu voorkomen alsof dat niet zo is.
Hydra schreef op maandag 11 juni 2007 @ 11:43:
Maar nogmaals: dit zijn over het algemeen uitzonderingen, dus vandaar dat ik meen dat je je best moet doen om je code self-documenting te maken.
Ik neem toch aan dat iedereen het hier mee eens is. Waar het om gaat is dat 'self-documenting' code het gebruik van commentaar simpelweg niet uitsluit.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op maandag 11 juni 2007 @ 12:23:
No offence, maar ik krijg sterk het vermoeden dat je het niet weet. Want bijvoorbeeld ook met agile kosten wijzigingen tijd en geld. Je doet het nu voorkomen alsof dat niet zo is.
Euh, je leest het compleet verkeerd. Sorry, maar dat is nu net het punt.
Ik neem toch aan dat iedereen het hier mee eens is. Waar het om gaat is dat 'self-documenting' code het gebruik van commentaar simpelweg niet uitsluit.
Dat heb ik ook nooit beweerd. Wederom raad ik je aan iets zorgvuldiger te lezen.

https://niels.nu


Verwijderd

Hydra schreef op maandag 11 juni 2007 @ 13:11:
Euh, je leest het compleet verkeerd. Sorry, maar dat is nu net het punt.
Euh nee, je schrijft het compleet verkeerd op. Vandaar dat ik zei: 'je doet het voorkomen..'

Wat overigens maar weer aangeeft wat de veschillen in perceptie van een stuk tekst kunnen zijn. Wat betekent dat het te fijnmazig opstellen van een document ook een zeker risico met zich mee brengt aangezien je altijd te maken hebt met de perceptie van een ander.
Hydra schreef op maandag 11 juni 2007 @ 13:11:
Dat heb ik ook nooit beweerd. Wederom raad ik je aan iets zorgvuldiger te lezen.
Euh dat advies dien je zelf op te volgen, want ik "beweer ook niet dat jij dat beweerd".

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op maandag 11 juni 2007 @ 13:21:
Euh nee, je schrijft het compleet verkeerd op. Vandaar dat ik zei: 'je doet het voorkomen..'
Ik vertel letterlijk dat een pitfall de interpretatie van "Agile programmeren -> we beginnen wel en zien wel waar we eindigen" is. Nergens zeg ik dat Agile programmeren in zichzelf niet werkt. Communisme is ook een fijn ideaal. Het spijt me heel erg, maar het is echt jouw interpretatie. Ik heb verder geen zin in welles-nietes spelletjes over de interpretatie van mijn stuk. Ik vertel je hoe het bedoeld is, en daar zul je het mee moeten doen.
Euh dat advies dien je zelf op te volgen, want ik "beweer ook niet dat jij dat beweerd".
Een advies omdat je het in je vorige post ook fout deed en het dus mijns inziens een grammaticaal gebrek is: het is "je beweert".

https://niels.nu


Verwijderd

Hydra schreef op maandag 11 juni 2007 @ 13:31:
Ik vertel letterlijk dat een pitfall de interpretatie van "Agile programmeren -> we beginnen wel en zien wel waar we eindigen" is. Nergens zeg ik dat Agile programmeren in zichzelf niet werkt.
Een statement wat helemaal niet aan de orde is. Je vermeldt dat klanten juist van te voren willen weten wat de tijd en kosten moeten zijn. Dit ter ondersteuning van je betoog dat je meer van te voren moet vast leggen. Je zegt dat een wijziging een nieuw process start en zodoende weer tijd en geld kost. Daarmee impliceer je, of je het nu wilt of niet, dat Agile niet zo te werk gaat. En ja dat geeft mij logischerwijs het vermoeden dat je niet zo goed op de hoogte bent van Agile werken.
Hydra schreef op maandag 11 juni 2007 @ 13:31:
Het spijt me heel erg, maar het is echt jouw interpretatie. Ik heb verder geen zin in welles-nietes spelletjes over de interpretatie van mijn stuk. Ik vertel je hoe het bedoeld is, en daar zul je het mee moeten doen.
Hiermee raak je de essentie van wat ik je eerder duidelijk heb proberen te maken. Interpretatie is iets menselijk en klanten zijn ook menselijk. Of verkondig je dit verhaal ook tegen een klant die net iets anders verwacht had?
Hydra schreef op maandag 11 juni 2007 @ 13:31:
Een advies omdat je het in je vorige post ook fout deed en het dus mijns inziens een grammaticaal gebrek is: het is "je beweert".
Probeer eens niveau te behouden.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Verwijderd schreef op maandag 11 juni 2007 @ 13:46:
Een statement wat helemaal niet aan de orde is. Je vermeldt dat klanten juist van te voren willen weten wat de tijd en kosten moeten zijn. Dit ter ondersteuning van je betoog dat je meer van te voren moet vast leggen. Je zegt dat een wijziging een nieuw process start en zodoende weer tijd en geld kost. Daarmee impliceer je, of je het nu wilt of niet, dat Agile niet zo te werk gaat. En ja dat geeft mij logischerwijs het vermoeden dat je niet zo goed op de hoogte bent van Agile werken.
- Klanten willen van te voren weten wat ze voor hoeveel geld en in welke tijdsspanne ze krijgen.
- Agile wordt vaak GEINTERPRETEERD (wat dus FOUT is) alsof je gewoon aan een project begint en wel ziet waar je uitkomt.
- Dit leidt tot problemen en risico's.
- Bedrijven staan huiverig tegenover Agile omdat dit vaak meer discipline vereist dan traditionele methoden.

En verder:
Ik weet niet of dit per definitie waar is. Test Driven Development is toch wel een vorm waarbij je direct de code induikt zonder eerst een structuur op te zetten.
Daarop kreeg jij een reactie waarin de desbetreffende persoon stelde dat dat wel erg kort door de bocht is. In geen enkel serieus klantenproject 'duik je de code in' zonder eerst te gaan bedenken wat je wil doen, als is het alleen al omdat een klant nooit gaat betalen zonder dat op papier staat wat 'ie krijgt.
Hiermee raak je de essentie van wat ik je eerder duidelijk heb proberen te maken. Interpretatie is iets menselijk en klanten zijn ook menselijk. Of verkondig je dit verhaal ook tegen een klant die net iets anders verwacht had?
Doe ff normaal. Ik leg je duidelijk uit hoe het verhaal bedoeld is. Als ik zeg dat iets zo niet bedoeld is kun je het ook gewoon laten voor wat het is.
Probeer eens niveau te behouden.
Ik heb moeite iemand serieus te nemen die consequent "je beweerd" schrijft; die opmerking was omdat ik me eraan zat te ergeren. Verder snap ik niet waar je je druk over maakt, je hebt weer wat geleerd.

[ Voor 6% gewijzigd door Hydra op 11-06-2007 15:04 ]

https://niels.nu


Verwijderd

Hydra schreef op maandag 11 juni 2007 @ 15:03:
- Klanten willen van te voren weten wat ze voor hoeveel geld en in welke tijdsspanne ze krijgen.
- Agile wordt vaak GEINTERPRETEERD (wat dus FOUT is) alsof je gewoon aan een project begint en wel ziet waar je uitkomt.
- Dit leidt tot problemen en risico's.
- Bedrijven staan huiverig tegenover Agile omdat dit vaak meer discipline vereist dan traditionele methoden.
Dit citaat heeft helemaal niets te maken met mijn citaat. Het ontgaat me dus welk punt je probeert te maken. (overigens: ik spreek je citaat dus niet tegen)
Hydra schreef op maandag 11 juni 2007 @ 15:03:
Daarop kreeg jij een reactie waarin de desbetreffende persoon stelde dat dat wel erg kort door de bocht is. In geen enkel serieus klantenproject 'duik je de code in' zonder eerst te gaan bedenken wat je wil doen, als is het alleen al omdat een klant nooit gaat betalen zonder dat op papier staat wat 'ie krijgt.
Die opmerking was kort door de bocht bedoeld en had enkel betrekking op technische ontwerpen. Het leek mij nogal overduidelijk dat een functioneel ontwerp vereist was/is, maar klaarblijkelijk was dat een incorrecte aanname.
Hydra schreef op maandag 11 juni 2007 @ 15:03:
Ik leg je duidelijk uit hoe het verhaal bedoeld is. Als ik zeg dat iets zo niet bedoeld is kun je het ook gewoon laten voor wat het is.
"Lees eens goed" is wat mij betreft geen duidelijk uitleg en tevens niet meer relevant. Zoals je misschien was opgevallen probeer ik je iets duidelijk te maken over perceptie van personen. Zo kun je er altijd gaandeweg een project achter komen dat een klant het toch even anders bedoeld of geinterpreteerd had. Dat vertaalt zich uiteindelijk naar code die wellicht overbodig wordt en daar moet je wat mij betreft in je project mee om kunnen gaan. Ik vind dat een belangrijk onderdeel van "netjes programmeren".
Hydra schreef op maandag 11 juni 2007 @ 15:03:
Ik heb moeite iemand serieus te nemen die consequent "je beweerd" schrijft; die opmerking was omdat ik me eraan zat te ergeren. Verder snap ik niet waar je je druk over maakt
Ik maak me er niet druk om. Dergelijke opmerkingen verpesten simpelweg een topic aangezien een discussie dan gaat over de vorm en niet meer de inhoud.

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Aangezien het nu gaat over de interpretatie van mijn post en niet over het originele onderwerp wil ik het hier graag bij laten. Lets agree to disagree ;)

https://niels.nu


  • misfire
  • Registratie: Maart 2001
  • Laatst online: 12-10-2024
De enige tips die ik kan geven (sommige zijn al genoemd):

* Lees over het onderwerp. Code Complete en The Pragmatic Programmer zijn een paar voorbeelden. Praat eens met anderen over bepaalde ideeën en problemen.

* Als je over code niet tevreden bent, wees dan niet te bang om het opnieuw te schrijven. Van fouten kun je leren, maar van successen nog veel meer. Slechte code kost je op de lange termijn waarschijnlijk meer tijd dan een rewrite. Door code "weg te gooien" wordt vaak gedacht dat alle tijd en moeite verspild is. Meestal is de kennis die opgedaan is tijdens het schrijven van de oude meuk echter heel goed bruikbaar in de rewrite, waardoor je effectief helemaal niet zo veel tijd verliest.

* Werk samen met anderen. Pair programming, code reviews, werken op basis van andermans werk, allemaal dingen waardoor je heel snel kunt leren van de goede en minder goede ideeën van anderen. Jij leert wat anderen doen, en anderen geven feedback over wat jij doet. Hierbij is het wel belangrijk dat je niet meteen keihard in de verdediging gaat en ook respecteert dat er meerdere wegen zijn naar Rome.

* Zet code in productie. Maak iets dat ook echt gebruikt wordt en/of beheerd wordt. Gebruikers en beheerders kijken met totaal andere ogen naar software dan ontwikkelaars. Hoe makkelijk kun je reageren op nieuwe feature requests of bug meldingen? Hoe goed is je foutafhandeling? Hoe reageert je applicatie als een beheerder ergens een stekker uittrekt? Heel leerzaam als je "nette" software wilt schrijven!

Wellicht niet allemaal direct nuttig voor je, maar misschien dat je er wat aan hebt. Het belangrijkste denk ik dat je nooit moet denken dat je klaar bent met leren. Zeker in software development gaan ontwikkelingen zo snel dat zodra je echt iets goed kunt het waarschijnlijk al obsolete is. Om netjes te kunnen werken zul je nieuwsgierig moeten blijven.
Pagina: 1

Let op:
Zullen we een keer proberen dit topic niet te laten verzanden in gejammer over spaties en haakjes?