2010-02-07 17 views
9

W jaki sposób organizujesz losowe funkcje, aby poprawić funkcjonalność języka poza klasami OOP (funkcje globalne)?Eleganckie praktyki dotyczące "losowych funkcji użyteczności"

Widziałem biblioteki, ale nadal nie jestem sprzedawany, ponieważ jest to dobre rozwiązanie, szczególnie jeśli nie masz wystarczającej liczby funkcji. Jestem szczególnie zainteresowany tym, jak ludzie organizują losowe funkcje PHP i JavaScript.

Odpowiedz

7

Próbuję uniknąć zadeklarowania funkcji w globalnym obszarze nazw. W bardzo rzadkich przypadkach, gdzie mogę to zrobić, to podczas dodawania implementacje przestrzeni użytkownika funkcji, które nie są w mojej wersji PHP, na przykład

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

funkcje, to może iść w compatibility.php które mogłyby być zawarte w plik bootstrap, więc są one dostępne w całej aplikacji, a sprawdzenie do function_exists zapewnia, że ​​nie napotkasz problemów, gdy wersja PHP ma natywne wsparcie dla tej funkcji.

Dla wszystkich innych funkcji, spróbowałbym najpierw sprawdzić, czy nie mogą najpierw przejść do dedykowanego obiektu. Zwykle "losowe" funkcje są po prostu niewłaściwie umieszczone.Sprawdź, które obiekty wykorzystują twoje funkcje narzędziowe, a następnie sprawdź, czy możesz tam przenieść metody. Może czeka na wyjście superklasa. Zobacz także Information Expert pattern.

Jeśli nie ma obiektów, które można by zastosować, można je pogrupować w statyczny moduł o nazwie Utils w unikalnej przestrzeni nazw, aby nie zagracały globalnej przestrzeni nazw. W ten sposób możesz być pewien, że nie kolidujesz z innymi funkcjami stron trzecich w zasięgu globalnym.

Przed 5.3, ja bym grupę im following the PEAR naming convention i poprzedzenie nazwy klas po strukturze folderów, na przykład wtedy, gdy moduł jest w com/mattmueller/utils.php, można użyć

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

Od PHP5.3, my „ve got prawdziwy namespaces i można zrobić

namespace com\mattmueller\Utils; 

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

w JavaScript nie ma nazw, ale może easily simulate them dodając funkcje do obiektu, np

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

Wspólne struktury zazwyczaj również realizują funkcje dla creating namespaces.

+1

Awesome! Dzięki za spostrzeżenia. Yah Naprawdę chciałbym móc korzystać z przestrzeni nazw PHP, ale mój hosting nie ma jeszcze 5.3. – Matt

+0

@Matt dobrze, nadal możesz pójść z podejściem PEAR, które zauważyłem, lub po prostu użyć nazwy klasy, która raczej nie będzie się kolidować, np. 'MMUtils' jeśli zbyt długo znajdziesz nazwę klasy opartą na nazwie domeny. – Gordon

4

Generalnie zarezerwowałem functions.php lub common.php dla wszystkich moich dziwnych funkcji, które powinny być idealnie w PHP w pierwszej kolejności. (To znaczy, w ogóle nie dotyczy mojego projektu).

Może to być coś w rodzaju wykonania standardowej funkcji rozszerzonej na wielowymiarowe tablice lub czegoś innego, co pasuje do tej kategorii.

Kiedy zmieniam projekty, po prostu kopiuję ten plik do następnego projektu i może on łatwo być ze mną wszędzie. Następnie upewniam się, że jest on załadowany do skryptu ładowania i pomyślnie rozszerzyłem język.


Dla konkretnych rzeczy projektowych, trzymam Misc klasę zawierającą naprawdę dziwne wywołań funkcji, które są w tym samym czasie, projekt specyficzny.


Dla funkcji Javascript, mogę sobie wyobrazić, że to samo może dotyczyć. Jeśli chcesz utworzyć plik typu functions.js lub global.js, prawdopodobnie użyjesz tej samej logiki.

1

W przypadku Javascript odkryłem, że pierwszym wyborem powinno być zintegrowanie moich narzędzi z jQuery. To tak proste, jak pisanie jakiejkolwiek innej funkcji, a gdy wszystko staje się bardziej skomplikowane, wspaniale jest móc wykorzystać paradygmat, który jQuery nakłada na wszystko (i na cały mój inny kod strony w witrynie).

+0

Dodam, że można również przedłużyć prototyp wbudowanych obiektów, takich jak Array, a także – Goyuix

+0

@Goyuix - ogólnie rzecz biorąc rozszerzanie rodzimych obiektów nie jest mile widziane. – scunliffe

+0

@scunliffe powiedz to do Prototype guys :-) – Pointy

2

Zawsze używam klasy pomocnika, w której mogę umieścić cały mój kod nie-OOP, LOL. Chodzi mi o to, że jest to model pomocników wciąż będących OO i posiadających metody zamiast funkcji, z tą przewagą, że możesz organizować swoje funkcje w różnych pomocnikach. Jak StringHelper, DBHelper itp

+0

Ja też (dla PHP, przynajmniej). Mam folder o nazwie Util, z plikami klas dla StringUtil, ArrayUtil itp., Które są pełne statycznych metod. W połączeniu z dobrym mechanizmem automatycznego ładowania działa bardzo ładnie. – grossvogel

1

w JavaScript, utworzyć nowy plik i grupować je w ramach przedmiotu

global.js:

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

sam pomysł może być używany dla PHP. Dzięki temu nie musisz martwić się konfliktami w konwencjach nazewnictwa, gdy twój program będzie większy.

Powiązane problemy