Objektorientierung... undurchdacht?
lima-city → Forum → Programmiersprachen → Sonstige Programmiersprachen
ansatz
array
berechnen
bit
brauche
code
datenspeicherung
datum
display
element
funktion
listen
methode
problem
programmiersprache
schleife
schleifen
sprache
verarbeitung
zahl
-
Hallo ihr Programmierer :)
Mir wurde gestern erklärt, dass in der Objektorientierung Schleifen nicht enthalten sind.
Deshalb stellt sich für mich folgende Frage: Ist Objektorientierung undurchdacht?
Worauf ich hinaus will: Jeder von euch (der schon mal richtig programmiert hat) wird eine höhere Programmiersprache verwendet haben. Dort gibt es ein tolles Konstrukt zu Datenspeicherung, auch genannt Array. Wie durchläuft man ein Array? Richtig, mit einer Schleife, die es aber im komplett objektorientierten Ansatz aber anscheinend nicht gibt. Was folgt daraus: es kann keine Arrays geben.
Eine andere Methode zur Datenspeicherung sind Listen. Kann man diese ohne Schleife durchlaufen? Ja, und zwar mit Rekursion. Ok, speichere ich mein Bitmap für ein QVGA Display mit 32 Bit Farbtiefe halt in einem QVGA Display. Kein Problem sind ja nur 2457600 Einträge. Das Ausgeben per Rekursion ist kein Problem, ich hab ja unbegrenzt Stack. Auch wenn ich den 945325sten Wert bearbeiten will, ist kein Problem, ich kann ja direkt über den Eintrag 945326 von hinten darauf zu greifen. Jetzt muss ich nur noch die Speicheradresse dieses Elements raten, damit es auch schnell geht.
Ok, mein Programm ist fertig geschrieben, teste ich es mal. Es ist nur absolut unnötig viel Code, indem ich lediglich die Summe 2er Zahlen berechnen will. Dafür brauche ich natürlich eine Taschenrechnerklasse. Und eine abstrakte Rechenoperationsklasse, die ich in meiner Additionsklasse vererbe.
Mal kompilieren drücken... was, ich brauche eine main()-Funktion? In welcher Klasse muss ich die denn unterbringen? In gar keiner? Aber das darf ich doch gar nicht...
Ich hoffe, es ist klar geworden, was ich meine. Natürlich ist mir bewusst, dass ich mich komplett auf die Behauptung stütze, dass Schleifen nicht erlaubt sind, was ich jetzt (absichtlich) nicht aus dritter Hand habe überprüfen lassen. Aber wenn es wirklich so ist, wie ich mir es vorstelle... ist die Objektorientierung (ab einem gewissen Maße) nicht komplett Alltagstauglich?
Ich freue mich auf Antworten.
Grüße
Mator -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ich glaub mal das hängt damit zusammen, dass Objekte nur die Antwort auf die Strukturierung von Daten, aber nicht auf ihre Verarbeitung selbst geben. Die Verarbeitung geschieht mit Mitteln der Sprache, welche die Sprache bietet. Und eigentlich jede Sprache bietet die While und For Schleife sowie das If Konstrukt. Diese Konstrukte und Schleifen gehören aber nicht zum Objektorientierten Ansatz, weil sie zu der Sprache selbst gehören, und das Objektorientierte nicht besonders machen, im Prozedualen oder Funktionalen gibts diese Schleifen und Konstrukte ja auch.
Ich denke, oder anders: Ich kenne es so, dass Objektorientiert bedeutet, wie die Daten strukturiert sind, also wie man Zusammenhänge aufbaut. Die Verarbeitung jedoch ist ein Sprachenfeature.
Liebe Grüße -
Ok, damit wäre das Schleifen Argument entkräftet^^
Aber: Wenn es bei der Objektorientierung darum geht, Daten zu strukturieren, dann widerspricht dennoch das Array dem Konzept. Weil ein Array ist im Grunde genommen nur ein reservierter Bereich im Speicher. Auf die einzelnen Elementen greife ich ja mit dem Pointer des Arrays + die größe des Datentyps * die Elementnummer zu, aber ich habe keine objektorientierte Zugriffsfunktion.
Widerspricht sich das nicht mit der Objektorientierung? Müsste ich nicht deshalb Listen verwenden? Oder sehe ich das falsch?
Grüße
Mator -
class Objektorientiert : Verwendeter_Programmiersprache
{
}
hoffe, das erklärts hinreichend.
Array ist eben so ein Sprachelement, wie strukturanweisngen (ifelseforeachdowhile) und daher unabhängig von objektorientiert.
Ein array st übrigens bereits eine datenstruktur, denn Objektorientiert sagt ja nciht, dass die Daten elementar vorliegen, wie es in relationalen Datenbanken der ersten Normalform gewünscht ist, sndern dass einfach eine gewisse Hierarchie aufgebaut ist, dass jedes element einem anderne zugewiesen ist. damit regelst ud auch zugriffbarkeit und sichtbarkeiten der einzelnen elemente und kannst entsprechende fehler durch datenmanipulation an unerwarteten stellen ausschließen. und das array zählt soweit ich weiß zu den elementaren Datenstrukturen. zumal du dir den subscriptionsoperator dir ja wie gehabt selbst überladen kannst... -
Zunächst ist es ganz wichtig folgendes zu wissen: Es gibt keine kanonische Definitions von "Objektorientierung". Wenn man sich die verschiedenen Programmiersprachen anschaut, wird man gravierende Unterschiede erkennen, wie OOP in diesen Sprachen umgesetzt ist. Nur um mal ein paar Beispiele zu nennen: Smalltalk mit Message passing, Java mit Klassenhierarchien, JavaScript mit Prototypen, Python mit internen dictionaries und Verweise auf die jeweilige Klasse, Lua mit Metatabellen, Clojure mit einfachen structs die Protokolle nutzen um struct-spezifisches Verhalten zu bewirken, Haskell mit Type Classes, .... Das sind alles sehr unterschiedliche Ansätze zu OOP.
Wenn eine Programmiersprache von sich behauptet komplett auf OOP zu setzen, bedeutet das meiner Erfahrung nach nur, dass die jeweilige Auslegung von OOP zum großen Teil auf die Sprache angewendet wird.
Wahrscheinlich könnte man auch eine reine OOP-Sprache schaffen, die Turing-vollständig ist. Diese Sprache wäre dann aber vermutlich eher unschön. Daher verwendet man in der Praxis noch zusätzliche Konzepte aus andereren Programmierparadigem wie der imperativen, funktionalen, logischen oder deklarativen Programmierung.
Und nebenbei bemerkt kann man Arrays auch problemlos in OOP als verkettete Liste nachbauen.
Beitrag zuletzt geändert: 19.3.2013 18:12:13 von bladehunter -
Ein Array ist nur ein Hilfsmittel, um eine n-dimensionale Speicherstruktur zu realisieren. Wenn du Wert darauf legst, in deinem Code keine Schleifen, sondern Iteratoren zu verwenden, dann kannst du eine solche Struktur auch objektorientiert umsetzen. Persönlich halte ich das für relativ unnütz, denn damit verwirfst du eine Möglichkeit, die dir eine Programmiersprache bietet, indem du sie neu entwickelst. Zeitverschwendung.
-
Ein Array ist ein abstrakter Datentyp (und zwar der einzige den man wirklich braucht, Listen, Strings, Dictionarys ja sogar Zahlen würden sich theoretisch als Array darstellen lassen) und kann durchaus auch Objekte enthalten, ich sehe da nichts wiedersprüchliches.
-
Da ich gerade noch etwas Zeit habe, will ich noch einmal detailiert auf den Eröffnungsbeitrag eingehen
mator-kaleen schrieb:
Hallo ihr Programmierer :)
Mir wurde gestern erklärt, dass in der Objektorientierung Schleifen nicht enthalten sind.
Von welcher Quelle sprechen wir hier?
Deshalb stellt sich für mich folgende Frage: Ist Objektorientierung undurchdacht?
Du meinst wahrscheinlich "nicht gut durchdacht".
Worauf ich hinaus will: Jeder von euch (der schon mal richtig programmiert hat) wird eine höhere Programmiersprache verwendet haben. Dort gibt es ein tolles Konstrukt zu Datenspeicherung, auch genannt Array. Wie durchläuft man ein Array? Richtig, mit einer Schleife, die es aber im komplett objektorientierten Ansatz aber anscheinend nicht gibt. Was folgt daraus: es kann keine Arrays geben.
//pseudocode class ArrayElement: member content; ArrayElement next; map = function( f ) { if self.next: return f.apply( self.content ) + next.map( f ) else: return end_of_list } //sei $a eine Verkettung von ArrayElement $schleifenergebnis = $a.map( new functionApplicator( ... ) )
Eine andere Methode zur Datenspeicherung sind Listen. Kann man diese ohne Schleife durchlaufen? Ja, und zwar mit Rekursion. Ok, speichere ich mein Bitmap für ein QVGA Display mit 32 Bit Farbtiefe halt in einem QVGA Display. Kein Problem sind ja nur 2457600 Einträge. Das Ausgeben per Rekursion ist kein Problem, ich hab ja unbegrenzt Stack. Auch wenn ich den 945325sten Wert bearbeiten will, ist kein Problem, ich kann ja direkt über den Eintrag 945326 von hinten darauf zu greifen. Jetzt muss ich nur noch die Speicheradresse dieses Elements raten, damit es auch schnell geht.
Du kannst doch einfach Werte by Reference übergeben und diese Werte auch ändern?
Ok, mein Programm ist fertig geschrieben, teste ich es mal. Es ist nur absolut unnötig viel Code, indem ich lediglich die Summe 2er Zahlen berechnen will. Dafür brauche ich natürlich eine Taschenrechnerklasse. Und eine abstrakte Rechenoperationsklasse, die ich in meiner Additionsklasse vererbe.
Kommt auf den OOP-Formalismus an. Und wenn man es wirklich auf die Spitze treiben will, hast du wahrscheinlich Recht, dass das nicht schön sein wird.
Mal kompilieren drücken... was, ich brauche eine main()-Funktion? In welcher Klasse muss ich die denn unterbringen? In gar keiner? Aber das darf ich doch gar nicht...
Das ist doch kein ungelöstes Problem. Java macht das so, dass man eine main-Methode in der Startklasse hat.
Ich hoffe, es ist klar geworden, was ich meine. Natürlich ist mir bewusst, dass ich mich komplett auf die Behauptung stütze, dass Schleifen nicht erlaubt sind, was ich jetzt (absichtlich) nicht aus dritter Hand habe überprüfen lassen. Aber wenn es wirklich so ist, wie ich mir es vorstelle... ist die Objektorientierung (ab einem gewissen Maße) nicht komplett Alltagstauglich?
Irgendwie ist die Fragestellung komisch. Nach der gleichen Logik könnte man sagen, dass ein Boot nicht komplett Alltagstauglich ist, weil ein Boot kein Meer mitbringt, in dem man schwimmen kann.
Beitrag zuletzt geändert: 19.3.2013 23:11:38 von bladehunter -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage