Du bist nicht angemeldet. [Anmelden]
Seite 7 von 26 < 1 2 ... 5 6 7 8 9 ... 25 26 >
Optionen
Thema bewerten
Re: Fragen und Antworten * [Re: TobyB] - #2728677 - 15.04.2015, 09:47:26
djchrisnet
​Verified Prototype Hater

Registriert: 27.05.2006
Beiträge: 905
Ort: Rendsburg
Antwort auf: TobyB
Wenn ihr also Den Prototypen von Object erweitert habt, beispielweise weil ihr eine Bibliothek von irgenwoher eingebunden habt oder es gar selbst getan habt, dann würde der for...in Loop hier über diese Eigentschaften ebenfalls iterieren, was zu ungewünschten Nebeneffekten führen kann.


das ist nur dann richtig, wenn man neue Methoden einfach ans Object "dranklatscht" statt sie ordentlich zu definieren

Dirty shit
Code:
if(!Object.prototype.size) {
	Object.prototype.size = function() {
		return Object.keys(this).length;
	}
}

nun wäre die methode bei for(x in obj) dabei

Code:
if(!Object.prototype.size) {
	Object.defineProperty(Object.prototype, 'size', {
		enumerable:	false,
		configurable:	false,
		writable:		false,
		value: function() {
			return Object.keys(this).length;
		}
	});
}


Hierbei wird enumerable auf false gesetzt was einfach soviel heißt wie "diese Methode nicht interieren", ist übrigends standard bei Object.defineProperty

Der Code ließe sich auch noch weiter kürzen, da die settings aktuell default sind.
Code:
if(!Object.prototype.size) {
	Object.defineProperty(Object.prototype, 'size', {
		value: function() {
			return Object.keys(this).length;
		}
	});
}


Weitere Beispiele dazu gibts im Framework unter Tools
_________________________
» AppEntwickler
» Prototype Hater



[zum Seitenanfang]  
Re: Fragen und Antworten [Re: djchrisnet] - #2728683 - 15.04.2015, 12:05:40
TobyB
​Knuddelsteam

Registriert: 21.11.2003
Beiträge: 6.831
Ich kann dir aus Erfahrung sagen, die wenigstens Frameworks die man sich mal von irgendwo her holt machen Gebrauch von Object.defineProperty() ... leider. Das liegt daran, dass (mittlerweile weniger) bis vor leider gar nicht all zu langer Zeit zu wenige Browser dieses Feature unterstützt haben. Daher ist noch viel zu viel Code in Verwendung, der es nicht benutzt, oder auch nur beschissen polyfillt.

Und die .forEach() Variante funktioniert für alle Fälle wunderbar.

Vgl.:
Code:
var arr = new Array(5);
arr[0] = 0;
arr[3] = 3;
arr.forEach(function(){
	console.log('each', arguments);
});

und
Code:
var arr = new Array(5);
arr.forEach(function(){
	console.log('each', arguments);
});
_________________________
There is no good without evil, but evil must not be allowed to flourish.
There is passion, yet peace; serenity, yet emotion; chaos, yet order.

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Enrico-nrp] - #2729774 - 23.04.2015, 11:27:55
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
Ich habe gerade angefangen die User-Klasse für Spot It mit Prototype zu erweitern um wiederkehrenden Code nicht immer wieder neu zu schreiben.

Code:
User.prototype.getGamePoints = function() {
	var persis = this.getPersistence();
	return persis.getNumber("points",0);
}


Relativ unwichtig, aber Codetechnisch interessant. getPersistence() erzeugt immer ein neues Object, es wird nicht die Referenz gespeichert. Dies kann gerade bei häufigen Anwendungen unnötig Zeit/Leistung kosten. Daher sollte man die Referenz zur Persistenz speicher. Daraus wird dann:


Code:
User.prototype.myPersis = null;
User.prototype.getMyPersistence = function() {
	if(this.myPersis == null)
		this.myPersis = this.getPersistence();
	return this.myPersis;
}

User.prototype.getGamePoints = function() {
	var persis = this.getMyPersistence();
	return persis.getNumber("points",0);
}



Bearbeitet von Vampiric Desire (23.04.2015, 11:29:31)
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2729844 - 23.04.2015, 18:48:03
Bizarrus
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.581
Ort: Dortmund
Die Referenzierung ist eher Irrelevant und hat keinen Einfluss auf die Geschwindigkeit.
Viel mehr entstehen möglicherweise Performanceeinbussen wenn 5.000x hintereinander die getter/setter gecallt werden, einfach weil hier die Datenbankoperationen stattfinden.

Besser wäre es wenn du hingehen würdest und ein Globales Objekt erzeugst wo dann die Daten zwischengehalten werden und beim onJoin/onLeave dann erst die Operationen durchführst.
_________________________
Bot.public('I love °>features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<°');

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Bizarrus] - #2729859 - 23.04.2015, 19:38:21
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
Antwort auf: Bizarrus

Besser wäre es wenn du hingehen würdest und ein Globales Objekt erzeugst wo dann die Daten zwischengehalten werden und beim onJoin/onLeave dann erst die Operationen durchführst.


Dir ist bekannt dass du bei jedem getUser/Event ein neues User Objekt bekommst, diese also nicht Global beim User speichern kannst - so dass du so oder so jede menge Memory verschwendest wenn wir von zig Usern reden?

Und dass es keine Zeit kosten würde ist auch Bullshit, denn es dauert natürlich seine Zeit bis ein neues Objekt von der Persistence generiert wird. und der Funktionaufruf des Getters ist da im Gegensatz dazu geringfügig. Was aber stimmt ist, dass man die Werte beim User zwischenspeichern sollte, sofern man 500x die Funktion aufrufen will in einem Event
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2729931 - 24.04.2015, 08:20:48
TobyB
​Knuddelsteam

Registriert: 21.11.2003
Beiträge: 6.831
Ihr redet hier von Performance usw ... habt ihr denn gemessen was genau an der Arbeit mit der Persistence nun langsam ist? also habt ihr belastbare Zahlen, oder ist das nun alles theoretisches Gerede?
_________________________
There is no good without evil, but evil must not be allowed to flourish.
There is passion, yet peace; serenity, yet emotion; chaos, yet order.

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: TobyB] - #2729935 - 24.04.2015, 09:44:17
djchrisnet
​Verified Prototype Hater

Registriert: 27.05.2006
Beiträge: 905
Ort: Rendsburg
die performance wurde zuletzt nochmal massiv gesteigert als UserPersistenceNumbers eingeführt wurde sodass die Performance im letzlich ausser acht gelassen werden kann. wir reden hier von 1-2ms für mehrfache Additionen (ja getestet unter realen bedingungen)
_________________________
» AppEntwickler
» Prototype Hater



[zum Seitenanfang]  
Re: Fragen und Antworten [Re: djchrisnet] - #2732704 - 08.05.2015, 13:10:13
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
Als kleines Snippet:
Code:
Card.Rarity = Object.freeze({
    COMMON: 0,
    UNCOMMON: 1,
    RARE: 2,
    LEGENDARY: 3
});


Ab und zu will man ENUMs definieren, die aber später nicht aus vesehen verändert werden dürfen. Hierbei hilft Object.freeze()
Nachdem ein Object gefreezed wurde, lässt es nicht mehr verändern.

Sollte euer Object aus mehreren Objecten bestehen lassen sich die Subelemente aber noch ändern. Hier sollte man sofern man es verhindern will, diese Objekte ebenfalls gefreezed werden. Dies lässt sich einfach per Rekursion und Object Freeze bewerkstelligen.
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2732707 - 08.05.2015, 13:44:24
djchrisnet
​Verified Prototype Hater

Registriert: 27.05.2006
Beiträge: 905
Ort: Rendsburg
oder man benutzt einfach eine Konstante

Beispiel:

Code:
var abc = 'write/read';
const = def = 'read_only';
_________________________
» AppEntwickler
» Prototype Hater



[zum Seitenanfang]  
Re: Fragen und Antworten [Re: djchrisnet] - #2732708 - 08.05.2015, 13:52:57
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
Antwort auf: djchrisnet
oder man benutzt einfach eine Konstante



Code:
const abc = { a: 1, b:2 } >>>> Object {a: 1, b: 2}
abc.a = 3 >>> Object {a: 3, b: 2}
abc.d = 1 >>> Object {a: 3, b: 2, d: 1}



Scheint nicht für Objekte zu funktionieren :-D
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2732777 - 08.05.2015, 21:14:35
Ironist

Registriert: 08.04.2003
Beiträge: 1.260
Ort: Deutschland, Dachau
Antwort auf: Vampiric Desire
Antwort auf: djchrisnet
oder man benutzt einfach eine Konstante



Code:
const abc = { a: 1, b:2 } >>>> Object {a: 1, b: 2}
abc.a = 3 >>> Object {a: 3, b: 2}
abc.d = 1 >>> Object {a: 3, b: 2, d: 1}



Scheint nicht für Objekte zu funktionieren :-D


Nun ja, dein Beispiel ist nicht ganz korrekt.

Code:
const abc = { a: 1, b:2 } >>>> Object {a: 1, b: 2}
abc = 'Foo'; >>>> code breaks


[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Ironist] - #2732778 - 08.05.2015, 21:31:28
Vampiric Desire
​ChannelMaster

Registriert: 15.09.2013
Beiträge: 1.681
Was prinzipiell richtig ist Iro, ich aber Speziell auf Objekte und ihren Elementen eingegangen bin und dies nicht ohne erhöhten schreibaufwand zu realisieren wäre über const.
_________________________
/apps install 30559674.ChannelMaster

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Vampiric Desire] - #2732996 - 10.05.2015, 18:43:53
Aquacold
Forumuser

Registriert: 23.04.2015
Beiträge: 7
Heyho =),

Wäre jemand so nett und würde mir das mit dem Speichern von Usersachen (z.B Points von Spielen) und auch laden erklären?

Ich blicke da irgendwie nicht durch...

Würde mich freuen, wenn sich da jemand findet, der mir das mal ein wenig erklären könnte..


Freundliche Grüße,

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Aquacold] - #2733025 - 10.05.2015, 21:10:47
Ironist

Registriert: 08.04.2003
Beiträge: 1.260
Ort: Deutschland, Dachau
Antwort auf: Microlost
Heyho =),

Wäre jemand so nett und würde mir das mit dem Speichern von Usersachen (z.B Points von Spielen) und auch laden erklären?

Ich blicke da irgendwie nicht durch...

Würde mich freuen, wenn sich da jemand findet, der mir das mal ein wenig erklären könnte..


Freundliche Grüße,


user.getPersistence().setNumber('points', 3);
var points = user.getPersistence().getNumber('points');


http://developer.knuddels.de/docs/classes/UserPersistence.html#method_setNumber

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Ironist] - #2733068 - 10.05.2015, 23:37:39
Aquacold
Forumuser

Registriert: 23.04.2015
Beiträge: 7
Antwort auf: Ironist
Antwort auf: Microlost
Heyho =),

Wäre jemand so nett und würde mir das mit dem Speichern von Usersachen (z.B Points von Spielen) und auch laden erklären?

Ich blicke da irgendwie nicht durch...

Würde mich freuen, wenn sich da jemand findet, der mir das mal ein wenig erklären könnte..


Freundliche Grüße,


user.getPersistence().setNumber('points', 3);
var points = user.getPersistence().getNumber('points');


http://developer.knuddels.de/docs/classes/UserPersistence.html#method_setNumber


Danke,

Ich hatte es eigtl genau so drinne, hatte jedoch das Speichern an die falsche Stelle platziert, womit es natürlich nicht aufgerufen wurde.. (Außer man war im Spiel)..


[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Aquacold] - #2734418 - 20.05.2015, 02:12:31
Dave20009
​Der King!

Registriert: 27.07.2006
Beiträge: 1.225
Ort: Königlicher Palast
Ich habe mal eine Frage: Ich habe ein Code (siehe unten) in meine App eingebaut mit der alle gewisse Zeit öffentliche Nachrichten vom Bot gesendet werden, so weit so gut, aber sobald die Zeit um ist und die erste Nachricht versendet wurde, fängt plötzlich das Bot an zu spinnen und sendet anstatt alle 20 und 30 Minuten, in 3-5 Minuten intervall und das fängt dann schon leicht zu spammen an aber woran liegt das? Das nervt nicht nur mich, sondern auch andere anwesende User enorm.

Und ist es irgendwie möglich, eine art "pool" zu erstellen? Also das der Bot sich z.B. alle 30 min immer eine andere Message raussucht und diese öffentlich postet? So würde ich mir ein hässlichen Code mit milliarden arrays wie unten Sparen und so würde immer zu einer festen Zeit eine andere Message kommen und nicht nach 20 min die, 10 min später die andere usw. Wenn es möglich ist, wie programmier ich das? Ich habe irgendwie keine Ahnung, da meine Javascript kenntnisse noch lange nicht dem eines Profi entsprechen...

Warnung! Spoiler!
Code:
var dev = KnuddelsServer.getAppDeveloper();
	
	rmsg = [
		'Du hast einen _Bug_ gefunden? Dann schreibe  °>sm_classicII_01...b.pw_29.ph_15.gif<° _°BB>_hdem Entwickler eine Nachricht|/m '+dev+'<r°_.'
	];
	intid = setInterval(function() {
		KnuddelsServer.getDefaultBotUser().sendPublicMessage(rmsg[Math.floor(Math.random() * rmsg.length)]);
	}, 30*60000);
	
	KnuddelsServer.getPersistence().setNumber('msgint', intid);

//Ausgabe 2
var dev = KnuddelsServer.getAppDeveloper();

	amsg = [
		'Du magst _diesen_ Channel? Dann mach ihn jetzt  °>sm_sign_mag-ich...b.pw_29.ph_15.gif<° _°BB>_hzu deinem LieblingsMyChannel|/edit setlmc<r°_.'
	];
	intid = setInterval(function() {
		KnuddelsServer.getDefaultBotUser().sendPublicMessage(amsg[Math.floor(Math.random() * amsg.length)]);
	}, 20*60000);
	
	KnuddelsServer.getPersistence().setNumber('msgint', intid);


Bearbeitet von Dave20009 (20.05.2015, 02:13:06)
_________________________
» Ich werde immer sagen, was ich denke. Wer die Wahrheit nicht verträgt, soll mir nicht meine Zeit stehlen. «


[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Dave20009] - #2734432 - 20.05.2015, 09:20:00
Ironist

Registriert: 08.04.2003
Beiträge: 1.260
Ort: Deutschland, Dachau
Hallo Dave,

ich glaube du machst es dir ein bisschen schwer. So wie ich deine Anforderung verstanden habe würde ich das ein bisschen anders lösen...


Warnung! Spoiler!
Code:
App.onAppStart = function()
{
    var messages = ['Nachricht1', 'Nachricht2', 'Nachricht3'];
    const MESSAGE_INTERVAL = 1000 * 60 * 30;

    setInterval(function() {
        var randomMessage = RandomOperations.getRandomObject(messages);
        KnuddelsServer.getDefaultBotUser().sendPublicMessage(randomMessage);
    }, MESSAGE_INTERVAL);
}


Knuddelige Grüße
Ironist

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Ironist] - #2734436 - 20.05.2015, 09:41:31
Bizarrus
​Bizzi is activated.

Registriert: 29.07.2006
Beiträge: 2.581
Ort: Dortmund
Im Notfall kannst du dir auch mal SpamMessages anschauen, ist OpenSource und du kannst dir hier einiges abschauen oder auch verändern :-)
_________________________
Bot.public('I love °>features/james-exchange/ft_james-exchange_surprised.gif<>James|/w "<°');

[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Ironist] - #2734520 - 20.05.2015, 18:39:00
Dave20009
​Der King!

Registriert: 27.07.2006
Beiträge: 1.225
Ort: Königlicher Palast
Antwort auf: Ironist
Hallo Dave,

ich glaube du machst es dir ein bisschen schwer.

Ja, ich mache es mir irgendwie immer schwerer als es ist, ich bin ein äußerst komplizierter Mensch, der immer das schwierigste versucht obwohl es auch wesentlich einfacher geht :/ hatte mir letzte nacht auch so überlegt es mal mit var messages zu versuchen, weil mir das am logischsten erschien aber war mir nicht ganz sicher, deswegen hab ich es erstmal gelassen aber mit dem Code da von dir Iro, hat es nun endlich funktioniert und das blöde gespamme hat aufgehört :) deswegen Danke an Iro und Bizzi.


Bearbeitet von Dave20009 (20.05.2015, 18:39:19)
_________________________
» Ich werde immer sagen, was ich denke. Wer die Wahrheit nicht verträgt, soll mir nicht meine Zeit stehlen. «


[zum Seitenanfang]  
Re: Fragen und Antworten [Re: Dave20009] - #2734636 - 21.05.2015, 13:11:55
LordLex
Nicht registriert


Hi,

Gibt es in JS eine Short-IF wie unter PHP?

var count = (null === param ? BotObject.getKnuddelAmount():param);

Oder muss ich die if/else bauen?

Danke schonmal,

Lg Lex

[zum Seitenanfang]  
Seite 7 von 26 < 1 2 ... 5 6 7 8 9 ... 25 26 >


Moderator(en):  Misterious