2010-02-07 8 views
9

Wie organisieren Sie alle Ihre zufälligen Funktionen, um die Funktionalität einer Sprache außerhalb der OOP-Klassen (globale Funktionen) zu verbessern?Elegante Praktiken auf "zufällige Dienstprogrammfunktionen"

Ich habe Bibliotheken gesehen, aber ich bin immer noch nicht verkauft, dies ist eine gute Lösung, vor allem, wenn Sie nicht genug Funktionen haben. Ich bin speziell daran interessiert, wie Leute zufällige PHP- und JavaScript-Funktionen organisieren.

Antwort

7

Ich versuche zu vermeiden, Funktionen im globalen Namespace insgesamt zu deklarieren. Die sehr seltenen Gelegenheiten, bei denen ich das tue, ist, wenn Userland-Implementierungen von Funktionen hinzufügen, die nicht in meiner Version von PHP sind zum Beispiel

if(false === function_exists('lcfirst')) 
{ 
    function lcfirst($str) { /* ... */} 
} 

Funktionen wie diese in einem compatibility.php gehen könnte, die in einem enthalten würde Bootstrap-Datei, so dass sie in der gesamten Anwendung verfügbar sind und die Überprüfung auf function_exists stellt sicher, dass ich nicht auf Probleme stoßen, sobald die PHP-Version native Unterstützung für die Funktion hat.

Für alle anderen Funktionen würde ich versuchen zu sehen, ob sie nicht auf ein bestimmtes Objekt zuerst gehen können. Normalerweise sind "zufällige" Funktionen einfach fehl am Platz.Sehen Sie sich an, welche Objekte Ihre Utility-Funktionen verwenden und sehen Sie, ob Sie die Methoden dorthin verschieben können. Vielleicht wartet eine Superklasse darauf, herauszukommen. Siehe auch Information Expert pattern.

Wenn keine Objekte vorhanden sind, können diese Methoden weiterhin in einem statischen Modul mit dem Namen Utils in einem eindeutigen Namespace gruppiert werden, sodass sie den globalen Namespace nicht überladen. Auf diese Weise können Sie sicher sein, dass Sie nicht mit anderen Funktionen von Drittanbietern im globalen Bereich kollidieren.

Vor 5.3, würde ich gruppieren following the PEAR naming convention und prefixing Klassennamen nach Ihrer Ordnerstruktur, zum Beispiel, wenn das Modul in com/mattmueller/utils.php war, Sie

class Com_MattMueller_Utils 
{ 
    public static function something($a, $b) { /* ... */ } 
} 

Ab PHP5.3 verwenden würden, wir habe bekam echte namespaces und Sie können

namespace com\mattmueller\Utils; 

class Utils 
{ 
    public static function something($a, $b) { /* ... */ } 
} 

tun In Javascript können Sie nicht Namensräumen haben aber easily simulate them durch die Funktionen zu einem Objekt hinzufügen, zB

// JavaScript 
var com = (com) ? com : {}; 
com.mattmueller = { 
    'Utils': { 
     'something' : function(a,b) { /* ... */ } 
    } 
}; 

Die gemeinsamen Rahmen in der Regel Funktionen implementieren als auch für creating namespaces.

+1

Super! Danke für die Einblicke. Yah Ich wünschte wirklich, ich könnte PHP Namespaces verwenden, aber mein Hosting hat noch nicht 5.3. – Matt

+0

@Matt, Sie können immer noch mit dem PEAR-Ansatz, den ich notiert habe, gehen oder einfach einen Klassennamen verwenden, der nicht kollidiert, wie "MMUtils", wenn Sie den Domainnamen-basierten Klassennamen zu lang finden. – Gordon

4

Ich reserviere generell eine oder common.php für all meine seltsamen Funktionen, die in erster Linie in PHP hätte sein sollen. (Bedeutung, überhaupt nicht spezifisch für mein Projekt).

Dies kann etwas wie die Erweiterung einer Standardfunktion auf mehrdimensionale Arrays oder etwas anderes, das in diese Kategorie passt, sein.

Wenn ich Projekte ändere, kopiere ich diese Datei einfach auf das nächste Projekt, und es kann leicht mit mir überall hin mitgenommen werden. Dann stelle ich einfach sicher, dass es in mein Ladeskript geladen ist, und ich habe die Sprache erfolgreich erweitert.


Für bestimmte Dinge Projekt, halte ich eine Misc Klasse, die die wirklich seltsam Funktionsaufrufe enthält, die zur gleichen Zeit, Projekt spezifisch sind.


Für Javascript-Funktionen kann ich mir vorstellen, das gleiche gilt. Wenn Sie eine functions.js oder eine global.js Dateityp erstellen möchten, könnten Sie wahrscheinlich die gleiche Logik verwenden.

1

Für Javascript habe ich gefunden, dass die erste Wahl sein sollte, meine Dienstprogramme in jQuery zu integrieren. Es ist so einfach wie das Schreiben anderer Funktionen, und wenn die Dinge komplizierter werden, ist es großartig, das Paradigma zu nutzen, das jQuery gegenüber allem (und vor allem gegenüber meinem anderen seitenspezifischen Code in der Site) auferlegt.

+0

Ich würde hinzufügen, dass Sie auch den Prototyp für eingebaute Objekte wie Array sowie – Goyuix

+0

@ Goyuix erweitern können - allgemein gesprochen Erweiterung der nativen Objekte ist verpönt. – scunliffe

+0

@scunliffe sagen, dass die Prototype Jungs :-) – Pointy

2

Ich benutze immer eine Hilfsklasse, wo ich alle meine nicht-OOP-Code, LOL setzen kann. Ich meine, dass es der Weg ist, dass Helfer immer noch OO sind und stattdessen Methoden haben, mit dem Vorteil, dass Sie Ihre Funktionen in verschiedenen Helfern organisieren können. Wie String, DBHelper usw.

+0

Ich auch (für PHP, zumindest). Ich habe einen Ordner namens Util, mit Klassen-Dateien für StringUtil, ArrayUtil usw., die voll von statischen Methoden sind. In Kombination mit einem guten Autoloading-Mechanismus funktioniert es sehr gut. – grossvogel

1

In JavaScript, machen Sie eine neue Datei und gruppieren sie unter einem Objekt

global.js:

/* Function definitions */ 
var myFunctions = new Object(); 
myFunctions.func = function() { 
    alert("hello"); 
} 

gleiche Idee kann für PHP verwendet werden. Damit müssen Sie sich nicht um Konflikte in Namenskonventionen kümmern, wenn Ihr Programm größer wird.