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

Mal wieder OOP

Bjoern

New member
Hi Leute,

ich guck' gerade mal so meinen Code durch und sehe, das ich meine Objekte nicht sehr optimal erstelle.
Ich mache das Beispielsweise so:
function objekt(){
obj=Array();
// Ein paar Operationen
return obj;
}

Ich denke, da damit kein einheitliches Objekt definiert wird, ist das mindestens Speicherverschwendung.
Aber ich kann ja kein this=Array() machen, das geht nicht.
(wäre aber die effizienteste Lösung)

Also, Tipps wie ich das umschiffe?

PS:
In Webdows ist es nicht obj=Array(), sondern ich erzeuge HTML-Objekte mittels einer eigenen Funktion so:
obj=create_object('div');
 
hab ich was falsch verstanden oder wieso machst du nicht einfach eine Methode von deinem Objekt in der die paar Operationen durchgeführt werden?
 
ähmm bevor ich das jetzt auch falsch verstehe, stell ich mich mal dumm und verstehe es erst gar nicht....
Kannst Du Dein Vorhaben / Problem mal genauer beschreiben? Vor allem auch der Zusammenhang zwischen dem Codefragment und dem Threadtitel....
 
Mein Problem ist, das ich ein Objekt haben will, das wiederum selbst ein Objekt einer anderen Instanz ist.
Praktisch will ich this=new Object() machen.
Das geht aber nicht.

Ich versuche es mal anders. Ein mögliches Beispiel:
Ich will ein neues Input-Objekt erzeugen (also ein <input>) und das per x=new Input()

So jetzt muss input() ein HTML-Objekt zurückgeben.
Also, zur Zeit würde ich das so machen:

function Input(){
obj=createObject('input');
obj.read=function(){
return this.value;
}
return objekt;
}

So, ich kann mir nicht vorstellen, dass das sonderlich effizient ist und würde lieber mit this arbeiten.
Aber ich kann kein this=createObject('input') machen.

Jetzt verständlich?
 
Also rein theoretisch wäre es schon sinnvoller ein Objekt durch Instanzierung seiner zugehörigen Klasse zu erzeugen. Allerdings, denke ich, ist JS / HTML / DOM nicht soweit, daß man das wirklich konsequent so durchziehen könnte. Spätestens an unterschiedlichen Browsern scheitert sowas, wenn es überhaupt einen gibt, der das kann.... (aber was soll man von einer Hilfssprache wie JS schon erwarten)

createObject sagt mir jetzt irgendwie gar nix, SelfHTML kennt das auch nicht, von daher weiß ich nicht, was dabei rauskommt und wie es definiert ist.
Außerdem glaube ich nicht, daß man einfach so Input Elemente in die Luft zaubern kann, denn die müssen ja irgendwie in eine Form oder zumindest eine HTML Datei eingebettet sein, damit was draus wird.
 
also so wie ich das verstanden habe ist createObject ist eine von ihm geschriebene Function, die HTML zusammenbaut und zurückliefert. Oder sie nutzt die DOM-Funktionen document.createElement() u.s.w.

aber vielleicht habe ich ja wieder was falsch verstanden :rolleyes:
 
Zur Vereinfachung wollte ich eigentlich createElement() nehmen.
Gut, normalerweise verwende ich diese meinige Funktion:

function create_object(type,styles){
var obj=document.createElement(type);
if(!styles){return obj;}
var i=0;
while(i<styles.length){
obj.style[styles[i++]]=styles[i++];
}
/*
obj.getElementByWid=function(wid){
if(this.wid==wid){
return this;
}
for(var i in this.childNodes){
if(!this.childNodes.getElementByWid){continue;}
var obj=this.childNodes.getElementByWid(wid);
if(!obj){continue;}
return obj;
}
return false;
}*/
return obj;
}

Diese Funktion wird in Webdows5 alle naselang verwendet.
Ich habe beobachtet, das wenn ich die Funktion getElementByWid nicht auskommentiere, Webdows5 arschlangsam wird.
(die Funktion war ursprünglich dazu gedacht, eine Art getElementById-Ersatz für OOP darzustellen, am Ende habe ich sie aber dann nicht gebraucht)
 
also da Du ja OOP machen willst mal ein Vorschlag:

createObject wird Member Funktion einer Basisklasse. Diese Basisklasse stellt ein beliebiges (Grund-) HTML Objekt/Element dar und bietet alle Funktionen und Eigenschaften, die jedem HTML Objekt/Element zugrunde liegen (keine Ahnung welche, das weißt Du sicher besser). Von dieser Basisklasse leitest Du jetzt für jeden Spezialfall (z.B. input) eine Klasse ab. Diese Klasse bietet alle Funktionen und Eigenschaften, die dieses spezielle HTML Objekt INPUT mehr hat, als die Basis. Direkte Zugriffe auf das INPUT Objekt werden von der Anwendung gekapselt und im Idealfall benutzen alle Deine Funktionen und Klassen nur die Klasseninstanz um auf das jeweilige HTML Objekt zuzugreifen und nicht direkte DOM Methoden.
Im Laufe der Zeit wirst Du so für jedes HTML Tag / Objekt eine eigene Klasse erstellen, die sozusagen Dein eigenes API nach HTML darstellt. Diese API kann durch geeignete Programmierung relativ Browserunabhängig sein (die Browserdetection und Browserspezifische Funktionen können z.B. global in der Basisklasse verankert sein). Dein Webdows 5 setzt dann nicht mehr auf HTML oder DOM auf, sondern auf "Webdows 5 HTML Abstraction and Compatibility Layer" ;), was dafür sorgt, daß Du nachher eine wiederverwendbare API hast, die Du 1:1 in anderen Projekten einsetzen kannst und eine Anwendung Webdows 5, die darauf aufsetzt.
Ein weiterer Vorteil kann sein, daß wenn Du Webdows irgendwann mal auf was anderes portieren willst, Du nur noch die API austauschen und neu programmieren mußt, den restlichen Code aber nahezu unverändert übernehmen könntest (z.B. beim Übergang in eine Flash Anwendung).

Das ist so grob umrissen, wie ich mir das vorstellen würde und wie ich an die Geschichte rangehen würde.
 
Hmm... nette Idee.
(auch wenn ich mir das nur so ungefähr vorstellen kann)
Allerdings denke ich, dass da das Ergebnis nicht in passender Relation zum Aufwand steht.
Zumal das createElement bzw. create_object() problemlos funktioniert. (außer dem Problem mit der Instanzierung)
(ob du es glaubst oder nicht, ich mache fast nirgends Browserabfragen)

Zum anderen würde ich möglichst viel Arbeit dem Browser überlassen, der ist da einfach viel schneller als JS.

Aber falls du mal sowas erstellen solltest (wäre ja sicher nicht nur für Webdows von Nutzen)...

Hmm... ich kriege da so eine Idee, wie man da was mit der Instanzierung biegen könnte...
 
Es müssen auch noch nicht unbedingt großartig viele Browserabfragen stattfinden, wenn man das geschickt anstellt.
APIs die sowas können gibt es schon, DW macht sowas in der Richtung, aber es gibt auch frei verfügbare (mir fällt grad kein Link dazu ein, in der c't war vor Monaten/Jahren mal eine kleine Sammlung dazu). Allerdings war keines davon OOP.
Außerdem wird ein solches OOP-Framework noch einen weiteren kritischen Nachteil haben: Performance. Diese ganze Instanziererei wird den Browser schon arg beschäftigen.

Um sowas selbst zu schreiben, dazu fehlt mir zum einen die Zeit, zum anderen die Lust und der notwendige Ansporn. Nur um den Beweis zu führen, daß es geht ist mir das auch zu viel Aufwand, zumal man nachher nix davon hat, denn wer entwickelt schon Anwendungen in JS (denn nur dafür würde sich solch ein Aufwand lohnen). ;)
 
Zurück
Oben