Zur Haupt­na­vi­ga­ti­on sprin­gen [Alt]+[0] Zum Sei­ten­in­halt sprin­gen [Alt]+[1]

Vor­wort

Bis Mitte der 1960-er Jahre muss­te eine Firma, die die Diens­te eines Rech­ners in An­spruch neh­men woll­te, deut­lich mehr Geld für die Hard­ware als für die Soft­ware aus­ge­ben. Die Ma­schi­nen waren nicht leis­tungs­fä­hig genug, um kom­ple­xe und um­fang­rei­che Be­feh­le durch­zu­füh­ren. Das än­der­te sich in den 1970-er Jah­ren schlag­ar­tig. Zum einen stie­gen die Kos­ten für das Tes­ten der Soft­ware, zum an­de­ren wurde es immer schwe­rer, Pro­gramm­feh­ler zu fin­den oder die Soft­ware zu war­ten. Denn nach wie vor waren im­pe­ra­ti­ve Pro­gram­mier­spra­chen das Maß aller Dinge. Wie in (die der Ma­schi­nen­spra­che nächs­te Ver­wand­te) As­sem­bler, wurde ein­fach ein Be­fehl nach dem an­de­ren auf­ge­schrie­ben. Dazu kamen jede Menge (be­ding­te) Sprung­be­feh­le, so dass ab ei­ni­gen tau­send Zei­len Code eine Feh­ler­su­che oder Op­ti­mie­rung nur mit größ­tem Auf­wand mög­lich war. Die­ser Sach­ver­halt wurde unter dem Namen Soft­ware­kri­se be­kannt. In­zwi­schen hat sich viel zur Ver­bes­se­rung der Si­tua­ti­on getan, ge­löst ist die Soft­ware­kri­se nach ein­hel­li­ger Mei­nung der Fach­welt aber bis heute nicht.

Die Ur­sa­chen sind viel­fäl­tig. Ein Grund ist aber si­cher, dass die Pro­gram­mie­rer es da­mals nicht für er­for­der­lich hiel­ten, ihren Code so zu schrei­ben, dass er auch von an­de­ren nach­voll­zo­gen wer­den konn­te. Es darf be­zwei­felt wer­den, ob sie selbst nach ei­ni­gen Jah­ren noch wuss­ten, was genau mit den ein­zel­nen Zei­len be­zweckt wurde. Zu einer hohen Kom­ple­xi­tät kam man­geln­de Do­ku­men­ta­ti­on hinzu. Aber auch der „Pro­gram­mier­stil“ selbst gab Grund zu Un­zu­frie­den­heit. Es fehl­te an Stan­dards und an brauch­ba­ren Pro­gram­mier­pa­ra­dig­men.

Vor der OOP hatte man ver­sucht, die im­pe­ra­ti­ven Spra­chen durch be­stimm­te Ver­ein­ba­run­gen auf­zu­wer­ten. Die Pa­ra­dig­men struk­tu­rier­te Pro­gram­mie­rung und/oder pro­ze­du­ra­le Pro­gram­mie­rung waren ein ers­ter Ver­such. Bei der struk­tu­rier­ten Pro­gram­mie­rung muss­te man im We­sent­li­chen auf ab­so­lu­te Sprung­be­feh­le ver­zich­ten. Rea­li­siert wurde diese Tech­nik zum Bei­spiel in der Spra­che Pas­cal. Aber auch der pro­ze­du­ra­le An­satz konn­te in Pas­cal ver­wirk­licht wer­den: Das Auf­tei­len des Pro­gramms in klei­ne Teil­auf­ga­ben (Pro­ze­du­ren). Bei­den Kon­zep­ten ge­mein­sam ist die strik­te Tren­nung zwi­schen Va­ria­blen und Pro­ze­du­ren, eben­so lei­der auch die prin­zi­pi­el­le Mög­lich­keit einer Pro­ze­dur auf alle Va­ria­ble zu­grei­fen zu kön­nen und so even­tu­ell eine un­be­ab­sich­tig­te Än­de­rung in einer Va­ria­blen aus­zu­lö­sen.

Ein wei­te­rer Ver­such, Ord­nung in das „Pro­gram­mier-Chaos“ zu brin­gen, war die Ver­wen­dung funk­tio­na­ler Pro­gram­mier­spra­chen, wie Has­kell. Dort ist ein Pro­gramm eine ma­the­ma­ti­sche Funk­ti­on. Eine Va­ria­ble hat wäh­rend der Aus­füh­rung immer den glei­chen Wert. Die oben ge­nann­ten Pro­ble­me be­züg­lich des Man­gels an Kon­trol­le über eine Va­ria­ble fal­len somit weg. Der Nach­teil: Der mensch­li­che Ver­stand funk­tio­niert nicht funk­tio­nal und ist daher bei die­ser Tech­nik mit­un­ter über­for­dert. Und so wun­dert es nicht, dass das funk­tio­na­le Pa­ra­dig­ma nur in we­ni­gen Be­rei­chen (Uni­ver­si­tät, For­schung) an­ge­wandt wird.

In der Pra­xis brach­ten weder die struk­tu­rier­te noch die pro­ze­du­ra­le Pro­gram­mie­rung den ge­wünsch­ten hun­dert­pro­zen­ti­gen Er­folg. Etwas Neues muss­te er­dacht wer­den. Be­reits 1962 ent­wi­ckel­te Ole-Johan Dahl und Kris­ten Ny­gaard eine Pro­gram­mier­spra­che na­mens Si­mu­la. An­geb­lich waren die bei­den damit be­schäf­tigt, ein Pro­gramm für eine Schiffs­si­mu­la­ti­on zu schrei­ben. Das ge­stal­te­te sich wegen der vie­len ab­hän­gi­gen Pa­ra­me­ter der­art schwie­rig, dass sie am Ende voll­ends den Über­blick ver­lo­ren. So sind sie an­geb­lich auf die Idee ge­kom­men, die Schif­fe selbst als Ob­jek­te zu ver­wen­den, die ihre Daten aber auch selbst ver­wal­ten. Auf diese Weise soll­te eine mög­lichst ge­naue Mo­del­lie­rung rea­ler Ob­jek­te mög­lich wer­den. Diese Ob­jek­te soll­ten un­ter­ein­an­der nur mit­tels vor­her fest­ge­leg­ter Schnitt­stel­len (In­ter­faces) in­ter­agie­ren.

Eine sol­che Pro­gram­mier­spra­che gab es bis­her nicht, also muss­te sie neu ge­schaf­fen wer­den: So wurde Si­mu­la zum Pro­to­typ aller ob­jekt­ori­en­tier­ten Pro­gram­mier­spra­chen. (Der Name OOP ent­stand al­ler­dings erst spä­ter). Zu die­ser Zeit war Pas­cal noch nicht ein­mal an­ge­dacht!

Etwas spä­ter for­mu­lier­ten Mit­ar­bei­ter der For­schungs­ab­tei­lung der Firma Xerox erst­ma­lig ein Klas­sen­kon­zept, das dann in der Pro­gram­mier­spra­che Si­mu­la-67 rea­li­siert und wei­ter­ent­wi­ckelt wurde. Klas­sen sind hier „Kon­struk­ti­ons­an­wei­sun­gen“ für Ob­jek­te, wobei auch hier jedes Ob­jekt eine über­schau­ba­re Menge an Va­ria­blen (hier At­tri­bu­te ge­nannt) und Pro­ze­du­ren (hier Me­tho­den ge­nannt) ent­hält. In der Vor­stel­lung der Ent­wick­ler ist ein Ob­jekt eine Art „Le­be­we­sen“, das auf „Nach­rich­ten“ re­agiert. Eine Re­ak­ti­on kann in einer Ant­wort be­ste­hen oder aber auch in der Än­de­rung eines At­tri­buts. Damit Wie­der­ver­wert­bar­keit und Da­ten­si­cher­heit ge­währ­leis­tet sind, müs­sen ei­ni­ge Re­geln gel­ten, die im nächs­ten Ka­pi­tel dar­ge­stellt wer­den sol­len.

Mit der Spra­che Small­talk wurde An­fang der 70-er Jahre das Mo­del­lie­rungs­kon­zept aus Si­mu­la ver­fei­nert. Ins­be­son­de­re war dies die Idee, be­reits fer­ti­ge Kon­zep­te wie­der­zu­ver­wen­den. Ein ty­pi­sches Bei­spiel ist der klas­si­sche „But­ton“ (na­mens but­ton1) auf einem For­mu­lar im Bild links. In man­chen Pro­gram­mier­spra­chen konn­te man bei den At­tri­bu­ten des But­tons keine Hin­ter­grund­far­be wäh­len. Will man aber einen schwar­zen But­ton mit wei­ßer Schrift, so er­zeugt man den am bes­ten da­durch, dass man die Kon­struk­ti­ons­vor­schrif­ten des nor­ma­len But­tons über­nimmt und um den neuen An­teil (Hin­ter­grund­far­be, Schrift­far­be) er­gänzt. Auf diese Weise kön­nen alle wei­te­ren gra­phi­schen Schalt­flä­chen, die dem But­ton ähn­lich sind, aus dem Ur-But­ton ab­ge­lei­tet wer­den und müs­sen nicht neu er­fun­den wer­den. Und genau dar­aus ent­steht die Idee, fer­ti­ge Kon­zep­te „wei­ter­zu­vererben“.

Am bes­ten kann man den Über­gang vom pro­ze­du­ra­len zum ob­jekt­ori­en­tier­ten Pa­ra­dig­ma an der in den 70-er Jah­ren sehr be­lieb­ten Spra­che C be­ob­ach­ten. Mitte der 80-er Jahre ent­stand aus C das heute, be­son­ders bei den Ju­gend­li­chen, noch immer hoch an­ge­se­he­ne C++. C++ ist nun nicht ge­ra­de ein Mus­ter­bei­spiel der OOP. Den­noch kann man damit nach OOP-Vor­ga­ben pro­gram­mie­ren! Dass die pro­ze­du­ra­le Me­tho­de dort auch noch er­laubt ist, wird ja nur von den Pu­ris­ten ver­ach­tet!

Historie der
            Programmiersprachen, Nepomuk Frädrich (12.08.2012)

His­to­rie der Pro­gram­mier­spra­chen, His­to­ry_of_­ob­ject-ori­en­te­d_­pro­grammin­g_lan­gua­ges.svg von Ne­po­muk Fräd­rich [CC BY-SA 3.0] via Wi­ki­me­dia Com­mons

Heute sind die wich­tigs­ten ob­jekt­ori­en­tier­ten Pro­gram­mier­spra­chen Java, Del­phi und C#. Man kann wohl sagen, dass die In­dus­trie durch die fort­schrei­ten­de Kom­ple­xi­tät der An­wen­dun­gen, ohne den ob­jekt­ori­en­tier­ten An­satz noch lange nicht auf dem heu­ti­gen Stand wäre.

Zur Mo­del­lie­rung ver­wen­det man hier die spra­chen­un­ab­hän­gi­ge UML (Uni­fied Mo­de­ling Lan­gua­ge). Mit Hilfe von Dia­gram­men wird hier die Ab­hän­gig­keit der Klas­sen mit ihren Struk­tu­ren dar­ge­stellt. In dem hier ver­wen­de­ten Ja­va­Edi­tor ist ein UML-Tool in­te­griert.

Dass OOP nicht auf un­ge­teil­te Be­geis­te­rung stieß, ver­steht sich von selbst. So mein­te Eds­ger Di­jk­s­tra, ein Weg­be­rei­ter der struk­tu­rier­ten Pro­gram­mie­rung:

"Ob­ject-ori­en­ted pro­gramming is an ex­cep­tio­nal­ly bad idea which could only have ori­gi­na­ted in Ca­li­for­nia."

Man kann sich auch treff­lich dar­über strei­ten, ob OOP im In­for­ma­tik­un­ter­richt der Ober­stu­fe über­haupt be­han­delt wer­den soll. Ei­ni­ges spricht tat­säch­lich da­ge­gen:

  • Ge­braucht wird diese Tech­nik erst bei Pro­gram­men mit vie­len tau­send Zei­len Pro­gramm­code. Sol­che Pro­gram­me wer­den aber in der Schu­le kaum ge­schrie­ben.

  • OOP ist keine ei­gen­stän­di­ge Theo­rie, wie etwa die Kryp­to­lo­gie, son­dern le­dig­lich eine Tech­nik. Hier passt der Satz: OOP löst die Pro­ble­me, die wir ohne Com­pu­ter nicht hät­ten! Pro­fes­sor U.​Bran­des (Uni­ver­si­tät Kon­stanz) for­mu­liert es so: OOP ist ein Mit­tel zum Zweck. Nicht mehr, aber auch nicht we­ni­ger.

  • OOP setzt vor­aus, dass die Rea­li­tät durch Ob­jek­te mo­del­liert wer­den kann (OOM: Ob­jekt­ori­en­tier­te Mo­del­lie­rung). Eine ge­wag­te These, setzt sie doch vor­aus, dass Rea­li­tät letzt­end­lich durch eine Folge von Ein­sen und Nul­len dar­stell­bar ist.

  • Viele noch heute häu­fig be­nutz­te Pro­gram­mier­spra­chen kom­men völ­lig ohne OOP aus!

Die Grün­de dafür:

  • Zum Ver­ständ­nis des ob­jekt­ori­en­tier­ten Pa­ra­dig­mas wer­den viele In­hal­te des drei­jäh­ri­gen In­for­ma­tik­un­ter­richts be­rührt.

  • Die Mo­del­lie­rung rea­ler Ob­jek­te durch OOP ist bei den in der Schu­le be­han­del­ten Bei­spie­len ver­blüf­fend ein­fach und sorgt mit Hilfe der UML für schnel­le erste Er­fol­ge.

  • Auch bei klei­ne­ren Pro­gram­men kann man den Vor­teil der OOP gut nach­voll­zie­hen: Alles, was man ir­gend­wann er­ar­bei­tet hat, kann pro­blem­los in spä­te­ren Pro­gram­men wei­ter­ver­wen­det wer­den. Auch las­sen sich Feh­ler leich­ter fin­den. Kurz for­mu­liert: Nach kur­zer Ein­ar­bei­tungs­zeit wird die Ar­beit des Pro­gram­mie­rens deut­lich ver­ein­facht.

 

 

Ein­füh­rung: Her­un­ter­la­den [odt][330 KB]

 

Wei­ter zu Sprach­li­ches