Symbiatch - maailma on rikki

Propertyt Javaan - paremmin kuin C#ssa?

24.05.2007 11.56 - ohjelmointi 

Törmäsin tässä aika huvittavaan pätkään tonkiessani nettiä ihan muista asioista. Cay Horstmannin sivuilla (näyttää kirjoittaneen useita kirjoja Javasta jne eli tietänee sentään jotain, toisaalta on opetusvirassa) on linkki hänen oppilaansa tekemään viritelmään jolla saisi propertyt Javaan. C#:ssahan moiset ovat oikein mukavia. Hän kylläkin mainitsee tästä viritelmästä: "Like C#, just better." Ja toivoo että Java 7 sisältäisi nämä. Katsotaanpa miten ovat parempia.

Ehdottavat seuraavaa muotoa:

@Property
private String name;

Joka sitten tuottaisi tällaisen Java-koodin:

private String name;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

Ok. Eli siis parempaa kuin C# lienee se, että C#:lla joutuisi tekemään näin:

private string _name;

public string Name()
{
    get { return _name; }
    set { _name = value; }
}

Eli hieman vaikeampaa, mutta helpompaa kuin Javassa nykyään. Mutta jos sitten mietitään mikä se pointti on: propertyjen idea on suojata dataa ja hallita miten sitä käsitellään. Heidän esittämänsä yksinkertainen esimerkki on järjetön. Vaikka kuinka olioinnin paradigmat sanoisivat, ettei ikinä saa päästää suoraan kiinni muuttujiin, minä en sitä syö. Jos kerran saa lukea ja kirjoittaa mitä tahansa, miksi tehdä toimintaa hidastavat getterit ja setterit? Ja kun heidän esimerkkinsä todellakin vain tekee tuon!

Myöskin ihmetyttää miten tuo heidän makroviritelmänsä on parempi kuin C# kun sillä ei näytä saavan tehtyä edes tällaista perustoimintoa:

private int _length;

public int Length()
{
    get { return _length; }
    set
    {
        if (value < 0)
        {
            throw new ArgumentException("Value cannot be negative");
        }
    }
}

Saati sitten vaikkapa metodikutsuja tiedon päivittämiseen kantaan tai laskentarutiinia joka palauttaa sisäisen metrisen mitan maileina tai...

Mutta tokihan tällaisia ei kukaan kaipaa, joten heidän esittämänsä propertyt riittävät. Vai pitäisiköhän heidän miettiä hieman uudestaan miten homma pitäisi tehdä?

Argh. Juuri huomasin että tyyppi on todellakin käsittänyt asiat ihan väärin:

Properties are useful for specifying, that is, marking certain aspects of the entity that are to be highlighted to a client of this entity, and in doing so, allowing this client to deduce special behavior from these markings. For example, a Widget class can define properties to represent its visual aspects, which can later be used by a GUI builder tool.

Tuota... Ehkä kannattaisi laajentaa maailmankatsomusta. Kyllä niitä noihinkin voi käyttää (ja C#:ssa on sitten vielä attribuutit joilla määritellään mukavia lisäjuttuja), mutta kyllä niillä on ihan tärkeämpiä perustoiminteita kuten juurikin datan eheyden varmistus.

Kommentoi

Kommentit

kebax (anon, 24.05.2007 13.10)

Ceesharpin propertyt lienee kotoisin VBstä eli jotain hyötyä siitäkin kielestä on sitten ollut. Asiaan väljästi liittyen: VBstä on imaistu myös mukaan for-each luuppaus sekä switchiä on laajennettu VBn select-case tyyppiseksi (eli huolii haarautumiseen stringejäkin!). Kaikki nämä pointit huomioon ottaen pidän ceesharppia jossain määrin fiksumpana kuin Javaa.

(anon, 24.05.2007 19.38)

Niin näihin CSharpin propertyihin liittyy yksi seikka, minkä takia ne ovat erityisesti olemassa. Tosin, satavarmasti en muista, mutta puolivarmasti muistelen, että propertyt ovat tehty remoting käyttöä silmälläpitäen, taikka muuten operoitaessa verkon yli. Eli privatet muuttujat on kapseloitava propertyihin, josko meinään toimia onnistuneesti ohjelmassaan verkon yli esim. erillisillä dll-komponenteilla ???

symbiatch (25.05.2007 10.03)

Kyllä .NET Remotingin kautta voi tökkiä ilman propertyjakin muuttujia ja mitä tahtoopi, näin ainakin muistelisin viimeksi tehneeni. Mutta tietysti aina kiltimpää propertyjen kautta ellei ole hälläväliä-tietoa. Ja silloinkin pedantit puritanistit itkevät ja huutavat.

(anon, 25.05.2007 18.55)

Niin näihin propertyihin vielä, että Anders Hejlsberg on kertonut jossain artikkelissa sen, miksi propertyjen käyttä on "ihan pakko" jos aikoo onnistuneesti käyttää C#-koodista esim. entisiä C++-"komponentteja". Nyt en löydä tähän hätään tuota Hejlsbergin artikkelia. Mutta palataanpa asiaan, kun saan tongittua tuon CD-läjän, johon olen arkistoinut artikkeleita C#in kehityksen vaiheita alusta alkaen. Tosin määrittelyt ja merkitykset ovat voineet muuttua sitten C#in alkupäivien tämän päivän maailmaan verratttuna.

Jutut.fi  |  Omat jutut  |  Muiden jutut  |  Kategoriat  |  kirjaudu