Toon posts:

[Java] Kleine vraag, ingewikkelde instructie.

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
code:
1
node = ( node.left != null) ? node.left : node.right;


Ik zag al staan dat deze constructie zoveel mogelijk vermeden moet worden, maar ik kom hem steeds tegen in mijn boek. Kan iemand mij vertellen wat deze constructie precies doet.

[ Voor 5% gewijzigd door Verwijderd op 10-03-2011 20:56 ]


Acties:
  • 0 Henk 'm!

  • Shadoxfix
  • Registratie: Juni 2010
  • Laatst online: 18:42
Dit is toch gewoon een if statement in een variable?

Oftewel:
als node.left niet gelijk is aan null.
Dan is node = node.left
Anders is het node = node.right.

(Hier spreekt een beginnende java programmeur correcties zijn welkom)

Waarom dit vermeden zou moeten worden weet ik niet.
In mijn boek word het ook vaak gebruikt.

[ Voor 19% gewijzigd door Shadoxfix op 10-03-2011 20:59 ]


Acties:
  • 0 Henk 'm!

  • krvabo
  • Registratie: Januari 2003
  • Laatst online: 21:34

krvabo

MATERIALISE!

Dat is een verkort if-statement.

if node.left != null -> node = node.left
else node = node.right;

Pong is probably the best designed shooter in the world.
It's the only one that is made so that if you camp, you die.


Acties:
  • 0 Henk 'm!

  • Ansur
  • Registratie: Januari 2004
  • Laatst online: 22-09 11:38
Zoek eens op ternaire operator. De reden dat dit zogezegd vermeden moet worden is voor de leesbaarheid. Het kan wel 'ingewikkeld' worden wanneer je geneste ternaire operators gebruikt.

Imo. is dit net een mooie constructie, persoonlijk waarschijnlijk?

[ Voor 61% gewijzigd door Ansur op 10-03-2011 21:00 ]


Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 20:30

beany

Meeheheheheh

Zelfde als

code:
1
2
3
4
if ( node.left != null )
   node = node.left;
else
   node = node.right;


En deze constructie hoef je helemaal niet te vermijden. Het maakt code soms overzichtelijker.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

  • l1dert
  • Registratie: Oktober 2007
  • Laatst online: 26-08 12:19
Ansur schreef op donderdag 10 maart 2011 @ 20:59:
Zoek eens op ternaire operator. De reden dat dit zogezegd vermeden moet worden is voor de leesbaarheid. Het kan wel 'ingewikkeld' worden wanneer je geneste ternaire operators gebruikt.

Imo. is dit net een mooie constructie, persoonlijk waarschijnlijk?
Schrijf wel snel, maar verhoogd de leesbaarheid van de code niet echt. Zeker als je code van een ander voorgeschoteld krijgt lees je er al snel overheen wat er nu precies staat. Persoonlijk vind ik het zelf ook niet fijn om te gebruiken in mijn eigen code. En in de coding guidelines op het werk staat het gelukkig ondertussen ook als don't opgenomen.

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zoals inderdaad gezegd is dat een ternary operator, en dat is dus gewoon een operator die aan de hand van een expressie een van de 2 argumenten terug geeft. Ik zie niet in waarom je deze constructie zou moeten vermijden. Natuurlijk moet je er wel mee oppassen dat het leesbaar blijft. Als je deze constructie meerdere malen gaat nesten dan kan het inderdaad wat onleesbaar worden. Maar voor alle taal-constructies geld dat er gevallen zijn waar je het wel voor wil gebruiken en waar niet.

Ik gebruik de ternary operator in ieder geval vrij vaak, en zolang je ook goed oplet hoe de formatting van je code is, vind ik het zeker bijdragen aan beter leesbare en minder vebose code.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 02-10 16:55
Stiekem had ik vandaag net een bug omdat ik het 'if' en 'else' gedeelte hiervan omdraaide, :/.

Java:
1
2
3
4
public EenOfAnderObject doeIets() {
    List<EenOfAnderObject> lijst = haalIetsOp();
    return (list.size() == 0) ? list.get(0) : null;
}


Vandaar de waarschuwing. Ternary operator zou je alleen in de meest eenvoudige en overduidelijke contexts moeten gebruiken. Bij meer dan één statement, bijvoorbeeld, kun je al beter een gewone if / else uitschrijven.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt allemaal!
Gewoon een verkorte if-else dus.

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 27-09 22:01
YopY schreef op donderdag 10 maart 2011 @ 21:20:
Stiekem had ik vandaag net een bug omdat ik het 'if' en 'else' gedeelte hiervan omdraaide, :/.
Heel irritant, heb ik ook paar keer gehad :P

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
YopY schreef op donderdag 10 maart 2011 @ 21:20:
Stiekem had ik vandaag net een bug omdat ik het 'if' en 'else' gedeelte hiervan omdraaide, :/.

Java:
1
2
3
4
public EenOfAnderObject doeIets() {
    List<EenOfAnderObject> lijst = haalIetsOp();
    return (list.size() == 0) ? list.get(0) : null;
}


Vandaar de waarschuwing. Ternary operator zou je alleen in de meest eenvoudige en overduidelijke contexts moeten gebruiken. Bij meer dan één statement, bijvoorbeeld, kun je al beter een gewone if / else uitschrijven.
Maar met een if-else kan je de statements net zo goed per ongeluk omdraaien. Ik ben het er wel mee eens dat je het statement wel duidelijk moet houden en niet te complex moet maken, maar dat geld eigenlijk net zo goed voor if-else statements.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Mammon
  • Registratie: December 2006
  • Laatst online: 24-09 03:04
De ternary operator is helemaal leuk in combinatie met autoboxing. Wat is hier de uitkomst van:
Java:
1
2
Number num = (true) ? new Integer(5) : new Double(6.0);
System.out.println(num);


spoiler:
5.0

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Als er niet geautoboxed werd dan was de expressie sowieso ongeldig.
.edit: hmm, blijkbaar niet in Java.

[ Voor 21% gewijzigd door .oisyn op 10-03-2011 22:11 ]

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.


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Bij ons is de ternary operator niet verboden, alleen geven wij wel aan dat er terughoudend met de operator dient te worden omgegaan en dat de expressie zonder verdere context te lezen moet zijn.

Wel hebben wij als regel dat de ternary operator niet in een argumenten lijst gebruikt mag worden.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//vermijden
string.Format("Geslacht: {0}", dossier.PrimaryApplicant.IsMale ? "Man" : "Vrouw");


//leesbaarder
string gender = dossier.PrimaryApplicant.IsMale ? "Man" : "Vrouw");
string.Format("Geslacht: {0}", gender);


//minder leesbaar (maar doet hetzelfde)
string gender = string.Empty;
if (dossier.PrimaryApplicant.IsMale)
  gender = "Man";
else
  gender = "Vrouw";
string.Format("Geslacht: {0}", gender);


Maar zoals met alle instrumenten welke je tot je beschikking hebt, moet je ze wel op het juiste moment gebruiken.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 21:22

RayNbow

Kirika <3

Mammon schreef op donderdag 10 maart 2011 @ 21:52:
De ternary operator is helemaal leuk in combinatie met autoboxing. Wat is hier de uitkomst van:
Java:
1
2
Number num = (true) ? new Integer(5) : new Double(6.0);
System.out.println(num);


spoiler:
5.0
Ah, deze komt (in iets gewijzigde vorm) ook voor in Advanced Topics in Programming Languages: Java Puzzlers :)

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Niemand_Anders schreef op donderdag 10 maart 2011 @ 23:28:
Bij ons is de ternary operator niet verboden, alleen geven wij wel aan dat er terughoudend met de operator dient te worden omgegaan en dat de expressie zonder verdere context te lezen moet zijn.

Wel hebben wij als regel dat de ternary operator niet in een argumenten lijst gebruikt mag worden.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//vermijden
string.Format("Geslacht: {0}", dossier.PrimaryApplicant.IsMale ? "Man" : "Vrouw");


//leesbaarder
string gender = dossier.PrimaryApplicant.IsMale ? "Man" : "Vrouw");
string.Format("Geslacht: {0}", gender);


//minder leesbaar (maar doet hetzelfde)
string gender = string.Empty;
if (dossier.PrimaryApplicant.IsMale)
  gender = "Man";
else
  gender = "Vrouw";
string.Format("Geslacht: {0}", gender);


Maar zoals met alle instrumenten welke je tot je beschikking hebt, moet je ze wel op het juiste moment gebruiken.
Op zich inderdaad redelijke regels. Op zich vind ik in dit geval de eerste variant ook gewoon goed leesbaar, maar het introduceren van een extra variabele kan het in veel situaties inderdaad een stuk duidelijker maken, en dan kan je dat inderdaad maar beter gewoon als stelregel nemen
Mammon schreef op donderdag 10 maart 2011 @ 21:52:
De ternary operator is helemaal leuk in combinatie met autoboxing. Wat is hier de uitkomst van:
De volgende code zal toch hetzelfde resultaat hebben neem ik aan? Beide operanden moeten immers van hetzelfde type zijn, en dus zal er een widening conversion toegepast moeten worden?
Java:
1
2
Number num = (true) ? 5 : 6.0;
System.out.println(num);

[ Voor 15% gewijzigd door Woy op 11-03-2011 09:02 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Matis
  • Registratie: Januari 2007
  • Laatst online: 20:16

Matis

Rubber Rocket

Niemand_Anders schreef op donderdag 10 maart 2011 @ 23:28:
Bij ons is de ternary operator niet verboden, alleen geven wij wel aan dat er terughoudend met de operator dient te worden omgegaan en dat de expressie zonder verdere context te lezen moet zijn.

Wel hebben wij als regel dat de ternary operator niet in een argumenten lijst gebruikt mag worden.
Laten we ook hopen dat in jullie afspraken staat dat er altijd accolades rond een if, else etc. statement moeten :)

If money talks then I'm a mime
If time is money then I'm out of time


Acties:
  • 0 Henk 'm!

  • YopY
  • Registratie: September 2003
  • Laatst online: 02-10 16:55
Woy schreef op donderdag 10 maart 2011 @ 21:24:
[...]

Maar met een if-else kan je de statements net zo goed per ongeluk omdraaien. Ik ben het er wel mee eens dat je het statement wel duidelijk moet houden en niet te complex moet maken, maar dat geld eigenlijk net zo goed voor if-else statements.
Da's waar, maar (in mijn ervaring) is dat toch iets makkelijker bij ternary operators, ivm het ontbreken van woorden. if / else is toch iets duidelijker dan ? / :

En dan willen ze ook nog ?: in Java proppen :+.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Matis schreef op vrijdag 11 maart 2011 @ 09:16:
[...]

Laten we ook hopen dat in jullie afspraken staat dat er altijd accolades rond een if, else etc. statement moeten :)
Wat is dat nou voor een onzin. Dat "laten we hopen" bedoel ik dan. Het blijft gewoon een subjectieve afspraak.
Woy schreef op vrijdag 11 maart 2011 @ 09:00:
De volgende code zal toch hetzelfde resultaat hebben neem ik aan? Beide operanden moeten immers van hetzelfde type zijn, en dus zal er een widening conversion toegepast moeten worden?
Java:
1
2
Number num = (true) ? 5 : 6.0;
System.out.println(num);
Maar zonder autoboxing is er een conversie naar Number mogelijk voor beide operanden, en dan blijft de uitkomst dus een Integer, en geen Double.

[ Voor 48% gewijzigd door .oisyn op 11-03-2011 10:16 ]

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.


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Matis schreef op vrijdag 11 maart 2011 @ 09:16:
[...]

Laten we ook hopen dat in jullie afspraken staat dat er altijd accolades rond een if, else etc. statement moeten :)
De afspraken welke wij hebben afgesproken hebben als voornaamste doel om de leesbaarheid te verhogen.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (true)   
  Console.WriteLine("Hello world");
else
  Console.Writeline("You're never gonna see this..");



if (true)
{
  Console.WriteLine("Hello world");
}
else
{
  Console.Writeline("You're never gonna see this..");
}


Bij ons geeft Resharper zelfs een suggestie om de accolades te verwijderen.
De accolades zijn bij ons alleen verplicht als er meerdere statements in een if of else blok moeten komen..

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Amras
  • Registratie: Januari 2003
  • Laatst online: 01-10 12:59
Niemand_Anders schreef op vrijdag 11 maart 2011 @ 10:53:
[...]
De accolades zijn bij ons alleen verplicht als er meerdere statements in een if of else blok moeten komen..
Wat vrij logisch is, want zonder accolades gaat dat niet lukken. :P

Ik gebruik eigenlijk alleen geen accolades bij dit soort code:

C#:
1
2
if (foo != null)
    foo.Bar = 1;


of

C#:
1
2
if (foo == null)
    throw new ArgumentNullException("foo");


Bij meer ingewikkeldere expressies vind ik het er vaak rommeliger uitzien, maar bij korte statements staat het wel netter.

[ Voor 10% gewijzigd door Amras op 11-03-2011 11:07 ]


Acties:
  • 0 Henk 'm!

  • SPee
  • Registratie: Oktober 2001
  • Laatst online: 22:20
Totdat je moet refactoren, niet goed oplet en een 2e statement aan de if denkt toe te voegen.

Java:
1
2
3
4
String bla = null;
if( true )
  bla = "true";
  System.out.println( bla.length() );

// NullPointerException
vs
Java:
1
2
3
4
5
String bla = null;
if( true ){
  bla = "true";
  System.out.println( bla.length() );
}

let the past be the past.


Acties:
  • 0 Henk 'm!

  • Nick_S
  • Registratie: Juni 2003
  • Laatst online: 14-10 02:10

Nick_S

++?????++ Out of Cheese Error

Dat geeft geen NPE hoor. ;) Maar ik ben het er wel mee eens, ook al doet autoformatting tegenwoordig ook een hoop om dit soort dingen tegen te gaan.

'Nae King! Nae quin! Nae Laird! Nae master! We willna' be fooled agin!'


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh, wel hoor.

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.


Acties:
  • 0 Henk 'm!

  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 21:22

RayNbow

Kirika <3

Er staat "if (true)"? :p

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Ansur schreef op donderdag 10 maart 2011 @ 20:59:
Zoek eens op ternaire operator. De reden dat dit zogezegd vermeden moet worden is voor de leesbaarheid. Het kan wel 'ingewikkeld' worden wanneer je geneste ternaire operators gebruikt.
Zolang je ze niet nest vind ik het prima leesbaar en onzin dat ze 'vermeden' zouden moeten worden. Dit hoor je als Java dev gewoon te snappen.
Niemand_Anders schreef op vrijdag 11 maart 2011 @ 10:53:
De afspraken welke wij hebben afgesproken hebben als voornaamste doel om de leesbaarheid te verhogen.
Ik heb me een keer uren blind zitten staren op iets als dit:
code:
1
2
if(ietsDatInDeMeesteGevallenFalseIs);
   eenMethode();


En dan maar niet uit kunnen vogelen waarom die eenMethode() dus altijd uitgevoerd wordt. Ben sindsdien een groot voorstander van het altijd gebruiken van accolades.

[ Voor 37% gewijzigd door Hydra op 11-03-2011 12:05 ]

https://niels.nu


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

SPee schreef op vrijdag 11 maart 2011 @ 11:16:
Totdat je moet refactoren, niet goed oplet en een 2e statement aan de if denkt toe te voegen.
Maar een verkeerde refactoring behoor je af te vangen met je unit tests (code coverage). En ja als je niet goed oplet zal er wel meer verkeerd gaan. Programmeren is een serieuze aangelegenheid en dient derhalve met volle concentratie uitgevoerd te worden. In mijn team is in elk geval geen plaats voor lieden welke routinematig code inkloppen en verder niet nadenken waar ze mee bezig zijn en of het allemaal wel zo logisch is wat ze aan het doen zijn.
Ik heb me een keer uren blind zitten staren op iets als dit:
En ja een punt-komma plaatsen na een if statement heeft verder weinig met coding standaards te maken en ook als je de accolades wel gebruikt kan zo'n fout nog steeds voorkomen met hetzelfde resultaat.

C#:
1
2
3
4
if (if(ietsDatInDeMeesteGevallenFalseIs);
{
   eenMethode();
}


Accolades markeren alleen het begin en einde van een instructie blok en mogen daarom ook los gebruikt worden. Het is verder nutteloos, maar je compiler zal er niet over vallen.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • Jeffroiscool
  • Registratie: December 2006
  • Laatst online: 29-09 23:46

Jeffroiscool

Proud DD Member! :D

Gamebuster schreef op donderdag 10 maart 2011 @ 21:22:
[...]

Heel irritant, heb ik ook paar keer gehad :P
Dat had ik gister nog, ik facepalmde hard toen ik er na 1 uur debuggen achter kwam :/

League of Legends [Last Updated 22-08-2012]: [EUW] Jeffro (Now:Silver, S1:Bronze), RankedSolo5x5: 1502 [120W/106L], Dominion: 84W, TT: 3W, Normal: 504W


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

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.


Acties:
  • 0 Henk 'm!

  • Hydra
  • Registratie: September 2000
  • Laatst online: 06-10 13:59
Niemand_Anders schreef op vrijdag 11 maart 2011 @ 12:24:
Accolades markeren alleen het begin en einde van een instructie blok en mogen daarom ook los gebruikt worden. Het is verder nutteloos, maar je compiler zal er niet over vallen.
Doh 8)7

Je hebt helemaal gelijk. Ik zou zweren dat Eclipse daar tenminste een warning op gaf maar dat kan ook gewoon...

https://niels.nu


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 02:34

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zou de warning verwachten op de empty statement na de if, niet zozeer op het gebruik van accolades erna.

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.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb wel een druk topic geopend zo :P
Pagina: 1