Archief - [PROG] Gebruik van getters en setters

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Vich

Legacy Member
kwitters zei:
Volledig mee akkoord, maar dat neemt niet weg dat het vrij absurd is om een nul-vector te verbieden met de set method.
Klopt :) Want zoals je al aangaf: een snelheidsvector moet een nul-lengte kunnen hebben.

.Acku. zei:
Controle op null of zero length is nu niet echt een bottleneck oO
Als je vele vectorberekeningen doet (zoals in een spel), dan wordt dat wel een bottleneck als je in elke vector method die controle gaat uitvoeren.

.Acku.

Legacy Member
Imho kan dat gewoon niet, de lengte wordt bijgehouden, kijken of iets gelijk is aan nul is de simpelste elementaire operatie in een hogere-niveau taal. Hoeveel CPU-instructies zijn dat? Drie in assembly ofzo? Een simpel grafisch algorime behelst er waarschijnlijk reeds honderden, een ingewikkeld prolly duizenden. Dit is afaik gewoon een van die rare hersenkronkels van die mensen die denken dat alles moet gefinetuned zijn, waardoor een groot deel van de ontwikkelingstijd gaat naar bugfixing.

kwitters

Legacy Member
Bubbling Zombie zei:
-> getters en setters documenteer je niet. Meer nog, als ik getters en setters gedocumenteerd zou zien, zou ik denken dat de andere een retard was die mij als retard aanziet.
Getters en Setters worden meestal wel gedocumenteerd, kijk maar naar alles van Microsoft, Sun, Game SDK's etc.

Bubbling Zombie zei:
-> debugging oO. Ja, maakt veel uit natuurlijk:
klasse.variable = blabla; ipv klasse.setVariable(blabla);

Persoonlijk hou ik mijn code liefst zo eenvoudig en duidelijk mogelijk. En vind ik

position.x += speed.x

duidelijker en makkelijker te debuggen dan

position.setX( position.getX() + speed.getX() )

als ze trouwens toch exact hetzelfde doen. Maar misschien is dit gewoon persoonlijke voorkeur ofzo.

Bubbling Zombie zei:
een goeie (oo)programmeur weet wat encapsulatie is, iets wat je straal negeert als je public variabelen gaat gebruiken.

Waarschijnlijk ben ik dan geen goeie traditionele oo programmeur ;). Er zijn over dit onderwerp trouwens al ellelange discussies geweest op de python newsgroup, waar zowat dezelfde discussies plaatsvinden tussen traditionele OOers en python programmeurs. Als je geinteresseerd bent kan je eens kijken op http://groups.google.com/group/comp.lang.python/msg/b977ed1312e10b21 en http://groups.google.be/group/comp.lang.python/browse_thread/thread/dad0361902521632/9ca9d3030dd92045

killgore

Legacy Member
kwitters zei:
Persoonlijk hou ik mijn code liefst zo eenvoudig en duidelijk mogelijk. En vind ik

position.x += speed.x

duidelijker en makkelijker te debuggen dan

position.setX( position.getX() + speed.getX() )
Persoonlijk zou ik ergens doen.

Object:: setSpeed(SpeedVector speed); (of gewoon Vector speed)

en dan binnen dat object in de timer methoden:

Code:
Object::timeaction(Time timePassed)
{
    x+=timePassed*speed.getX();
    ...
}

Natuurlijk is timeaction en zo niet zo denderend geïmplenteerd hier en hangt dit af van engine tot engine ;).

Maar ik begrijp je punt wel dat in sommige gevallen (zoals bij coördinaten) het niet de moeite is van ze private te maken. Ergens kan ik je gelijk geven, meestal zou ik echter zelf niet zo coden, meestal als ik dergelijke structuren heb zitten deze in een struct en niet in een klasse.
Waarschijnlijk zou ik in sommige vbn zelf zo coden (dus public vars) zonder het door te hebben ;), maar over het algemeen -> 100% data encapsulation ze.

wlibaers

Legacy Member
Vich zei:
Klopt :) Want zoals je al aangaf: een snelheidsvector moet een nul-lengte kunnen hebben.

Maar het kan wel raar lijken dat je een vector die nul kan zijn wil normaliseren. De vectoren die meestal genormaliseerd worden (zoals in een rotatiematrix) zijn standaard verschillend van nul, en wijken er alleen licht van af door afrondingsfouten.

Als je vele vectorberekeningen doet (zoals in een spel), dan wordt dat wel een bottleneck als je in elke vector method die controle gaat uitvoeren.

Als je echt veel berekeningen moet doen, dan gebruik je toch SoA gegevens, zodat de compiler tenminste een kans maakt wat te optimaliseren?
http://www.x86.org/articles/sse_pt3/simd3.htm

jodeman

Legacy Member
Is er eigenlijk een programma die de processortijd kan weergeven voor stukken in uw code (in java)? Dat zou echt handig zijn voor bottlenecks te vinden.

killgore

Legacy Member
jodeman zei:
Is er eigenlijk een programma die de processortijd kan weergeven voor stukken in uw code (in java)? Dat zou echt handig zijn voor bottlenecks te vinden.
benchmarking: vraag tijd op voor loop, voer (extreem lange :p) loop uit, meet tijd terug op.

Liefst een vrij exacte klok hiervoor gebruiken en ook een lange loop, zodat je meetresultaten niet teveel worden beïnvloed door clock-ticks en afrondingsfouten.

QplQyer

Legacy Member
double x = System.getCurrentTimeMillis();
; code
System.out.println("Tijd was: "+x-System.getCurrentTimeMillis());

Het is niet 100% accuraat allicht, maar zo testten wij alles bij de vakken die java gebruikten en over algoritmes en dergelijke gingen.

kwitters

Legacy Member
jodeman zei:
Is er eigenlijk een programma die de processortijd kan weergeven voor stukken in uw code (in java)? Dat zou echt handig zijn voor bottlenecks te vinden.

Meestal wordt dit gedaan door zogenaamde "profilers". Zoek maar eens op google naar "java profiler" en je zal heel wat hits terugkrijgen. Normaalgezien gebruik je die profiler om te kijken in wel stuk code het meeste van de tijd wordt doorgebracht. Als bijvoorbeeld een functie 5% van je uitvoertijd in beslag neemt, dan zal na optimalisatie van deze functie een maximale snelheidswinst van 5% kunnen voorkomen. Daarom is het best om eerst te kijken naar de stukken code waar het meeste deel van de tijd wordt doorgebracht, en deze te optimaliseren, aangezien zij de meeste (potentiele) tijdswinst kunnen opleveren.

jodeman

Legacy Member
omg da is zalig. Met die JProfiler kunt ge kijken wa er veel CPU time pakt in uw code. Dak nooit heb stilgestaan bij het bestaan van zoiets, schandalig. Nu zie ik dat ik ne wait ben vergeten in één van met threads, in spelleke, lol.

thx kwitters

edit : jprofiler heeft zelfs plugin voor in eclipse, dan kunde da direct in jprofiler runnen hebk just ontdekt :)

Ice

Legacy Member
kwitters zei:
Getters en Setters worden meestal wel gedocumenteerd, kijk maar naar alles van Microsoft, Sun, Game SDK's etc.



Persoonlijk hou ik mijn code liefst zo eenvoudig en duidelijk mogelijk. En vind ik

position.x += speed.x

duidelijker en makkelijker te debuggen dan

position.setX( position.getX() + speed.getX() )

als ze trouwens toch exact hetzelfde doen. Maar misschien is dit gewoon persoonlijke voorkeur ofzo.

en wat vindt ge dan van position.increaseX(speed.getX());
of msch iets logischer: position.moveRight(speed.getX());
en dan position.moveLeft(speed.getX());
das nog duidelijker

kwitters

Legacy Member
Ice zei:
en wat vindt ge dan van position.increaseX(speed.getX());
of msch iets logischer: position.moveRight(speed.getX());
en dan position.moveLeft(speed.getX());
das nog duidelijker

Als je dit gaat doen dan gaat je Vector class enorm veel functies bevatten, wat het niet meer overzichtelijk maakt. Ik ben zelf voor het principe: "Make everything as simple as possible, but not simpler".
Met een 3D vector ga je al 6 nieuwe functies hebben (move left, right, forward, backward, up, down). Hetgeen ik gaf was maar een voorbeeld van alle mogelijkheden. Stel het volgende voor om de snelheid te dempen op x:

speed.x *= 0.9;

Dan moet je hiervoor weer apparte functies gaan schrijven, en uiteindelijk zit je met een vector classe die enorm groot is met tal van code die je in de eerste plaats al kan vermijden.

Massis

Legacy Member
nu het toch over getters en setters gaat:

ik ben momenteel voor school bezig aan een project in vb.net (bankterminal schrijven)
ik heb bijv een klasse rekening, met daarin zijn private member variables, die allen beschermd worden door een property

nu maak ik een object rekening aan in een andere klasse (ff "test" noemen voor het gemak)

daarna moet ik vanuit een 3e klasse (mijn form bijv) aan de rekeningobjecten uit die klasse "test"

omdat de variabele eigenschappen van rekening reeds beschermd worden door een getter en een setter, zag ik geen nut in nogmaals een getter en een setter schrijven in de klasse test, dus declareerde ik deze objecten public, zodat ik er vanuit mijn andere klasses aankan.

Van de ene leerkracht mocht dit eventueel, de andere werd bijna hysterisch want je mag "nooit" public declareren.

mijn vraag:
als de eigenschappen van een object beschermd zijn door getters en setters, mag ik dan de objecten zelf public declareren om de toegang ertoe te vergemakkelijken?
(of is er een andere manier om vanuit meerdere klasses toegang te krijgen tot diezelfde objectinstanties zonder gebruik van properties)

kwitters

Legacy Member
punkrockdude zei:
Van de ene leerkracht mocht dit eventueel, de andere werd bijna hysterisch want je mag "nooit" public declareren.

"Those who can, do, those who can't, teach". Als je dit zegt ga je hem/haar pas echt hysterisch zien :D .

punkrockdude zei:
mijn vraag:
als de eigenschappen van een object beschermd zijn door getters en setters, mag ik dan de objecten zelf public declareren om de toegang ertoe te vergemakkelijken?
(of is er een andere manier om vanuit meerdere klasses toegang te krijgen tot diezelfde objectinstanties zonder gebruik van properties)

Oftewel maak je ze public en vergeet je get/set, oftewel scherm je ze af en maak je get/set om ze te accessen. Waarschijnlijk is in dit geval het beste dat je via get/set werkt, aangezien je je data misschien moet testen of het wel een valid rekeningnummer is enzo.

Massis

Legacy Member
kwitters zei:
"Those who can, do, those who can't, teach". Als je dit zegt ga je hem/haar pas echt hysterisch zien :D .
mijn moeder is leerkracht ;), maar'k ga het toch eens tegen haar(= leerkracht vb.net) zeggen :D (NA de verdediging van mijn project)

't is echt wel correct in dit geval

bijvoorbeeld: "mevrouw, ik heb hier een fout, en ik heb dat , dat, dat en dat geprobeerd, maar ik krijg mijn fout niet weggewerkt, ik weet wel waar ze zit."

antwoord 1e keer: "ja maar wij spelen de klant die een code wil dus wij kunnen u nie helpen"

antwoord week erop (andere fout, goed doorgezaagd tot ze kwam helpen): *staart naar code voor 5 minuten* : "ja da is waarschijnlijk ergens een foutje in uw structuur, maar uw code ziet er heel goed uit" (ALSOF DAT HELPT, zover was ik ook al!!!)
kwitters zei:
Oftewel maak je ze public en vergeet je get/set, oftewel scherm je ze af en maak je get/set om ze te accessen. Waarschijnlijk is in dit geval het beste dat je via get/set werkt, aangezien je je data misschien moet testen of het wel een valid rekeningnummer is enzo.


dat moet idd (bij het overschrijven vnl) gecontroleerd worden, maar daarvoor zitten bij het versturen (dus bij de sub van de verstuurknop) enkele tests...
maar: dit moet gecontroleerd worden voor Rekeningnummer, en dat is een member variable van bijvoorbeeld het object Rekening1, en het rekeningnr van Rekening1 wordt al beschermd door een get/set, dus waarom nogeens een extra get/set maken voor rekening1 zelf?


mss dat'k dit nog aanpas maar ik vrees ervoor want we komen nu al vreselijk tijd te kort :3 weken terug project opgekregen, sindsdien heeft 3 man er elke week een uur of 10 aan gewerkt, en't is nog nie af, moet echter tegen vrijdag klaar zijn en da gaat niet lukken... We moeten bankterminal met login schrijven, waarmee ge rekeninginformatie kunt bekijken en overschrijvingen doen, alsook begunstigden opslaan. alle objecten moeten in een testklasse aangemaakt worden zodat we die volgend jaar door een database kunnen veranderen.
Vorig jaar moesten ze een protonTerminal schrijven (= 1 rekening, 1 pincode, 1 rekeningsaldo en 1 protonsaldo)
nu met die bankterminal zijn dat oneindig aantal rekeningen, pincodes, saldo's, gebruikers etc... en is't dus aardig wa moeilijker

(ik heb overigens in totaal 42uur vb les gehad , 1 trimester dus, waarna we dit horen te kunnen)

.Acku.

Legacy Member
jodeman zei:
Is er eigenlijk een programma die de processortijd kan weergeven voor stukken in uw code (in java)? Dat zou echt handig zijn voor bottlenecks te vinden.

JProfiler is idd de ideale tool, voor benchmarks samen met uw code kan je ook AOP gebruiken, AroundAdvices van Spring bvb. Zo kan je die getCurrentTimeMillis rond een bestaande methode 'introduceren'.

jodeman

Legacy Member
Zal is testen, kheb aspectJ gevonden (goeie?), ook een plugin voor eclipse. Maar nu eerst examen van wisk gaan doen ;).

.Acku.

Legacy Member
AspectJ is erg bekend, ik persoonlijk heb enkel ervaring met Spring AOP. Dat is erg simpel als je project als met Spring werkt.

den Acid Burn

Legacy Member
@punkrockdude:

over welke leerkracht hebben we het hier mss?
tis maar dat ik ook op xios gezeten heb.

Massis

Legacy Member
den Acid Burn zei:
@punkrockdude:

over welke leerkracht hebben we het hier mss?
tis maar dat ik ook op xios gezeten heb.

die van RAD eerste jaar :p (Wouters vnl, ook wel 'n beetje over Lambrechts in mindere mate)
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan