/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
#ifdef og den slags ting
Fra : Tim


Dato : 19-07-01 20:31

Hej gruppe. Et spørgsmål... Hvis nu man har nogle kode-fragmenter som
man kun ønsker at inkludere i compileringen ved specielle situationer
(f.eks. test) hvordan gør man så dette. I C/C++ er det meget nemt. Der
kan man bruge #ifdef med tilhør:
#ifdef __UNITTEST
void SetupTC17() {
....
}
#endif

Findes der ikke noget tilsvarende til Java?

/Tim


 
 
Flemming K. Jensen (19-07-2001)
Kommentar
Fra : Flemming K. Jensen


Dato : 19-07-01 20:58


Nej, det findes ikke i Java.

Generelt regnes det for dårlig test at man indsætter kode, som man
senere fjerner når man har testet at programmet virker. Det skyldes
at det program man har efter at have fjernet testen-delene ikke er det
samme som det man "beviste" virkede. Det er selvfølgelig lidt
teoretisk og jeg laver da også selv mange tests som senere fjernes
eller udkommenteres når jeg "konstaterer" at det virker.

En lille detalje i den forbindelse, er at man rolig kan lave kode i
stil med:

if ( Debug.enabled ) {
// test kode
}

hvor 'enabled' er en konstant i et interface 'Debug'. Når man
sætter 'enabled' til 'false', kunne man tro, at der i programmet vil
være en række overflødige if-sætninger der tog tid, men dem
fjerner compileren idet den gennemskuer at de aldrig kan blive udført.
(Jeg ved ikke konkret om Java's compiler fjerner "død kode", men
enhver compiler med respekt for sig selv, har gjort det de sidste
20-30 år, så mon ikke!)

Et eller andet sted i mit baghoved mener jeg at huske, at nogen
har lavet en precompiler til Java, der implementerer bla. de
direktiver du efterlyser - jeg kan bare ikke huske hvor.


/Flemming Jensen


On Thu, 19 Jul 2001 21:30:33 +0200, Tim <tlm@get2net.dk> wrote:

>Hej gruppe. Et spørgsmål... Hvis nu man har nogle kode-fragmenter som
>man kun ønsker at inkludere i compileringen ved specielle situationer
>(f.eks. test) hvordan gør man så dette. I C/C++ er det meget nemt. Der
>kan man bruge #ifdef med tilhør:
>#ifdef __UNITTEST
>void SetupTC17() {
>...
>}
>#endif
>
>Findes der ikke noget tilsvarende til Java?
>
>/Tim
>


Bertel Lund Hansen (19-07-2001)
Kommentar
Fra : Bertel Lund Hansen


Dato : 19-07-01 22:16

Flemming K. Jensen skrev:

>(Jeg ved ikke konkret om Java's compiler fjerner "død kode", men
>enhver compiler med respekt for sig selv, har gjort det de sidste
>20-30 år, så mon ikke!)

Jo.

--
Bertel
http://lundhansen.dk/bertel/   FIDUSO: http://fiduso.dk/

Lars Dam (19-07-2001)
Kommentar
Fra : Lars Dam


Dato : 19-07-01 21:26

On Thu, 19 Jul 2001 21:30:33 +0200, Tim <tlm@get2net.dk> wrote:

>Hej gruppe. Et spørgsmål... Hvis nu man har nogle kode-fragmenter som
>man kun ønsker at inkludere i compileringen ved specielle situationer
>(f.eks. test) hvordan gør man så dette. I C/C++ er det meget nemt. Der
>kan man bruge #ifdef med tilhør:
>#ifdef __UNITTEST
>void SetupTC17() {
>...
>}
>#endif
>
>Findes der ikke noget tilsvarende til Java?

Precompilere er noget uhyggeligt noget, og der er en helt klar årsag
til at man har valgt ikke at have sådan noget snask i Java

Hoved årsagen er at precomileren ændrer på det program man har lavet -
og det i en alvorlig grad endda (f.eks. ændrer typer).

Nuvel, Til lige præcis dit problem, så kan det faktis løses i java.

Du skal bare et eller andet sted lave en final boolean variabel:

class Test{
public final static boolean test = true;
}

class X{:
:
:
if( Test.test ){
System.out.println( "plonk" );
}
:
:
}

Nu er det sådan at kompilere er så smarte at når din test variable er
final, så bliver den aldrig ændret, og når den så har værdien false,
ja så kan compileren finde ud af at den kodestump aldrig vil blive
afviklet, og så bliver den simpelthen optimeret væk.

Kan man ikke lide at det ligefrem bliver kompileret væk, så gør
følgende:

class Test{
private static boolean test = true;
public static boolean isTest(){
return test;
}
}

class X{:
:
:
if( Test.isTest() ){
System.out.println( "plonk" );
}
:
:
}

Det kan så godt være at din test kode kommer med, men gør det noget?

Det kunne jo være at det var debug istedet, og så kan man runtime slå
debug messages til/fra

>/Tim

vh. ld

Brian Matzon (19-07-2001)
Kommentar
Fra : Brian Matzon


Dato : 19-07-01 21:45

"Tim" <tlm@get2net.dk> wrote in message news:3B573559.8090601@get2net.dk...
> Hej gruppe. Et spørgsmål... Hvis nu man har nogle kode-fragmenter som
> man kun ønsker at inkludere i compileringen ved specielle situationer
> (f.eks. test) hvordan gør man så dette. I C/C++ er det meget nemt. Der
> kan man bruge #ifdef med tilhør:
> #ifdef __UNITTEST
> void SetupTC17() {
> ...
> }
> #endif
>
> Findes der ikke noget tilsvarende til Java?
#ifdef o. lign. har intet med C/C++ at gøre!

Men ja, du kan sagtens bruge #ifdef m.m.:
#ifdef og dens venner er et "preprocessor directive" - Et keyword
som bruges af en preprocessor, og ikke en kompiler.
Typisk c/c++ (og mange andre sprog), kører source koden gennem
en preprocessor før den kompiles. Dette gøres kun sjældent af java
programmører..?, og derfor ser man ikke disse directives.
Der er dog ingen hindring i at du bruger en preprocessor - men det
kan give en del komplikationer (om ikke med dit IDE, så med dine
venner/kollegaer).

se i øvrigt:
http://www.geocities.com/CapeCanaveral/Hangar/4040/jpp.html

/Brian Matzon



Tim (20-07-2001)
Kommentar
Fra : Tim


Dato : 20-07-01 11:18

Hej alle. Tak for jeres svar!
Hvis jeg lige må forklare hvorfor jeg synes det i nogle tilfælde er en
god idé at anvende konditionelt kompileret kode i dine klasser.

Normalt vil du jo sørge for at have en vis abstraktion i de klasser du
opbygger således at kun det nødvendige interface er tilgængeligt for
brugeren. Det er en god idé.
Den måde at teste på som bl.a. fyre som Kent Bech og Martin Fowler
argumenterer for er at du laver nogle testcase og testsuite klasser som
anvendes selvstændigt i forbindelse med en "testafvikler". Det er også
en god idé fordi du slipper for at forurene din primære kode med noget
indhold som du ikke bruger i den frigivne version.
Men... nogle gange kan det være ønskeligt at have lidt mere intimt
kendskab til indholdet af de klasser du tester. Det kan være at du i en
testcase gerne vil checke at en private-erklæret variabel har den
forventede værdi eller kalde nogle metoder som ellers kun er
tilgængelige internt. I C/C++ kan du klare problemet ved at erklære din
testcase klasse som friend af klassen du tester. Men det kan man så vidt
jeg ved ikke gøre i Java (dog gives adgang indenfor pakken til default
erklærede variabler og metoder). Det er derfor jeg gerne ville lave
noget internt testkode i klassen som _kun_ anvendes i forb. med test.
Fordi testkoden er inkluderet direkte i sourcen har den jo netop den
fornødne "intimitet" med klassen.

Mvh.
Tim

Tim wrote:

> Hej gruppe. Et spørgsmål... Hvis nu man har nogle kode-fragmenter som
> man kun ønsker at inkludere i compileringen ved specielle situationer
> (f.eks. test) hvordan gør man så dette. I C/C++ er det meget nemt. Der
> kan man bruge #ifdef med tilhør:
> #ifdef __UNITTEST
> void SetupTC17() {
> ...
> }
> #endif
>
> Findes der ikke noget tilsvarende til Java?
>
> /Tim
>



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408928
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste