senäh

17senäh und so…

Code Snippet Thumb

HTML/CSS
17. Mai 2012
Kommentare: 0

JS-Code-Snippet: Mit Function-Wrappern die Logik einer Funktion erweitern

Kategorien: HTML/CSS | 17. Mai 2012 | Kommentare: 0

Ich hatte letztens das Problem, dass ich mit einer Funktion arbeiten musste, deren Aufruf ich nicht beeinflussen konnte. Leider hat die Funktion nicht genau das gemacht, was ich benötigte. Ich konnte diese Funktion aber auch nicht einfach überschreiben, da sie eine innere Logik besaß, die ich benötigte und die nicht so einfach reproduzierbar war. Eine sehr knifflige Lage!

Ich musste also einen Weg finden, wie ich diese Funktion um bestimmte Logiken erweitern konnte ohne(!) sie selbst oder die Art und Weise des Funktionsaufrufes zu verändern. Ganz ehrlich: Wenn ihr in dieser Situation steckt, macht ihr irgendetwas falsch. Wahrscheinlich ist eure Applikation-Architektur oder API nicht gut genug durchdacht. Blöd nur, dass dieses Problem bei mir bei einem Framework auftauchte, welches ich nicht selbst entwickelt hatte und dort war mein Anwendungsfall einfach nicht vorgesehen. Ich konnte auch das Framework nicht einfach so ändern…

Function-Wrapper to the rescue!

Was tun? Man nimmt sich die bestehende Funktion, nennt sie um, erweitert sie um vorhergehende/nachfolgende Logik und speichert das Ganze in einer neuen Funktion mit dem Namen der alten Funktion. Puuh. Das funktioniert prächtig, ist aber nicht unbedingt übersichtlich und debugging-freundlich. Ihr solltet diese Technik also mit Bedacht anwenden!

Angenommen ihr habt folgende Funktion:

1
2
3
4
5
6
7
8
var coolObject = {
    coolFunction: function(name) {
        console.log("Look at me, " + name + " is so cool.");
    }
}

coolObject.coolFunction("Pipo");
// "Look at me, Pipo is so cool."

Die Funktion nimmt in diesem Fall einen Parameter (es könnten auch beliebig viele sein oder gar keins!!!) und führt irgendeine Logik aus. Der Funktionsaufruf erfolgt mit coolObject.coolFunction("Pipo");. Nun möchte ich mit dem gleichen Funktionsaufruf noch mehr Logik ausführen. Diese Logik definiere ich in zwei Funktionen:

1
2
3
4
5
6
7
var prevExample = function(name) {
    console.log("Yeah, this is an example for " + name);
};

var pastExample = function(name) {
    console.log("I'm the last example for " + name);
};

Beide erhalten die gleichen Parameter wie die originale Funktion. Jetzt kommt der Function-Wrapper:

1
2
3
4
5
6
7
8
9
10
11
var functionWrapper = function(obj, originalFuncStr, prevFunc, pastFunc) {
    var originalFunc = obj[originalFuncStr];
    obj['_' + originalFuncStr] = originalFunc;
    obj[originalFuncStr] = (function(obj, originalFuncStr, prevFunc, pastFunc){
        return function() {
            if(prevFunc) prevFunc.apply(obj, arguments);
            obj['_' + originalFuncStr].apply(obj, arguments);
            if(pastFunc) pastFunc.apply(obj, arguments);
        }
    })(obj, originalFuncStr, prevFunc, pastFunc);
};

Und siehe da: Schicke ich alle Funktionen durch den Function-Wrapper, so erhalte ich mit dem gleichen Funktionsaufruf noch mehr Logik ;)

1
2
3
4
5
6
functionWrapper(coolObject, "coolFunction", prevExample, pastExample);

coolObject.coolFunction("Pipo");
// Yeah, this is an example for Pipo
// Look at me, Pipo is so cool.
// I'm the last example for Pipo

Die Originalfunktion ist übrigens unter coolObject._coolFunction zu finden. Sie hat nur ein “_” als Präfix bekommen. Ihr seit auch nicht gezwungen eine vorhergehende und eine nachfolgende Funktion zu verwenden. Eins von beiden genügt auch.

Ich hoffe, das konnte euch weiterhelfen :)

PS: Hier noch das Beispiel in JsFiddle!

Versionskontrolle

Allgemein
07. Mai 2012
Kommentare: 2

Gedanken zu Versionskontrolle (Subversion, Git & Co)

Kategorien: Allgemein | 07. Mai 2012 | Kommentare: 2

Ein netter Arbeitskollege hat mir mal ein Buch ausgeliehen: Der pragmatische Programmierer*. Während meines Silvesterurlaubs in Dänemark bin ich auch mal dazu gekommen in dem Werk zu lesen. Abgesehen von der in diesem Blogpost besprochenen Thematik kann ich nur jedem empfehlen es mir gleich zu tun. Das Buch beinhaltet eine Sammlung generischer Vorgehensweisen, die ein Software-Entwickler anstreben sollte. Damit man bei all den klugen Ratschlägen den Überblick behält, werden regelmäßig wichtige Regeln herausgehoben. Eine dieser Regeln lautet: du sollst Versionskontrolle verwenden.

Ich hatte heute ein Schlüsselerlebnis und möchte euch deshalb meine Meinung zu diesem Thema nicht vorenthalten. Dabei werde ich für alle, die mit dem Begriff Versionkontrolle (=VK) nichts anfangen können, erst einmal klären, was genau ich damit meine. Danach werde ich einige offensichtliche Vorteile benennen und abschließend noch ein paar positive Aspekte einstreuen, die vielleicht erst nach einem ersten Blick bewusst werden. Weiterlesen →

Media Query Variablen

HTML/CSS
03. Mai 2012
Kommentare: 0

Angewandte Media-Queries mit JavaScript auslesen – ohne Breakpoint-Doppelung

Kategorien: HTML/CSS | 03. Mai 2012 | Kommentare: 0

Ich bin über einen interessanten Artikel zum Thema Navigation in Responsive Designs gestoßen, der mögliche Variationen der Navigation aufzeigt, sobald der Bildschirm des Endgeräts schmaler wird. Was dabei angesprochen wurde: statt der eigentlichen Navigationsleiste am oberen Ende der Seite findet man ein Dropdown-Menü, das alle nötigen Navgationspunkte beinhaltet. Mittlerweile gar nicht so unüblich.

Dazu bedarf es jedoch ein wenig JavaScript. Die Listenpunkte müssen ja irgendwie in ein Dropdown-Menü umgewandelt werden. Nun hat man im CSS schon mühsam seine Breakpoints gesetzt, an denen sich das Layout jeweils anpasst. Müssen wir diese jetzt im JavaScript erneut formulieren? Dopplungen soll man doch immer vermeiden. Was ist wenn wir die Breakpoints ändern wollen? Wir müssten stets 2 verschiedene Stellen – sowohl im CSS als auch im JavaScript – pflegen. Kann das die Lösung sein? Weiterlesen →

css_rewriting_article

HTML/CSS, PHP, Server & Config
28. Apr 2012
Kommentare: 0

CSS-Caching Reloaded

Kategorien: HTML/CSS, PHP, Server & Config | 28. Apr 2012 | Kommentare: 0

Folgendes wohlbekanntes Problem: hin und wieder müssen Kleinigkeiten in der CSS-Datei geändert werden, sei es wegen einem entdeckten Bug oder einfach random Anpassungen. Leider verhindert Browsercaching, dass Benutzer die mühsam eingepflegten Änderungen sofort zu Gesicht bekommen. Eine mögliche, von mir bereits vorgestellte Lösung besteht im Anhängen des Timestamps der letzten Änderung als Parameter an die CSS-Datei (z.B. style.css?1335599366). Dadurch wird die Datei nur aus dem Cache geholt, wenn sie seit dem letzten Aufruf wirklich nicht verändert wurde. Ziel erreicht.

Aaaaaaber: wie ich feststellen sollte, mögen Geschwindigkeitsanalyse-Tools (eher egal) und Proxy-Server (nicht so egal) diese Vorgehensweise nicht wirklich. Darum brauchen wir eine Alternative. Weiterlesen →

Noizy Thumb

HTML/CSS
23. Apr 2012
Kommentare: 0

Value Noise

Kategorien: HTML/CSS | 23. Apr 2012 | Kommentare: 0

Hurra! Die erste Implementierung einer Noise Function steht an. Als erstes knüpfen wir uns Value Noise vor. Das liegt zum einem daran, dass die Theorie hinter Value Noise sehr schnell erklärt ist, und zum anderen daran, dass im Internet leider ein paar falsche Informationen über Value Noise kursieren. Diese möchte ich als erstes aus dem Weg räumen :) Weiterlesen →

Firefox Artikelbild

HTML/CSS
18. Apr 2012
Kommentare: 0

Firefox Webentwickler-Tools: ab Version 13 auch mit Pseudoklassen-Lock

Kategorien: HTML/CSS | 18. Apr 2012 | Kommentare: 0

Guten Abend! Da sowohl mein liebenswerter Blogger-Kollege Pipo als auch ich selbst ziemlich in außer-senäh’sche Tätigkeiten eingespannt sind, gibt es heute nur einen kurzen Hinweis. Im Firefox 13 wird der Page Inspector dahingehend optimiert, dass Pseudoklassen – das prominenteste Beispiel ist hier :hover – eingefroren werden können. Sehr nützlich für das Debuggen von bzw. das Experimentieren mit CSS-Styles.

Perun hat dazu ein kurzes Video gemacht, dass ich hier jetzt einfach mal kackfrech einbette. Weiterlesen →

Zend Framework Artikelbild

Zend Framework
06. Apr 2012
Kommentare: 0

Zend Framework: View-Skript eines anderen Controllers rendern

Kategorien: Zend Framework | 06. Apr 2012 | Kommentare: 0

Oft kommt man in die Situation, dass am Ende der Action eines Controllers nicht das standardmäßige View-Skript gerendert werden soll. In den meisten Fällen ist es ein anderes Skript des gleichen Controllers.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class IndexController extends Zend_Controller_Action
{
    /**
     *  Automatically shows script 'index/index.phtml'
     *  (same controller, same action).
     */

    public function indexAction()
    {
    }

    /**
     *  Set error text and show script 'index/index.phtml'
     *  (same controller, different action).
     */

    public function invalidSessionAction()
    {
        $this->view>errorMessage = 'Ihre Session ist ausgelaufen.';
        $this->render('index');
    }
}

Gelegentlich will man aber sogar das View-Skript eines anderen Controllers rendern. Die Syntax dazu ist leicht anders. Weiterlesen →

PHP 5.4 Artikelbild

PHP, Server & Config
04. Apr 2012
Kommentare: 2

PHP 5.4: interessantes Update

Kategorien: PHP, Server & Config | 04. Apr 2012 | Kommentare: 2

Es ist schon eine Weile raus, doch ich komme erst jetzt dazu, meinen Senf hier zu lassen: das Update für PHP. Wir sind bei Version 5.4. Neben einigen Performance-Verbesserungen – angeblich soll PHP bis zu 20% schneller laufen – gibt es Vereinfachungen für den Entwickler, der PHP benutzt. Diese möchte ich kurz vorstellen.

JavaScript-artige Array-Deklarierung

Etwas, was ich an JavaScript schon immer mochte, war das einfache Anlegen von Arrays.

var coolesArray = [‘Wert eins’, ‘der zweite Wert’, ‘Wert numero tres’];

Selbige Syntax gibt es jetzt auch in PHP. Weiterlesen →