Originally posted by jUSSi:
ja kuulenko jonkun valittavan, että C++ on huono kieli, päinvastoin! Sehän on loistava ohjelmointikieli Java on taas ihan perseestä, se jo todistettiin koulussa oliosuunnittelu/ohjelmointi-kursseilla, kun tehtiin luokan parhaat rktkaisut kaveri kanssa C++:lla. Jäi muiden Javatuotokset jalkoihin sekä OOP:in periaatteiden toteutuksessa, nopeudessa että tyylissä
Onhan javassakin omat ongelmansa, mutta ei sitä ainakaan voi haukkua oliosuunnittelun kannalta huonoksi kieleksi. C++ on hirvittävä sekasikiö suoraan helvetistä, proseduraalisen ohjelmointikielen päälle rakennettu olio-ohjelmointikieli - C-yhteensopivuuden vuoksi siihen on jouduttu ymppäämään ihan järkyttävä määrä kaikkea skeidaa ja viritystä.
C on itseasiassa paljon parempi kieli kuin C++, se sentään on rehdisti mitä on, jonka takia homma pysyy paremmin hanskassa. C++:ssa on kunnianhimoisia viritelmiä (esim STL), mutta käytännössä kuitenkin ohjelmoija joutuu hyvinkin usein palaamaan C-tyyppisiin ratkaisuihin kun hommat on jätetty puolitiehen.
Muutamia syitä miksi imho C++ on huonompi olio-ohjelmointikielenä:
1) Polymorfisuus ei ole metodeissa sisäänrakennettuna vaan ohjelmoijan on itse muistettava huolehtia siitä. Olin lähestulkoon järkyttynyt kun tajusin että C++:ssa on staattinen linkkaus käytössä. Polymorfismia kuitenkin pidetään yhtenä oliosuunnittelun perusperiaatteista ja kantavista voimista. Siinä mielessä javan kehittäjät ovat tehneet viisaasti kun ovat valinneet ajonaikaisen vaihtoehdon.
2) Ohjelman jakaminen moduuleihin on vaikeampaa. Sen lisäksi että metodeja pitää ympätä toteutuksen lisäksi headeriin, täytyy myös aina moduuleja yhteensovitettaessa taistella includejen yms. tauhkan kanssa. Lisäksi moduulien sovittaminen yhteen moduulihierarkioiksi (javassa kätevästi pakkaushierarkiat) on huomattavasti nihkeämpää. Ohjelmoijalle tulee huomattavasti helpommaksi kirjoittaa koko paska muutamaan pitkään metodiin kuin harrastaa mitään hienovaraista modulointia. Lisäksi itseäni ainakin epäilyttää includeissa tuleva roska - kun includetat yhden tietyn tiedoston, saat tiedoston itsensä includettamat tavarat "kaupan päälle". Tämä rikkoo usein korkean yhtenäisyyden ja matalan koheesion periaatetta.
3) Poikkeuksenkäsittely. C++:ssa tämä on lähes vitsi. Juu, kyllähän ne on tuettu, mutta kun ongelma on että koko hökötys yleensä lepää sen vankan C-pohjan päällä. Kun ohjelma sitten kaatuu niin se yleensä kaatuu niin että syitä saadaan metsästellä C-tyyliin ERRNO-muuttujista tms. informatiivisista paikoista.
Muita syitä miksi C++ (ja osittain näiden takia myös C) on syvältä:
4) Kääntäjät ja niiden virheilmoitukset. (Tarvitseeko tätä edes erikseen mainita?)
5) Tyyppien toteutuksen alustariippuvaisuus. Mikään ei ole raivostuttavampaa kuin miettiä onko tämä muuttuja nyt X- vai Y-bittinen ja mahdollisesti vielä unsigned. Viimeiset pari päivää vierähtikin siinä kun kääntäjän vaihdon jälkeen eräs template-metodi ei hyväksynytkään unsigned charria ja piti yrittää keksiä miten ihmeessä ilman sitä saa käsiteltyä 8-bittisiä positiivisia lukuja. Viritykseksi meni, taas kerran.
6) Rinnakkaisuuden tukeminen. Javassa threadit ja rinnakkaisuuden suoja on sisäänrakennettuna kieleen. C++:ssa on paljon nihkeämpää leikkiä joidenkin linuxin mutexien kanssa.
7) Yleinen virhealttius. Tyypillisestihän sanotaan, että C++:lla voi tehdä mitä vain, mutta vain jos ei tee virheitä. Totuus kuitenkin on, että ihmiset ovat erehtyväisiä, jokainen tekee virheitä. Ja sitten kun niitä virheitä tulee, C++:lla virheiden paikantaminen ja korjaaminen on _huomattavasti_ vaikeampaa. Pahimmassa tapauksessa virhettä ei huomata, ja jo tuotantoon menneen bugin korjaaminen onkin jo itkun paikka. Ohjelmistokehityksen maailmassa bugiset softat ovat murheenkryyni numero yksi. Miksi siis käyttää kieltä, joka on virhealttiimpi, ja maksaa näin kehityksessä enemmän? Sen sijaan voisi valita kielen, joka on sallii vähemmän, mutta myös samalla sallii vähemmän virheitä, ja kun niitä virheitä tulee osaa myös paikallistaa ne paremmin.
No, näistä saa olla eri mieltä ja korjata jos olen väärässä. Ymmärrän kyllä että C++ on tiettyihin tarkoituksiin omiaan, ennen kaikkea tehokkuuden ja muistivaatimusten takia. On kuitenkin huomattava, että nykyisessä maailmassa rauta kehittyy nopeasti, ihmisen aivot vähän tai ei ollenkaan. Tämä on johtanut tilanteeseen, jossa ohjelmistokehityksessä tärkeämmäksi kriteeriksi on noussut projektiin kuluva aika, korkea abstraktiotaso ja matala virhealttius.
PS. Miksi muuten C-pohjaisissa kielissä on hyvin yleisenä tapana käyttää lyhyitä ja kryptisiä nimiä muuttujien ja metodien nimissä? Ei ne näppäimet kovin paljoa kulu jos niitä kirjaimia naputtelee lisää, sen sijaan ohjelmoijalta kuluu ikä ja terveys kun pitää yrittää tulkata mitä ihmettä halutaan sanoa lausekkeella "p = &(++ldrgh(rh->qwerty))"
</ihan hirvittävän offtopik>