Keskiviikko, 7.8.2002
Kymmenen kohdan lista Java2-ohjelmointikielen vioista
Java-ohjelmoija ja monen ohjelmointikirjan kirjoittaja Elliotte Rusty Harold on julkaissut artikkelin, jossa hän listaa omasta mielestään pahimmat ongelmat Java2-ohjelmointikielessä. James Gosling aloitti Javan suunnittelun jo yli 11 vuotta sitten ja ensimmäisestä Sunin julkaisemasta Java-versiostakin on ehtinyt kulua jo seitsemän vuotta. Elliotten mukaan vuosien varrella Javaan on kertynyt mukaan paljon historiallista painolastia taaksepäin yhteensopivuuden takia ja muutamia Javan toiminnallisia osioita olisi syytä kirjoittaa kokonaan uudelleen.
Elliotten mukaan Java3-versiosta voitaisiin jättää pois kaikki vanhentuneet (deprecated) metodit ja luokat. Kaikissa luokissa ja metodeissa tulisi ottaa käyttöön sama nimeämiskäytäntö, sillä Javan nykyisessä versiossa on monia ärsyttäviä epäloogisuuksia luokkien ja metodien nimeämisen suhteen. Nimeämistä suuritöisempiä muutoksia olisivat säieluokkien ja I/O-toimintojen uudelleen kirjoittaminen, tiedostomuotojen muuntaminen XML-muotoon sekä AWT-käyttöliittymäluokista luopuminen.
Mikäli Java ei kykene mukautumaan ajan haasteisiin ja tiedossa olevia ongelmia ei korjata ajoissa, joku muu ohjelmointikieli saattaa ottaa Javan aseman markkinoilla. Elliotte uskoo, että nyt on aika luopua taaksepäin yhteensopivuudesta ja keskittyä tulevaisuuteen.
Lue juttu oma, 7.8.2002 08:41. Lähde: OnJava.com
Muita aiheeseen liittyviä uutisia
Kommentoi juttua
lokori, 7.8.2002 09:28:23
Vastaa
Javan kohdalla viat ja väärät tavat tehdä asioita on kuitenkin dokumentoitu poiketen joistakin muista ja henkilö joka vaivautuu ottamaan asioista selvää pystyy välttämään ongelmat helposti. Kaikki tuon kaverin mainitsemat ongelmat ovat olleet tiedossa jo kauan, mutta on aika yksisilmäistä ehdottaa ratkaisuksi JDK:n ja koko ohjelmointikielen radikaalia muuttamista. Sällin muutoksethan rikkoisivat vaatimattomasti kaikki olemassaolevat java-ohjelmat :)
Ongelman ydin on se, että jos joku ominaisuus on käytettävissä, joku sitä myös käyttää. Noiden ominaisuuksien korjaaminen siis rikkoisi javan alaspäinyhteensopivuuden. Ja olemassa olevia softia edelleen kehitettäessä ei takuulla kirjoiteta isoa softaa uusiksi sen takia että joku keksi kirjoittaa JDK:n uusiksi -> pitäydytään vanhassa JDK:ssa -> Sun joutuu ylläpitämään ja tukemaan useampia versioita javasta.
"Mikäli Java ei kykene mukautumaan ajan haasteisiin ja tiedossa olevia ongelmia ei korjata ajoissa, joku muu ohjelmointikieli saattaa ottaa Javan aseman markkinoilla"
No jaa, enpä oikein usko tähän. C++ sisältää mielestäni enemmän ongelmakohtia eikä senkään asemaa ole toistaiseksi juuri horjunut.
Toi kaveri elää utopiassa ja on pudonnut kelkasta (tai ei ole kaikkien väittämiensä osalta tosissaan).
heko, 7.8.2002 11:35:51
Vastaa
Mikäänhän ei tietenkään estä pitämästä kahta JDK:ta koneella...
Heikki http://www.heikkikorpela.fi heikki@heikkikorpela.fi
mxmattil, 7.8.2002 13:11:30
Vastaa
Anonyymi kommentoija, 8.8.2002 09:10:57
Vastaa
janilxx, 8.8.2002 08:40:28
Vastaa
Swingille voi hyvinkin olla tulossa uusi kilpailija Eclipsestä. Lue esim http://www.javaworld.com/javaworld/jw-07-2002/jw-0...
heko, 7.8.2002 11:40:37
Vastaa
http://www.jwz.org/doc/java.html>
En ole kaikista asioista ihan yhtä mieltä (varsinkaan loppukaneetista), mutta hyviä pointteja tuossa on.
Heikki http://www.heikkikorpela.fi heikki@heikkikorpela.fi
mxmattil, 7.8.2002 13:36:01
Vastaa
Ideana hyvä mutta deprekoitujen metodien poistaminen kokonaan aiheuttaisi valtavia kustannuksia aina kun siirrytään seuraavaan java-versioon. Uskon että tällöin yritykset pysyisivät vanhoissa versioissa koska päätös parin sadan tuhannen markan hassaamisessa uuteen javaversioon ei ole mielekäs. Olen itse sunin linjoilla tässä kohdassa.
9. Fix incorrect naming conventions.
Vanhat konventiot jotka on korvattu tulisi deprekoida kuten on käsittääkseni tehtykin. Olen taas sunin linjoilla kulujen takia.
8. Eliminate primitive data types.
Olen sitä mieltä että nopeuden takia primitiivit ovat hyvä asia. Olen myös täysin sillä kannalla että jos nopeuden kannalta optimaalinen tulos saataisiin ilman primitiivejä, ne pitäisi eliminoida välittömästi. Ei siten kuten artikkelissa ehdotetaan vaan yksinkertaisesti poistamalla primitiivit.
Samassa yhteydessä tulisi kieleen lisätä operaattoreiden kuormitus koska muuten koodin kirjoittaminen tulisi äärettömän vaikeaksi.
7. Extend chars to four bytes.
Tähän en osaa kommentoida. Tilan takia char-kokoista mittayksikköä tarvitaan ja sen nimeäminen joksikin muuksi kuin char-nimiseksi historaiallisista syistä olisi päätä sekoittavaa.
6. Fix threads.
Ei kommentteja
5. Convert file formats to XML.
Konfiguraatiotiedostojen osalta olen samaa mieltä, binääriolioiden tallentaminen XML-formaatissa taas kuulostaa turhalta työltä.
4. Ditch the AWT.
Samaa mieltä ja tähän sun on kai Swingillä pyrkinytkin. Ongelma on vain vanhat selaimet jotka eivät pyöritä uutta versiota javasta (microsoft-versiot) ja joille on pakko käyttää awt:tä. Jos tähän saataisiin kunnon ratkaisu, en vastustaisi ollenkaan.
3. Rationalize the collections.
Olen samaa mieltä.
2. Redesign I/O.
Olen kohtuullisen paljon samaa mieltä
1. Redesign class loading from scratch, this time with human interface factors in mind.
Tätä kohtaa ei ole kommentoitu sen ihmeemmin joten en osaa itsekään ottaa kantaa. Instanceof - virhe kuulostaa bugilta ja tulisi korjata.
Siinä jotain kommentteja :-P
Oma lisäykseni olisi
11. Kielen tulisi tukea ekplisiittistä destroy-metodia ilman että garbagecollectoria pitäisi kutsua erikseen.
Anonyymi kommentoija, 7.8.2002 16:54:56
Vastaa
Pineapple, 8.8.2002 23:05:05
Vastaa
lussmu, 10.8.2002 23:44:06
Vastaa
samleh, 7.8.2002 15:47:36
Vastaa
just joo.
lokori, 8.8.2002 09:14:55
Vastaa
Sinänsä en ihan näe miksi javasta pitäisi tehdä "puhdas oliokieli" - eihän mikään estä nytkään kirjoittamasta puhdasta olio-ohjelmaa sillä.
Sunin alkuperäinen tarkoitus kai oli että sama JDK kelpaisi kaikkiin tarkoituksiin, mutta nythän on erikseen J2EE, J2SE ja J2ME, joten ehkä ne eriytyvät myös kielen tasolla enemmän jatkossa. Saa nähdä.
Tietysti olisi hienoa jos olioita voisi ulostaa sekä "packed binary" muodossa että XML muodossa, mutta tätä varten on jo olemassa koodia.
Näinhän se on, mutta aika moni olemassaoleva ohjelma kuitenkin nojaa Hashtableen ja Vectoriin. Muistaakseni HashMap ei ole tarjolla ME:ssä, joten koodin portattavuuden kannalta SE-ME voi olla perusteltua säilyttää nuo vanhat.
Sinänsä olen samaa mieltä että pitäisi olla yhtenäisempi collection api.
mulla olisi lisäyksenä:
"type-safe enumeration pattern" on ainoa järkevä tapa tehdä luetelty tyyppi javassa, ja se toimii hienosti, mutta serialisoinnin yhteydessä joutuu tekemään ruman kikan (pitää määritellä public konstruktori, joka taas mahdollistaa koko patternin pilaamisen). Jos sen saisi jotenkin hoidettua, niin olisi kaunista.
Siitä olen varauksetta samaa mieltä kirjoittajan kanssa että long ja double -tyyppien kuuluisi ehdottomasti olla atomisia, kuten kaikki muut primitiiviset tyypit ovat. Sarjassamme yksi typerimpiä tapoja ampua itseään jalkaan multithreadaavassa softassa.
Tuon muuttaminen ei edes rikkoisi mitään olemassaolevaa.
Anonyymi kommentoija, 8.8.2002 10:53:02
Vastaa
lussmu, 10.8.2002 23:41:24
Vastaa
mxmattil, 11.8.2002 11:47:50
Vastaa
Garbagecollector on toinen hitautta aiheuttava osa ja sen pahimmat ominaisuudet tulevat esiin juuri miljoonien olioiden kanssa. Tämän takia primitiivejä en nyt juuri lähtisi poistamaan ellei joku tosiaan pysty todistamaan minulle että nopeudenlasku ei olisi kokonaisvaikutuksiltaan merkittävä.
lussmu, 12.8.2002 01:30:37
Vastaa
mxmattil, 12.8.2002 10:30:35
Vastaa
Toinen esimerkki, oletko konffannut log4j:n xml- sekä ascii-pohjaista versiota? Ascii häviää xml-formaatille (IMHO).
lussmu, 15.8.2002 18:20:06
Vastaa
locke, 7.8.2002 10:20:17
Vastaa
Mutta olisiko elämä yhtään sen parempaa kun ei tarvitsisi tehdä valintaa swingin ja awt:n välillä tai jos primitiivit olisivat olioita (C#:n tapaan). Niin ikävän tuntuista kuin se onkin, niin asiakkaan, tietohallinnon ja ohjelmoijan tiet vievät aina eri suuntaan. Se mistä "pieni ohjelmoija" sisälläni tykkää, ei välttämättä sovikaan enää päättäjän rooliini puhumatta asiakkaan roolista. Tietyllä tapaa on totta, että Javakin on siirrettävyydestään huolimatta kahlinnut itsensä tiiviisti menneisyyteen. Sen hyvyys tai pahuus riippuu aivan kokonaan siitä kuka hommaa katsoo.
Täydellistä ohjelmointikieltä kun ei vielä olekaan keksitty eikä varmaan tulla koskaan keksimäänkään. Sehän veisi riemun koko hommasta. Joka tapauksessa on hyvä, että joku aina väliin jaksaa provosoida porukkaa esittämällä enemmän tai vähemmän hulluja ideoita.