Toon posts:

[Java] Switch

Pagina: 1
Acties:

Verwijderd

Topicstarter
De volgende code is niet goed. Hij begint te zeuren dat ik autoResponderCommentaar dubbel declareer.. maar de switch komt binnen met autoresponder = 0 of 1... dus dan wordt ie toch maar één keer gedeclareed??

hoe zit dit??
code:
1
2
3
4
5
6
7
8
9
10
11
12
switch ( autoresponder )
{
case 0:
// geen autoresponders
String autoResponderCommentaar = "Niet";
break;

case 1:
// wel autoresponders
String autoResponderCommentaar = "Wel";
break;
}

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03-09 13:30

.oisyn

Moderator Devschuur®

Demotivational Speaker

case blocks hebben geen aparte scope. Je zult dus of autoResponderCommentaar voor de switch moeten declareren, of gebruik moeten maken van compound statements ( { en } om je case blocks heen dus)

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.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
Bestaat er in Java geen mogelijkheid om van de ene case naar de andere case te gaan?
Dus als je nu de 'break' in case 0 weglaat, dat hij dan ook nog case 1 uitvoert? In dat geval heb je dan wel 2x dezelfde variable.
Declareer die variable er dus gewoon buiten.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Stom van me.. dankje.. 't werkt..

Alleen het volgende probeleem:

ná de case kan hij nu de string 'autoResonderCommentaar' niet vinden als ik deze wil echo-en.

  • whoami
  • Registratie: December 2000
  • Laatst online: 21:11
autoResponder...
Op vrijdag 07 juni 2002 11:15 schreef samba het volgende:
Stom van me.. dankje.. 't werkt..
Je gaat me toch niet gaan vertellen dat je er niet zelf was opgekomen? :?

https://fgheysels.github.io/


  • judgem
  • Registratie: December 2001
  • Laatst online: 28-04-2014

judgem

Lord of Metal

Op vrijdag 07 juni 2002 11:14 schreef whoami het volgende:
Bestaat er in Java geen mogelijkheid om van de ene case naar de andere case te gaan?
Dus als je nu de 'break' in case 0 weglaat, dat hij dan ook nog case 1 uitvoert? In dat geval heb je dan wel 2x dezelfde variable.
Declareer die variable er dus gewoon buiten.
Kun je in dat geval niet beter een if-statement gebruiken?

edit:
effe toelichten:
[code]if ( autoresponder == 0)
{
// geen autoresponders
String autoResponderCommentaar = "Niet";
}

else
{
// wel autoresponders
String autoResponderCommentaar = "Wel";
}[/code]

- Ik bespreek ook harde waren en dan wel op www.lordsofmetal.nl - en ik draai en programmeer ze in DYNAMO


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Ik vind het sowieso al vies om met harde getallen te werken bij switches die voor een code staan. Doe het gewoon zo:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private static int NO_AUTORESPONSE   = 0;
private static int AUTORESPONSE     = 1;

public void blaat( ){
    String autoResponderCommentaar = "";

    switch( autoresponder ) {

        case NO_AUTORESPONSE:
            autoResponderCommentaar = "bla";
            break;

        //Ook default
        case AUTORESPONSE:
        case default:
            autoResponderCommentaar = "boeh!";
            break;
    }

    System.out.println( autoResponderCommentaar );

}

Hoewel je hier maar 2 opties hebt, was toch duidelijk een if statement zou zijn in mijn geval. Echter een switch is wel netter uit te breiden later :)

Verwijderd

Mjah gewoon van te voren je string declareren, dat staat imho ook wat netter.

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Kijk eens hier:

[topic=517168/1/25]

hoe het allemaal prettiger zou kunnen ;) . Met 'given' als expressie en geen fall-through had je het zo kunnen schrijven:
code:
1
2
3
4
5
6
7
8
9
public void blaat( ){

  String autoResponderCommentaar =
    given (autoresponder ) {
     when NO_AUTORESPONSE { "bla" }
     when AUTORESPONSE    { skip  }
     default          { "boeh!" }
    }
}

Lekker he? ;) .

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 07 juni 2002 20:12 schreef mbravenboer het volgende:
Kijk eens hier:

[topic=517168/1/25]

hoe het allemaal prettiger zou kunnen ;) . Met 'given' als expressie en geen fall-through had je het zo kunnen schrijven:
code:
1
2
3
4
5
6
7
8
9
public void blaat( ){

  String autoResponderCommentaar =
    given (autoresponder ) {
     when NO_AUTORESPONSE { "bla" }
     when AUTORESPONSE    { skip  }
     default          { "boeh!" }
    }
}

Lekker he? ;) .
Erg lekker, vooral omdat switch/given dan ook als een pipe kan dienen om bijv een string te returnen. Heb je dus ook al dat geblaat met die vars in de switch niet meer.

Maar inderdaad die constanten zijn inderdaad erg lekker :+

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Glimi: Maar inderdaad die constanten zijn inderdaad erg lekker :+
Netjes hoor ;) .

Overigens kan ik mezelf niet meer heugen dat ik een switch gebruikt heb in Java, het is ook een bekende bad-smell dus kennelijk stinkt mijn code in ieder geval op dit punt niet ;) .

Zie over die stinkende switch ook hier:
[topic=515335/1/25]

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Ben zelf niet zo'n fan van C-achtige syntax, maar in genoemde voorbeeld vind ik het nog prima te verantwoorden:

autoResponderCommentaar = (autoResponder==0?"Niet":"Wel");

Maar bij meer dan 2 mogelijkheden kan een switch erg nuttig zijn, en bovendien vaak een stuk duidelijker; behalve als je de "fall-through" gebruikt (dus in sommige gevallen de break weglaat), dat maakt het vaak een lastig te tracen stuk code.

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Op vrijdag 07 juni 2002 20:44 schreef mbravenboer het volgende:
Netjes hoor ;) .

Overigens kan ik mezelf niet meer heugen dat ik een switch gebruikt heb in Java, het is ook een bekende bad-smell dus kennelijk stinkt mijn code in ieder geval op dit punt niet ;) .

Zie over die stinkende switch ook hier:
[topic=515335/1/25]
De stinkende switch. Ik ga even grabbelen in wat C++ code waarin ik bijna alleen maar met switches gewerkt heb :) want daarbij kon ik met niet voorstellen hoe dat in een nette klasse kon :D

Deze classe Parste de binaire boom die hem gegeven werd vanaf elk punt in de code. Ik heb alleen even 2 functies gegeven switches bevatten.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
//---------------------------------------------------------------------------
#ifndef CharTreeParserH
#define CharTreeParserH

#include "bintree.h"
//---------------------------------------------------------------------------

namespace glimi_john_van_schie_HvA {

      class CharTreeParser {

            private:
                const static int NODE_LEAF  = 0;
                const static int NODE_LEFT_ONLY = 1;
                const static int NODE_RIGHT_ONLY= 2;
                const static int NODE_BOTH  = 3;

                unsigned int getNodeStatus( main_savitch_10::binary_tree_node<char> *theRoot );
                unsigned int giveDepth( main_savitch_10::binary_tree_node<char> *theRoot )
                //Even de public niet nuttige functies eruitgesloopt
      };
}
#endif

Na de header de CPP. Hierin zie je dat een binary_tree_node template wordt gebruikt. Wees niet bang, deze werd aangeleverd door school (alleen die naam al :( )
Commentaar staat bij de functies
code:
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
//---------------------------------------------------------------------------
#pragma hdrstop

#include "CharTreeParser.h"
using namespace glimi_john_van_schie_HvA;
using namespace std;
using namespace main_savitch_10; //needed for binary_tree_node template
//---------------------------------------------------------------------------
#pragma package(smart_init)

/*
 * Beschrijving:      Deze functie krijgt een binaire boom node mee en kijkt hoeveel kinderen
 *              deze heeft
 * Input:          een binaire_tree_node met maximaal 2 childs.
 * Output:        Een waarde die de childstatus van de node aangeeft. Deze status is een
 *              van de vier volgenden CharTreeParser::NODE_LEAF, CharTreeParser::NODE_LEFT_ONLY
 *              CharTreeParser::NODE_RIGHT_ONLY of CharTreeParser::NODE_BOTH
 */
unsigned int CharTreeParser::getNodeStatus( binary_tree_node<char> *theRoot ){

      int returnStatus = NODE_LEAF;

      if( theRoot->left() != NULL ){
            returnStatus += NODE_LEFT_ONLY;

      }

      if( theRoot->right() != NULL ){
            returnStatus += NODE_RIGHT_ONLY;
      }

      return returnStatus;
}

/*
 * Beschrijving:      Deze functie berekend recursief de diepte van de boom
 * Input:          een binaire_tree_node met maximaal 2 childs. Vanaf deze node wordt de diepte
 *              berekend
 * Output:        de diepte
 */
unsigned int CharTreeParser::giveDepth( binary_tree_node<char> *theRoot ) {

      unsigned int returnValue = 1;
      int leftvalue = 0;
      int rightvalue = 0;

      //bekijk hoeveel kinderen de node heeft
      switch( getNodeStatus( theRoot ) ){

            case NODE_LEAF:
                return 0;

            case NODE_LEFT_ONLY:
                //roep deze functie aan met het linker kind als parameter
                leftvalue = giveDepth( theRoot->left() );
                break;

            case NODE_RIGHT_ONLY:
                //roep deze functie aan met het rechter kind als parameter
                rightvalue = giveDepth( theRoot->right() );
                break;

            case NODE_BOTH:
                //access deze 2x voor zowel het linker als het rechter kind
                leftvalue = giveDepth( theRoot->left() );
                rightvalue = giveDepth( theRoot->right() );
                break;

      } //end switch
      //tel de grootste diepte vanaf deze node op bij de returnValue en return dit getal weer
      return returnValue + max( leftvalue, rightvalue );

}

Hmmmz nu ik het zo zie, bespeur ik ook enkele fouten , zoals een return in de switch, een niet consequente constante benoeming en een niet const pointer variabele als parameter :( Echter daar gaat het even niet helemaal om, maar hoe zet je dit in verschillende classes. Ik zie dat verschil niet helemaal duidelijk namelijk en dat moet het wel zijn :(
Pagina: 1