tifyty

pure Java, what else ?

Szeretjük-e az import static-ot?

Az 1.5 Java-val együtt jött be az import static lehetősége. Aki nem tudná, hogy ez micsoda, annak számára elmesélem, hogy ezzel más osztályokból static metódusokat, mezőket lehet beimportálni az osztályunkba és ott úgy lehet ezeket használni, mintha a saját osztályunkban lettek volna megírva.

Persze valami hasonló volt korábban is, hiszen 1.5 előtt is volt olyan, hogy meghívtunk egy metódust, és hiába kereste a vi editor, hogy hol is van az a metódus, csak nem találta az éppen nyitott fájlban: azért, mert örököltük a metódust, vagy mert absztrakt az osztályunk, és csak egy leszármazott fogja implementálni azt a metódust.

Az import static pedig formailag (hangsúlyozom, hogy csak formailag) más, tök idegen osztályokból “származtat” át statikus metódusokat, mezőket a mi osztályunkba. Innen kezdve aztán már gondolkodhatunk, hogy egy metódus, amit nem talál a vi az örökölt, absztrakt, vagy statikus import. Ez olvashatatlanná teszi a kódot és ezért nem szeretjük az import static lehetőségét.

Na de hát ki programoz ma már vi-ban? Maximum Dénes, de már ő is belátta, hogy a vi elavult, és áttért emacs-ra. Eclipse-t, Netbeans-t használunk, és ha tudni akarjuk, hogy egy metódus hol is van definiálva, akkor csak lenyomjuk a Cmd gombot, és az egérkurzor máris átváltozik, a mezőnév aktív link lesz, egy kattintás, és már ott is vagyunk a metódus definíciójánál, vagy valamelyik implementációjánál, amit éppen szeretnénk. Az előbbi indok tehát nem állja meg a helyét. Ugyanakkor nézzük meg a következő kódot:

    @Test
    public void testGetConfigValueWhenEnvironmentKeyExists() {
        new Business() {
            private String actual;
            private Properties props;

            @Override
            public void given() {
                props = PowerMockito.mock(Properties.class);
                PowerMockito.mockStatic(System.class);
                config.setConfigProperties(props);
                Mockito.when(props.containsKey(key)).thenReturn(true);
                Mockito.when(props.getProperty(key)).thenReturn(badValue);
                Mockito.when(System.getenv("sb4j." + key)).thenReturn(value);
            }

            @Override
            public void when() {
                actual = config.getConfigValue(key);
            }

            @Override
            public void then() {
                Mockito.verify(props).containsKey(key);
                Mockito.verify(props).getProperty(key);
                PowerMockito.verifyStatic();
                System.getenv("sb4j." + key);
                Assert.assertEquals(value, actual);
            }

        }.execute();
    }

Nem lenne sokkal szebb, ha az elejére beszúrnánk némi import static utasítást, és akkor már így nézne ki:

    @Test
    public void testGetConfigValueWhenEnvironmentKeyExists() {
        new Business() {
            private String actual;
            private Properties props;

            @Override
            public void given() {
                props = mock(Properties.class);
                mockStatic(System.class);
                config.setConfigProperties(props);
                when(props.containsKey(key)).thenReturn(true);
                when(props.getProperty(key)).thenReturn(badValue);
                when(System.getenv("sb4j." + key)).thenReturn(value);
            }

            @Override
            public void when() {
                actual = config.getConfigValue(key);
            }

            @Override
            public void then() {
                verify(props).containsKey(key);
                verify(props).getProperty(key);
                verifyStatic();
                System.getenv("sb4j." + key);
                assertEquals(value, actual);
            }

        }.execute();
    }

Az biztos, hogy rövidebb. De lehetne még rövidebb is, ha még a System class getenv metódusát is statikusan importálom. Hopsz… akkor viszont már nem működik az egész. (Most itt nem fejteném ki, hogy miért, el kell olvasni a How to mock the system class cikket, abból kiderül.)

Szóval ebben a speciális esetben tesztelhetetlenné teszi a kódot a statikus import, de legalábbis megakadályozza azt a fajta mókolást, amit az említett cikkben leírtam.

Hogy szeretjük-e vagy nem szeretjük a statikus importot nem egzakt kérdés. Nem olyan, hogy működik, vagy nem működik. Nem lehet eldönteni a kérdést, hogy jó-e vagy sem. Azt lehetne csinálni, amit TAO-ban: mérni rettentően sok programozó munkáját, és megnézni, hogy hol keletkezik jobb kód. Mi a jobb kód? Hol lesz kevesebb bug. Vagy a hibák száma nem is számít, inkább az, hogy mennyi óra kijavítani őket. De vajon lassabban dolgoznak-e akik használnak statikus importot? És kit mérjünk? Csak open source projekteket? Vagy céges fejlesztéseket is? Azt elég nehéz lesz. Akiknek mostanában dolgozom legszívesebben azt szeretnék ha azt is eltitkolnám, hogy ez alatt az idő alatt létezem. (Néha úgy érzem magam, mint egy Ben Affleck, csak nincs közben mellettem egy Uma Thurman. Nah, de felejtsük is el ezt a témát.) Mennyivel egyszerűbb a TAO. Ott minden egyes kezelésről készül hibajegy, és csak nagyon ritkán fordul elő, hogy ha valaki meghal, akkor ezt az eseményt ne vinnék fel a ticketing rendszerbe. Cserébe viszont nem működik a jó öreg control-alt-del és újraindítás.

4 responses to “Szeretjük-e az import static-ot?

  1. Gábor Garami (@hron84) szeptember 7, 2012 4:35 du.

    En a JUnit teszteknel hasznalok statik importot, masutt eszembe se jut. De tenyleg, fel sem merul bennem a lehetoseg.

  2. Ivan Ketler szeptember 10, 2012 7:30 de.

    Az 1600-as pixelszélességű képernyők korában egyre kevésbé probléma, de azért ma is bőven van olyan széles sor, aminek az elolvasásához szkrollozni kell. Ilyen esetekben akár segíthet is a static import. Ezzel együtt metódus statikus importja még soha nem jutott eszembe, de konstansokat elég gyakran importálok vele.

    Amúgy nagyon nem tér el a normál importtól – egyik is, másik is egyfajta gyorsírás. Az sem igaz, hogy olvashatatlanná tenné a kódot, sőt – a static import kifejezetten jelzi, hogy hol kell keresni a kérdéses konstanst.

    • mhmxs október 2, 2012 1:20 du.

      ” Ilyen esetekben akár segíthet is a static import” Nem értek egyet, ilyen esetekben a maximális sorhodssz segít

Vélemény, hozzászólás?

Adatok megadása vagy bejelentkezés valamelyik ikonnal:

WordPress.com Logo

Hozzászólhat a WordPress.com felhasználói fiók használatával. Kilépés / Módosítás )

Twitter kép

Hozzászólhat a Twitter felhasználói fiók használatával. Kilépés / Módosítás )

Facebook kép

Hozzászólhat a Facebook felhasználói fiók használatával. Kilépés / Módosítás )

Google+ kép

Hozzászólhat a Google+ felhasználói fiók használatával. Kilépés / Módosítás )

Kapcsolódás: %s

%d blogger ezt kedveli: