• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

eigenes Framework erstellen

alles was nicht gekapselt ist an einem objekt gehört zur öffentlichen schnittstelle.
Ja - und? Die Farbe gehört ja anscheinend zur Schnittstelle.

die sollte aber implementierungsdetails verbergen.
Was hat denn eine Eigenschaft mit Implementierungsdetails zu tun?

greifen die die variable nutzenden objekte alle direkt darauf zu, ist das nicht gegeben.
Warum nicht?

will man später doch eine aktion an das setzen binden, musst du alle stellen ändern.
Äh... nein. Dafür gibt es die ES5-Setter und Getter. Die meinte ich mit
einen gescheiten Setter
.

Da muss dann überhaupt gar nichts an anderer Stelle geändert werden.
 
Äh... nein. Dafür gibt es die ES5-Setter und Getter.
...wobei ich eine setter-Funktion bei einer normalen Property, wenn sie wirklich einfach nur den Wert setzt, irgendwie witzlos finde...
und was meinst du dann mit
nervige .set...()-Syntax

die setter/getter notation
Code:
get color  ()
{
  return mycolor;
}
ist nicht weniger nervig als als eine set.../get... funktion
Code:
getColor = function()
{
  return mycolor;
}
und vice versa. keine ahnung worauf du dich beziehst. oder meinst du die anwendung?
var c = obj.color; vs. var c = obj.getColor();
hier finde ich die 2. variante wesentlich besser.
 
die setter/getter notation
Ich meinte eigentlich Object.defineProperty() - aber ist das gleiche Prinzip.

ist nicht weniger nervig als als eine set.../get... funktion
Die defineProperty-Notation ist sogar noch nerviger auf der Implementationsseite, aber
oder meinst du die anwendung?
ich meinte die Anwendungsseite. Dort wird das ja auch (normalerweise) öfters verwendet, wobei die Eigenschaft nur einem definiert werden muss.

hier finde ich die 2. variante wesentlich besser.
Finde ich nicht. Bei der ersten Variante ist es eindeutig klar, was gemacht wird. Ich bekomme die Eigenschaft color vom Objekt obj. Bei der zweiten bekomme ich den Rückgabewert der Funktion getColor() von obj. Ich weiß, dass das so üblich ist, damit das gleiche zu meinen, aber ich kann mir viele Szenarien vorstellen, wo .getColor() ein Funktionsname für eine andere Operation ist (z.B. dass obj aus irgendwas anderem die Farbe ausliest und als Rückgabewert einen Boolean über der Erfolg zurückgibt).

Warum findest du die zweite Variante besser?
 
das geht auch in vielen sprachen nur so.
Das ist ja an sich noch kein Grund, das in JS nicht anders zu machen...

Und im DOM ist es eher unüblich (mir fällt jetzt überhaupt nichts ein, wo das mit .set...() oder get...() gemacht wurde - .setAttribute() und .getAttribute() sind ja was anders) - z.B. INPUT.value ist ja auch über setter/getter realisiert. Somit finde ich es in JS durchaus konsistent, auch in selbst geschriebenen Schnittstellen damit zu arbeiten.

bei setter/getter methoden kann man den zugriff von einem zugriff auf membervariablen nicht unterscheiden.
Muss man ja auch nicht. Genau das sind doch Implementierungsdetails, die man verbergen sollte...
 
mhh, seit einiger zeit ist der text weg, wenn man zulange braucht und die session ausläuft, früher war der nach dem erneuten einloggen wieder da, jetzt nicht mehr.
normalerweise kann man dann zurück und den text kopieren, das ging gerade schief, aber ich hab jetzt keine lust das nochmal zu schreiben.
in kurzform:
das dom ist sprachunabhängig als idl definiert. hinter input.value hängt auch nur eine funktion
value property (Preliminary)
die so auch als schnittstelle erkennbar ist. da man das scritprogrammieren wohl nicht zutraut, werden die im idl geflagt und in scriptsprachen als property umgesetzt. (collection.item(idx) wird speziell in js sogar mit array-klammeroperator zugreifbar gemacht)

Muss man ja auch nicht. Genau das sind doch Implementierungsdetails, die man verbergen sollte...
nein, man darf überhaupt nicht auf membervariablen zugreifen. sieht aber ein setter/getter zugriff aus wie membervariablenzugriff, sollte man ein ungutes gefühl haben als anwender der schnittstelle.
 
hinter input.value hängt auch nur eine funktion
Natürlich hängt dahinter eine Funktion. Aber das ist völlig egal, im JS sieht man davon nichts. Wie gesagt - das sind Implementierungsdetails. Im Grunde genommen ist ja jede Anweisung, die du an die CPU sendest eine Funktion. Trotzdem willst du keinen Maschinencode schreiben...

das dom ist sprachunabhängig als idl definiert.
Ja, ist sie. Aber wenn du schon was refernzierst, solltest du schon das Richtige und Offizielle und nichts Proprietäres nehmen.
.value ist ja nicht Teil des DOM-Cores, sondern HTML: 4.10 Forms ? HTML 5.1 Nightly - schau' dir die IDL an! Das ist eindeutig als Attribut deklariert.
Und im DOM selbst gibt es auch Beispiele: Document Object Model Core - .nodeValue

Somit ist die IDL von MS da nicht der Standard...

die so auch als schnittstelle erkennbar ist.
Ja und... auch eine öffentliche Eigenschaft ist als Schnittstelle erkennbar. Und welche Eigenschaften öffentlich sind, steht in der Dokumentation oder die nicht öffentlichen sind anderweitig markiert.

nein, man darf überhaupt nicht auf membervariablen zugreifen.
Äh - warum? Genau deswegen gibt es in Java public... gibt es jetzt in JS nicht - bzw. es gibt kein private/protected - aber JS ist sowieso extrem flexibel, so dass man jedes Interface kaputt bekommt.

sollte man ein ungutes gefühl haben als anwender der schnittstelle.
Wofür gibt es Dokumentationen? Wenn da drin steht, dass man das so verwenden kann, dann braucht man kein ungutes Gefühl haben.
Und wenn du der Doku nicht vertraust, kannst du ja immer in den Quelltext schauen.

PS:
mhh, seit einiger zeit ist der text weg, wenn man zulange braucht und die session ausläuft, früher war der nach dem erneuten einloggen wieder da, jetzt nicht mehr.
Ich lade da die Seite einfach mit aktiviertem HttpFox neu und kann dann den Text aus den mitgeschnittenen POST-Variablen wieder rauskopieren.
 
Manchmal hilft es übrigens, wenn man nach dem Login auf "zurück" klickt - oft liegt der eingegebene Text (zumindest bei mir) noch im Cache...
 
Manchmal hilft es übrigens, wenn man nach dem Login auf "zurück" klickt - oft liegt der eingegebene Text (zumindest bei mir) noch im Cache...
das meinte ich mit "normalerweise kann man dann zurück und den text kopieren", aber wie gesagt, vor einiger zeit (kann durchaus schon über ein jahr sein), war der text nach dem login noch da.

Im Grunde genommen ist ja jede Anweisung, die du an die CPU sendest eine Funktion. Trotzdem willst du keinen Maschinencode schreiben...
naja, eine anweisung ist eine anweisung und keine funktion, eine funktion besteht aus mehreren anweisungen und kann man mit call aufrufen, der vergleich taugt nichts.
und auch in c++ gibt es classen und auch die haben member, aber in einer schnittstelle greift man nie auf diese zu. deswegen gibt es eine get_value methode und nicht das member value.

Ja, ist sie. Aber wenn du schon was refernzierst, solltest du schon das Richtige und Offizielle und nichts Proprietäres nehmen.
.value ist ja nicht Teil des DOM-Cores, sondern HTML: 4.10 Forms ? HTML 5.1 Nightly - schau' dir die IDL an! Das ist eindeutig als Attribut deklariert.
Und im DOM selbst gibt es auch Beispiele: Document Object Model Core - .nodeValue
du hast input.value als beispiel genommen nicht ich. aber das was ich für value gesagt habe gilt für alle propertys.

a und... auch eine öffentliche Eigenschaft ist als Schnittstelle erkennbar.
in einer schlechten schnittstelle, in einer guten sind nur pure virtuelle methoden, in java abstract

Äh - warum? Genau deswegen gibt es in Java public...
wo nur funktionen reingehören, weil
alles was nicht gekapselt ist an einem objekt gehört zur öffentlichen schnittstelle.
die sollte aber implementierungsdetails verbergen.
greifen die die variable nutzenden objekte alle direkt darauf zu, ist das nicht gegeben. will man später doch eine aktion an das setzen binden, musst du alle stellen ändern.

Wofür gibt es Dokumentationen?
die doku ist keine schnittstellendefinition, sondern erklärt diese im detail

Wenn da drin steht, dass man das so verwenden kann, dann braucht man kein ungutes Gefühl haben.
Und wenn du der Doku nicht vertraust, kannst du ja immer in den Quelltext schauen.
der ist aber auch nur in js(scriptsprachen) einsehbar, und ändert nichts an der tatsache, dass man es bei der anwendung nicht auseinanderhalten kann.

Ich lade da die Seite einfach mit aktiviertem HttpFox neu und kann dann den Text aus den mitgeschnittenen POST-Variablen wieder rauskopieren.
3-5 mal zürück und antworten geht eigentlich auch, keine ahnung was gestern war

Natürlich hängt dahinter eine Funktion. Aber das ist völlig egal, im JS sieht man davon nichts.
ja, was ich aber schade finde, weil, wie du selbst sagst, in js keine echte interfacedefinition möglich ist, was auch wieder gut ist, weil js sehr flexibel ist.
 
Zuletzt bearbeitet:
naja, eine anweisung ist eine anweisung und keine funktion, eine funktion besteht aus mehreren anweisungen und kann man mit call aufrufen, der vergleich taugt nichts.
Und eine Anweisung besteht wieder aus mehreren Operationen, die die CPU durchführt... ist also nach meiner Auffassung so was Ähnliches wie eine Funktion. Aber der Vergleich ist wirklich nicht gut. Ich wollte damit nur veranschaulichen, dass man nicht immer alle Lagen des Anweisungsflusses kennen muss.

und auch in c++ gibt es classen und auch die haben member, aber in einer schnittstelle greift man nie auf diese zu
Wir reden hier aber nicht über C++. Wenn wir von Java oder c++ reden würden, wäre ich ja völlig auf deiner Seite, da es dort dir impliziten Getter/Setter nicht gibt.

aber das was ich für value gesagt habe gilt für alle propertys.
Nein - les' dir die offiziellen Spezifikationen durch. Die sind als Attribute in den IDLs definiert!

in einer schlechten schnittstelle
Das mag in Java oder C++ so sein, aber in JS (seit ECMA 5) nicht.

in einer guten sind nur pure virtuelle methoden, in java abstract
Wie schon gesagt - wir reden hier nicht von C++ oder Java, sondern von JS.

der ist aber auch nur in js(scriptsprachen) einsehbar
Ja und genau darüber reden wir... also was ist das Problem?

ja, was ich aber schade finde, weil, wie du selbst sagst, in js keine echte interfacedefinition möglich ist, was auch wieder gut ist, weil js sehr flexibel ist.
Natürlich kannst du dir ein Interface definieren... du hast nur keinen Compiler, der meckert, wenn du dich nicht daran hältst.
 
ich glaube wir können hier aufhören, ich rede über oop, die ist in ansätzen auch mit js realieseirbar, aber
Natürlich kannst du dir ein Interface definieren... du hast nur keinen Compiler, der meckert, wenn du dich nicht daran hältst.
das ist kein interface mehr, bzw. würde ich nicht mal soweit gehen, dass der compiler/interpreter meckern muss, das kann man meiner meinung nach sogar zur laufzeit abfangen. aber man müsste ein interface wenigstens igrendwie beschreiben können.
da hast du recht, das geht in js nur über die docu.
und da setze ich an, ein weiterer/besserer schritt in richtung interface ist eine get/set... methode, wie sie sich in hochsprachen durchgesetzt hat.
getter/setter sind ein schritt in die entgegengestzte richtung, jedenfalls nach meiner meinung.
klar kann man jetzt sagen, in js bekommt man sowieso keine interfacedefinition wasserdicht und kann dann auch getter/setter verwenden in einer quasischnittstelle. ja, das ist auch meine meinung, das ist js style, so realisieren es (mittlerweile) alle js frameworks, das ist aber keine oop. dann verwendet man (idR) auch keine konstruktoren, sondern modulobjekte.
wer konstruktoren verwendet, kommt idR. aus dem hochsprachenbereich, will oop in js mit classen/konstruktoren/zuugriffsschutz nachbauen. das kann man machen(und das wird erst mal jeder versuchen, der von c++/java/... kommt), muss man aber nicht.
 
ich glaube wir können hier aufhören
Wenn du meinst...
ch rede über oop, die ist in ansätzen auch mit js realieseirbar
OOP ist komplett in JS realisierbar. In JS besteht alles aus Objekten (sogar Funktionen, wodurch man sehr schöne Konstrukte bauen kann). Nur kannst du den klassischen Ansatz über Klassen, Vererbung etc. nicht sauber umsetzen. Der Prototype-Ansatz ist einfach ein anderen.
Deswegen ist es aber trotzdem OOP.

man müsste ein interface wenigstens igrendwie beschreiben können
Da könnte man sich mit JS schon was überlegen. Müsste man hald mal eine Konvention einführen...

da hast du recht, das geht in js nur über die docu.
Das Flexible an JS ist infach ein Fluch und ein Segen.

get/set... methode, wie sie sich in hochsprachen durchgesetzt hat.
Wobei ich die auch dort nie besonders schön fand. Mal ein Java-Beispiel:
Code:
public class Item{
    private int id;
 
    public void setId(int newId){
        id = newId;
    }
    public int getId(){
        return id;
    }
}
Wo wird da bitte irgendwas an Implementierungsdetails verborgen? Ich weiß damit ziemlich sicher, dass die Klasse ein private int id hat...

getter/setter sind ein schritt in die entgegengestzte richtung, jedenfalls nach meiner meinung.
Finde ich nicht. Sie gehen doch in die gleiche Richtung: ich kann im nachhinein die Funktionalität, die im Hintergrund läuft ändern, ohne dass ich an externem Code etwas ändern muss. Nur habe ich eine intutivere, besser verständliche und kürzere Schreibweise dafür.

das ist aber keine oop
Ich glaube wir reden aneinander vorbei, weil du beim Begriff oop nur die klassische, von Java geprägte Ansicht von objektorientierter Programmierung meinst. Solange ich meine Programmierung an Objekten und nicht an Daten orietiere, ist es für mich OOP.

dann verwendet man (idR) auch keine konstruktoren, sondern modulobjekte.
Das ist dann aber meiner Meinung nach kein OOP, sondern nur eine nette Art um Namespaces zu definieren.

wer konstruktoren verwendet, kommt idR. aus dem hochsprachenbereich, will oop in js mit classen/konstruktoren/zuugriffsschutz nachbauen.
Stimmt - und genau das ist das Problem, dass die nicht JS, sondern eigentlich Java/C++/... schreiben wollen. Jede Programmiersprache ist einfach etwas anders und man muss sich darauf einstellen. So sollte man z.B. auch nicht versuchen in C OOP zu machen, was auch theoretisch gehen würde...
 
OOP ist komplett in JS realisierbar.
aber nur durch tricks und selbst dann gibt es noch viele tücken

In JS besteht alles aus Objekten (sogar Funktionen, wodurch man sehr schöne Konstrukte bauen kann).
aber das macht ja noch lange keine oop aus

Nur kannst du den klassischen Ansatz über Klassen, Vererbung etc. nicht sauber umsetzen. Der Prototype-Ansatz ist einfach ein anderen.
in js fehlt komplett die möglichkeit der kapselung, eins der wichtigsten merkmale der oop. das bekommt man hin, aber nur über tricks, passt dann aber nicht mit der prototypischen vererbung zusammen, da die nur für public member funktioniert.

Deswegen ist es aber trotzdem OOP.
nicht wirklich

Da könnte man sich mit JS schon was überlegen. Müsste man hald mal eine Konvention einführen...
ja, vermutlich kommt das früher oder später

Wo wird da bitte irgendwas an Implementierungsdetails verborgen? Ich weiß damit ziemlich sicher, dass die Klasse ein private int id hat...
ob du das weisst/vermutest, ist nicht relevant, hauptsache du kommst nicht ran von außen. der sinn von verborgenen implementierungsdetails ist ja nicht, den anwender im unklaren zu lassen, was dahintersteckt, im gegenteil, die namen der schnittstellenfunktionen sollten schon alles über die funktionalität sagen.

Finde ich nicht. Sie gehen doch in die gleiche Richtung: ich kann im nachhinein die Funktionalität, die im Hintergrund läuft ändern, ohne dass ich an externem Code etwas ändern muss. Nur habe ich eine intutivere, besser verständliche und kürzere Schreibweise dafür.
ich sehe nicht das xxx.yyy = 99 kürzer ist als xxx.setYYY(99)
besser verständlich sehe ich auch nicht
ja, die funktionalität, implementierungsdetails zu verbergen, erfüllen beide, der einen möglichkeit sieht man es an, der anderen nicht.

Das ist dann aber meiner Meinung nach kein OOP, sondern nur eine nette Art um Namespaces zu definieren.
das ist eine nette möglichkeit zur kapselung, und damit ist schon mal ein wichtiger punkt erledigt.

Stimmt - und genau das ist das Problem, dass die nicht JS, sondern eigentlich Java/C++/... schreiben wollen.
nee, die wollen oop
* kapselung von daten
* vererbung
* Polymorphie

aber ich bin jetzt erst mal ne woche weg
 
aber nur durch tricks und selbst dann gibt es noch viele tücken
Tücken hast du in jeder Programmiersprache und, wie ich schon sagte, man kann in JS nicht die klassische Ansicht von OOP eins zu eins abbilden. Das muss man aber auch gar nicht, da JS seinen eigenen Ansatz hat.
in js fehlt komplett die möglichkeit der kapselung
Das ist falsch. Du kannst mit Scopes wurderbar Kapseln. Man muss nur wissen, wie man das für seine Zwecke umsetzen muss.
die nur für public member funktioniert
Das ist in der Tat nicht optimal.
Das ist ohne Begründung nur deine Meinung. Begründe das und wir können drüber reden.
hauptsache du kommst nicht ran von außen
In dem Beispiel oben komme ich genauso gut ran, wie wenn die Eigenschaft public wäre.
ich sehe nicht das xxx.yyy = 99 kürzer ist als xxx.setYYY(99)
Dann solltest du dringend zählen üben... 12 (sogar mit Leerzeichen) < 14
besser verständlich sehe ich auch nicht
Das tut mir leid für dich.
der einen möglichkeit sieht man es an, der anderen nicht
Ja und? Warum muss ich das als Benutzer der Schnittstelle sehen? Das sind Details.
nee, die wollen oop
* kapselung von daten
* vererbung
* Polymorphie
Kapselung ist durch Scopes machbar, Vererbung durch Prototype auch (auch wenn man da anders denken muss als beim klassischen OOP) und Polymorphie ist bei einer schwach typisierten Sprache sinnfrei.
 
Zurück
Oben