OOP: soll man jetzt alles in ne Klasse packen oder watt?
-
Gregor schrieb:
Du kannst in Java auch prozedural programmieren, weil es pragmatisch gesehen oft besser ist, sich nicht zu 100% auf ein Programmierparadigma festzulegen. Aus meiner Sicht ist das also eine Frage des Pragmatismus, wobei ich nicht weiß, was sich die Designer von Java bei jedem einzelnen Sprachfeature gedacht haben.
Also gibt es kein pures OO?
Ich kenne Javascript nicht, kann Dir Deine Frage deshalb nicht beantworten. Ich kann Dir nur sagen, dass die Antwort sicherlich eine Abwägung beinhalten müsste. Das ist bei den meisten Sprachen keine Entscheidungsfrage.
es geht um andere konzepte.
java script bietet zB das prototype konzept.es ist eine alternative zum klassen konzept. darum geht es. es ist einfach so, dass es verschiedene konzepte gibt um OO durchzusetzen.
ihr nehmt jetzt ein paar gaengige konzepte und sagt OOP wird dadurch definiert. aber ein lisp programmierer wird vielleicht sagen man braucht multi methods fuer OOP. ein JS programmierer wird sagen dass Klassen sinnlos sind und nicht OO, weil klassen zu statisch sind und sich nicht erweitern lassen. und dass vererbung nur ein billiger versuch ist das zu simulieren.
es gibt soviele konzepte. ihr nagelt euch auf ein paar wenige fest und alles was das nicht ist, ist nicht OO.
FILE* sagt dir sicher etwas. ich habe eine factory dafuer: fopen(). ich kann damit devices oeffnen, speicher bereiche, dateien, etc. und ich habe funktionen die auf diesem objekt operieren (fwrite, fread, fseek).
das ist klassische OOP.
alles was ich nicht kann ist von FILE* ableiten. ok, per definition ists halt sealed und gut ist.
es gibt soviel mehr konzepte als in eurer java welt. (und auch C++ welt oder sonst was - es gibt viele welten und viele konzepte).
-
Und deswegen solltest du nicht die Konzepten mischen
in C++ gibst keine Sprachfunktion von eine normale Funktion auf ein interne Daten zuzugreifen, deswegen ist das ja auch klassische prozeduale Programmierung.class a{ private: int zahl; public: void set(int); int get(void); } void a::set(int a) { this.zahl = a; } int a::get(void) { return zahl; }
int zahl; void set(int a) { zahl = a; } int get(void) { return zahl; }
Wahrscheinlich weil die sytaxtische Transformierung so leicht ist, meint ihr es sei OOP.
Bein oberen Code beginnt OOP und unten ist es einfache prozeduale Programmierung.
-
Zeus schrieb:
Und deswegen solltest du nicht die Konzepten mischen
in C++ gibst keine Sprachfunktion von eine normale Funktion auf ein interne Daten zuzugreifen, deswegen ist das ja auch klassische prozeduale Programmierung.gibt es sehr wohl.
- friend
- public data member
-
nachtrag:
syntax ist komplett egal. was zaehlt ist der gedanke dahinter.
der code ist semantisch komplett gleich.
-
Bitte beweis es durch Code.
und public data member fällt eh weg weil es gegen Datenkapselung ist.
-
Das ist stinknormale prozedurale Programmierung.
Nein, ist es nicht, wie du ja selbst sagst: (okay, es werden Prozeduren benutzt, aber das schließt ja OOP nicht aus, Methoden sind ja in vielen Programmiersprachen auch nur Prozeduren)
Nur weil hier Objekte wie double, tastatur, auftauchen, nennt ihr das Objectorientiert ?
Ja, weil Nachrichten (Funktionen bzw. Prozeduren bzw. Methoden ...) auf Objekte angewandt werden.
Weil kein Objekt da ist zu dem eine Nachricht geschickt wird ?
object.nachricht(daten);
So sieht es normalerweise aus.
prozedurfunktion(object, daten);
Also deine Definition von Objektorientierterprogrammierung lautet:
"OOP bedeutet die Benutzung folgender Syntax: Objektname "." Nachricht "(" Argumente * ")";"
gut, wenn das deine Definition ist, dann hast du eine andere Definition als die meisten Menschen.
Zeus schrieb:
Ob JavaScript OO ist, ist das wichtig?
Die eigentliche Definition von OOP ist(ich hab ja schon geschrieben):
Muss beinhalten:
-Kapselung
-Vererbung
-PolymorphieWeder die Definition von Gregor, noch die, nach meiner Meinung zutreffendere, von Bashar enhalten diese Bedingungen.
aber ich bin desweiteren auch zu Akzeptieren von andere Definitionen, aber bis jetzt nix gehört.
Lies noch mal den Thread
Aber was soll eigentlich immer die Abschweifungen in anderen Sprachen, wir haben C++ als Thema und bisschen Java (Gregor :P)
Nein, eigentlich ist OOP das Thema. Dein Thema scheint C++ und Java zu sein.
Die Umsetzung von OOP in anderen Programmiersprachen soll dir eben aufzeigen, dass nicht nur Java und C++ "OO" definieren. Besonders da beide Sprachen ja sehr ähnlich sind und die OOP Umsetzung im Grunde gleich ist (kommt mir bitte nicht mit Syntax Kleinigkeiten, ich rede vom Prinzip).
Die Erkenntis aus JavaScript das Funktionen Objekte sind nach C++ zu übertragen, halte ich für riskant.
überträgt niemand
Zeus schrieb:
Und deswegen solltest du nicht die Konzepten mischen
in C++ gibst keine Sprachfunktion von eine normale Funktion auf ein interne Daten zuzugreifen, deswegen ist das ja auch klassische prozeduale Programmierung.interne Daten? Wovon sprichst du? Du musst ja auch kein struct nehmen als ein Objekt, wenn dir das zu offen ist, dann packst du die Daten eben in ein eigenes Format. Aber hey, was glaubst du ist eine Klasse in C++?
so muss weg
-
Shade: Ich habe die OOP-Definitionen, die es so im Netz gibt, nicht selbst gemacht. Ich habe auch nicht die Begriffswelten erfunden, die damit verbunden sind und auch nicht die Konzepte, die damit im Allgemeinen assoziiert werden. Ich kann nur sehen, was in den Büchern und anderen Quellen steht und kann dann sagen, dass etwas darauf zutrifft oder eben nicht. Du und volkard scheint euch den OOP-Begriff nach eurem belieben hinzubiegen und zu ändern. Das steht euch aber nicht zu. Ihr habt ja auch noch keine andere Definition der OOP angebracht, die vielleicht eine seriösere Quelle darstellt. Warum eigentlich nicht? Findet Ihr keine Definition, die eurer Vorstellung entspricht? Scheint genau das Gleiche zu sein, wie mit dem Schnittstellenbegriff weiter oben. Auf mich wirkt es so, als ob Ihr in einer Begriffs-Parallelgesellschaft lebt. ...oder bin ich das?
Ich glaube nicht, dass ich das bin, weil meine Vorstellungen mit den Definitionen, die man so findet, übereinstimmen.
-
rüdiger schrieb:
Weder die Definition von Gregor, noch die, nach meiner Meinung zutreffendere, von Bashar enhalten diese Bedingungen.
Huh? Wo hat Bashar ne Definition gebracht? Habe ich da etwas überlesen? Ich habe übrigens keine eigene Definition gebracht. Ich habe nur aus ner externen Seite zitiert.
-
Shade Of Mine schrieb:
nachtrag:
syntax ist komplett egal. was zaehlt ist der gedanke dahinter.
der code ist semantisch komplett gleich.
Auch falsch, beides tut das selbe, sind in verschieden programmierparadigmen geschrieben und sind sematisch unterschiedlich. Du kannst nicht auf zahl meines Code(in der klassenversion) zugreiffen von keine stelle.
-
@rüdiger
Also ich hab mal gelernt, dass Methoden Funkionen oder Prozeduren sind, die an Objekten gebunden sind.
Und Nachrichten an Objekten geschickt werden.Sowohl Funktionen und Prozeduren sind keine Methoden.
OOP muss mehr sein als eine Illusion :o
-
Gregor schrieb:
Shade: Ich habe die OOP-Definitionen, die es so im Netz gibt, nicht selbst gemacht.
es gibt keine definition von OOP.
weil es einfach zuviele konzepte gibt.allgemein halten alle java fuer 100% OO. was die mehrheit sagt stimmt noch lange nicht.
Zeus schrieb:
Auch falsch, beides tut das selbe, sind in verschieden programmierparadigmen geschrieben und sind sematisch unterschiedlich. Du kannst nicht auf zahl meines Code(in der klassenversion) zugreiffen von keine stelle.
zeig mir etwas das du mit der klassen version kannst was du mit der anderen syntax nicht kannst (wenn wir multimethods in C++ haetten)
ich kann das objelkt a um neue member erweitern, zB einen internen zaehler wie oft a den wert geaendert hat.
struct A { int a; int counter; }; void a_set(A& a, int val) { a.a=val; a.counter++; }
nett oder?
private gibt es auch in c++ nicht.
#define private public und schon ist zugriffskontrolle weg.aber zugriffskontrolle != kapselung
javascript hat zB keine privaten member.und wie leicht zu beweisen ist C++ auch nicht.
folglich ist es nichts was zwingend fuer OOP noetig ist.
-
Zeus schrieb:
@rüdiger
Also ich hab mal gelernt, dass Methoden Funkionen oder Prozeduren sind, die an Objekten gebunden sind.
Und Nachrichten an Objekten geschickt werden.Sowohl Funktionen und Prozeduren sind keine Methoden.
OOP muss mehr sein als eine Illusion :o
und wie bindest du eine funktion an ein objekt?
set(a, 7);
set ist an das objekt a gebunden. auch wenn es nicht teil einer klasse ist.
OO ist keine illusion. nur du siehst nur einen ganz kleinen ausschnitt davon. wir zeigen hier mehr auf. komplett neue idiome und konzepte (die ihr allesamt komplett ignoriert und zu 90% ja nicht mal kennt).
ehrliche frage:
ihr kennt die meisten sachen die wir hier nennen nicht. habt noch nie davon gehoert. und deshalb ignoriert ihr sie. aber solltet ihr nicht lieber euch erstmal damit befassen bevor ihr weiter redet?denn definitiv sind wir nicht auf dem selben wissensstand - was eine diskussion sehr erschwert.
-
Gregor schrieb:
Ich habe übrigens keine eigene Definition gebracht. Ich habe nur aus ner externen Seite zitiert.
<a href= schrieb:
http://en.wikipedia.org/wiki/Object-oriented_programming">
There is not a single, widely-agreed upon definition of object-oriented programming. However, a survey of nearly 40 years of computing literature by Deborah J. Armstrong[2] identified a number of "quarks," or fundamental concepts, identified in the strong majority of definitions of OOP.Wenn du nun die "Quarks" durchgehst wirst du feststellen dass z.B. Java nach dieser Definition keine OO-Sprache ist. Würdest du dem auch zustimmen?
<a href= schrieb:
http://en.wikipedia.org/wiki/Object-oriented_programming">
The idea behind object-oriented programming is that a computer program may be seen as comprising a collection of individual units, or objects, that act on each other, as opposed to a traditional view in which a program may be seen as a collection of functions, or simply as a list of instructions to the computer.
-
Shade Of Mine schrieb:
es gibt keine definition von OOP.
Oh, es gibt tausende Definitionen von OOP. Such mal mit Google.
Deine Argumentation kommt mir ungefähr so vor: Es gibt keine allgemein gültige Definition der natürlichen Zahlen, weil einige meinen, die 0 sei natürlich und andere das anders sehen. ...also nutze ich die reellen Zahlen und sage einfach, es seien die natürlichen Zahlen.
Es geht mir nicht darum, dass es Konzepte zur OOP gibt, die in gewissen Definitionen nicht vorkommen. Es geht mir darum, dass Du weiter vorne ein Design als OOP bezeichnet hast, das einfach nicht mit der Idee hinter der objektorientierten Programmierung in Einklang zu bringen ist. Das ist nicht eine Frage der Auslegung, ob jetzt ein bestimmtes Konzept noch dazu gehört oder nicht. Du hast etwas als OOP bezeichnet, was IMHO völlig gegensätzlich zur OOP ist.
Shade Of Mine schrieb:
allgemein halten alle java fuer 100% OO. was die mehrheit sagt stimmt noch lange nicht.
Unglaublich, wie oft hier "Java" in den Mund genommen wird. Liegt das daran, dass ich in diesem Thread bin? Ich habe das Gefühl, dass ich zu den Leuten gehöre, die Java hier am wenigsten im Thread erwähnt haben.
-
Shade Of Mine schrieb:
aber zugriffskontrolle != kapselung
javascript hat zB keine privaten member.Als Datenkapselung (englisch: encapsulation) bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails. Der direkte Zugriff auf die interne Datenstruktur wird unterbunden und erfolgt statt dessen über definierte Schnittstellen. Z.B. ist eine Deklaration von Daten nur innerhalb eines Programmmoduls eine Form von Kapselung.
Private Eigenschaften erstellen
Wenn es öffenliche Eigenschaften gibt, muß es logischerweise auch private, nicht öffentlich zugängliche, Eigenschaften in einer Klasse geben. Um solche privaten Eigenschaften zu definieren verwendet man das vorangestellte Wort var:function Person() { this.vorname = "Hans"; this.nachname = "Müller"; this.geschlecht = "männlich"; var alter = 30; }
Wenn man nun versuchen würde auf diese Eigenschaft in einem erstellten Objekt zuzugreifen, würde man dies nicht tun können:
var neuePerson = new Person(); alert(neuePerson.alter); //liefert undefined zurück
Quellen:
http://de.wikipedia.org/wiki/Datenkapselung_(Programmierung)
http://webmatze.de/webdesign/javascript/javascript_oop_part_one.htmWir sollen wir und auf neues konzentrieren, wenn wir bei das was vorhanden nicht einig sind?
-
Gregor schrieb:
Oh, es gibt tausende Definitionen von OOP. Such mal mit Google.
Deine Argumentation kommt mir ungefähr so vor: Es gibt keine allgemein gültige Definition der natürlichen Zahlen, weil einige meinen, die 0 sei natürlich und andere das anders sehen. ...also nutze ich die reellen Zahlen und sage einfach, es seien die natürlichen Zahlen.
ich hab keinen bock auf diese kinderkacke.
rede ordentlich mit mir oder lass es.
Es geht mir nicht darum, dass es Konzepte zur OOP gibt, die in gewissen Definitionen nicht vorkommen. Es geht mir darum, dass Du weiter vorne ein Design als OOP bezeichnet hast, das einfach nicht mit der Idee hinter der objektorientierten Programmierung in Einklang zu bringen ist.
erklaer mir warum.
darum geht es. du sagst nur "es ist nicht oo". aber du kannst es nicht erklaeren.
was fehlt dem tastatur beispiel?
ich kann einfach den eingabetyp von tastatur auf maus aendern.
ich kann neue typen hinzufuegen. das ganze mit statischer polymorphie. wenn ich multimethods haette, koennte ich das auch mit dynamischer.und dynamische oder statische polymorphie ist im prinzip das selbe.
was fehlt dir? vererbung? das ist ein konzept. javascript hat keine vererbung.
aber wozu brauche ich vererbung? code reuse?
ich nehme an du wirst sagen fuer polymorpie - aber fuer statische brauche ich das nicht. da brauche ich vererbung nur fuer code reuse - wie JS zB super zeigt. dort ist vererbung nur fuer code reuse gut, und wird dort dadurch simuliert dass du den kompletten inhalt einer klasse in eine andere kopierst.Unglaublich, wie oft hier "Java" in den Mund genommen wird. Liegt das daran, dass ich in diesem Thread bin? Ich habe das Gefühl, dass ich zu den Leuten gehöre, die Java hier am wenigsten im Thread erwähnt haben.
wenn ich eine andere sprache als beispiel nehme kapiert das ja keiner. schau dir die lisp und js beispiele an. ihr kennt nur java und c++. alles was nicht java oder c++ ist, wird ignoriert.
-
finix schrieb:
<a href= schrieb:
http://en.wikipedia.org/wiki/Object-oriented_programming">
The idea behind object-oriented programming is that a computer program may be seen as comprising a collection of individual units, or objects, that act on each other, as opposed to a traditional view in which a program may be seen as a collection of functions, or simply as a list of instructions to the computer.Damit stimme ich voll und ganz überein.
-
Zeus schrieb:
Als Datenkapselung (englisch: encapsulation) bezeichnet man in der Programmierung das Verbergen von Implementierungsdetails. Der direkte Zugriff auf die interne Datenstruktur wird unterbunden und erfolgt statt dessen über definierte Schnittstellen. Z.B. ist eine Deklaration von Daten nur innerhalb eines Programmmoduls eine Form von Kapselung.
ok. c++ kann keine kapselung.
java uebrigens auch nicht. ich kann per unsafe an den internen sachen rumfummeln.
das "wird unterbunden" ist nicht genau definiert. man verbietet es einfach und gut ist. wenn man durch tricks dann doch daran rum frickelt, dann ist das einfach undefiniertes verhalten.
zB in PHP hat man die laengste zeit gesagt: wenn das ding mit einem _ beginnt, dann ist es private und du darfst es nicht nutzen.
zugriff unterbunden. passt.
technisch kann ich mir in c++ helfen indem ich private schreibe - laesst sich aber problemlos umgehen.
-
Der Punkt ist aber das C++ die Sprachmöglichkeit bietet OO zu programmieren ein Objektorientiert Design zu implementieren. Und das tut es. Ob es nun mit seinen Mittel auch es aushebeln kann. Ok es kann es, aber das hintert dich auch nicht daran Objektorientiert zu Programmieren.
btw Präprozessor-Direktiven sind keine C++ Sprechmittel sondern ein C++ Werkzeug, oder?
-
Gregor schrieb:
finix schrieb:
<a href= schrieb:
http://en.wikipedia.org/wiki/Object-oriented_programming">
The idea behind object-oriented programming is that a computer program may be seen as comprising a collection of individual units, or objects, that act on each other, as opposed to a traditional view in which a program may be seen as a collection of functions, or simply as a list of instructions to the computer.Damit stimme ich voll und ganz überein.
Und wo genau list du da jetzt raus dass es zwangsläufig Methoden sein müssen mit denen man auf anderen Objekten operiert? Und was sagst du zu dem Rest?