2013-05-30 13 views
13

Po pierwsze: starałem się google, ale przede wszystkim znalazłem tylko dyskusje o tym, jak zdefiniować tablice w stałych i innych niepowiązanych informacji.Klasy PHP zawierające tylko stałe

Mam pytanie dotyczące rozwiązania, które sprawi, że mój kod będzie bardziej czytelny (i piękny), który właśnie mi się przydarzył. Zasadniczo mam większość funkcji zwracających kod statusu, który wskazuje na sukces lub, jeśli coś poszło nie tak, kod błędu. Do tego zrobiłem klasy o nazwie „StatusCode”, która zawiera tylko stałe, tak jak:

<?php 
class StatusCode { 
    const success = 0; 
    const badArgument = -1; 
    const badQuery = -2; 
    const outOfMana = -3; //Really just for demonstration purposes 
    ... 
} 

Celem jest, aby magiczne numery zniknąć z mojego kodu i jasno, co poszło nie tak, bez konieczności szukać wyjaśnienie gdzieś:

if (mana > 10) { 
    //Do some magic 
    return StatusCode::success; 
} 
else { 
    //Oh god this is not good! 
    return StatusCode::outOfMana; 
} 

Powinno również wyeliminować możliwość przypadkowego użycia duplikatów kodów błędów. Jestem prawie pewien, że doda to niewielki narzut do mojej aplikacji, ale w zamian uczynił mój kod łatwiejszy do zrozumienia. Czy istnieje jakiś powód do wstrząsania ziemią, aby tego nie robić? Może jeszcze lepszy sposób na zrobienie tego?

(mam unikać podejścia define(CONSTANT, "value") ponieważ wydaje się mniej ładna i jest to uciążliwe pisać na mój niemiecki klawiaturze :))

+7

Nie ma powodu, dla którego NIE robić tego, co zrobiłeś. Jak powiedziałeś, sprawia, że ​​twój kod jest bardziej czytelny. Jeśli chodzi o dodawanie narzutów, nawet jeśli jest to prawda, jest to całkowicie minimalny koszt. Jeśli chodzi o lepsze sposoby, istnieją różnice w tym, co zrobiłeś, używając interfejsów do definiowania stałych. TL; DR - to, co zrobiłeś, jest dobre. –

+1

Całkowicie zgadzam się z tym, co @ N.B. powiedziany. Mój jedyny problem z tym postem polega na tym, że powinien on być zakończony sprawdzeniem kodu, a nie tutaj;) – Prisoner

+1

W tym małym zakątku stylu kodowania twój wybór jest absolutnie najlepszy.A mówiąc o stylu, bardzo często nie mówi się "absolutnie najlepiej". ;-) BTW, możesz chcieć uczynić tę klasę 'abstract' lub' final' jako dodatkową wskazówkę, jak to nie powinno być używane. Niestety nie może to być jedno i drugie, które zamknęłoby umowę. – Jon

Odpowiedz

17

w Javie i innych językach jest to powszechnie stosowany sposób do przestrzeni nazw stałych do unikania nazywania kolizje. Zobacz here;

Sposób, że chciałbym wdrożyć takiej klasy jest tak”

// make this final so no one can extend it 
final class Errors{ 
    const SUCCESS = 0; 
    const BAD_ARGUMENT = -1; 
    const BAD_QUERY = -2; 
    const OUT_OF_MANA = -3; 

    // make this private so noone can make one 
    private function __construct(){ 
     // throw an exception if someone can get in here (I'm paranoid) 
     throw new Exception("Can't get an instance of Errors"); 
    } 
} 
+1

Dlaczego nie pomyślałem o tym, aby konstruktor był prywatny, a nie abstrakcyjny? Dzięki, twój przykład obejmuje zarówno "nie tworzyj", ani "nie rozszerzaj". – Anpan

1

Ma to tę zaletę przestrzeni nazw i grupowania stałe. Można użyć refleksji na tej klasy iteracyjne nad zdefiniowanych stałych, które pozwala na przykład na sprawdzenie, czy wartość jest wartością pewnej stałej grupy (umożliwiającej ciągłe podpowiedzi typu "biedny człowiek").

Wadą jest to, że trochę nadużywasz lekcji (choć tylko nieznacznie) Puryści mogą tego nie lubić Stałe, które nie są używane w sam Klasa e powinna być stała globalna; możesz nawet nazwać je w coś takiego, jak \StatusCodes\SUCCESS w PHP 5.3+.

Wybór należy do Ciebie.

+0

Przypuszczam, że to trochę jak zdjęcie zakrętki z zapalniczką. Zapalniczka nie została stworzona do tego celu, ale działa dobrze :) Jeśli jedynym argumentem przeciwko tej praktyce jest: "Ale lekcje nie były do ​​tego przeznaczone", ale ma kilka innych zalet, to przypuszczam, że jest w porządku. – Anpan

+0

Sortuj, tak. :) – deceze

1

Tworzenie statycznego klasę rozwiąże problem i uniknąć tworzenia wielu wystąpień StatusCode

przestrzeni nazw mogą być używane, jeśli uważasz, że Twoja aplikacja może mieć wiele klas StatusCode ale nadal StatusCode będą statyczne.

Jeśli chcesz użyć Singleton to będzie działać zbyt

Wybór należy do Ciebie!

+0

Właściwie nie chcę żadnego wystąpienia w ogóle. – Anpan

+0

Z definicji klasy takiej jak "Klasa StatusCode" można wykonać wiele instancji, tak jak na tym opiera się zarządzanie pamięcią, dlatego lepiej zdefiniuj kod statusu klasy statycznej i użyj go jako StatusCode :: * –