Cześć
Wątek nadaje się w sumie również do architektury softu, ale tutaj akurat konkretnie z php.
Ostatnio w kodzie pojawia mi się coraz więcej klas statycznych, czyli klas, które mają raczej same metody statyczne i ewentualnie właściwości statyczne. Na przykład taka klasa do autentyfikacji userów (pisane na miejscu poglądowo):
class UserAuth
{
public static function getUser($login, $password){
//tutaj następuje zapytanie do bazy danych, jeżeli user istnieje zwracany jest jego model (właściwie sama prosta struktura, która zawiera pola tego usera z kolumn z tablicy)
//jeżeli user istnieje, to zwracany jest jego model, inaczej zwracany jest null lub false
}
public static function isLogged(){
//jeżeli model usera jest zapisany w sesji, to zwracany jest on, inaczej zwracane jest null lub false
}
public static function logOut(){
//jeżeli user jest w sesji, jest kasowany z sesji, jeżeli go tam nie było to rzucać tutaj jakiś wyjątek?
}
public static function logIn($userModel){
//model usera jest zapisywany w sesji, ewentualnie można go zredukować tylko do klucza z tablicy z db i w razie czego zapytywać db o pełniejszy model tego usera
}
}
Jak widać same metody do autentyfikacji userów w statycznej klasie pogrupowane, zasadniczo to mógłby być namespace
, niekoniecznie class
.
Teraz, co zrobić z taką klasą, gdyż chyba nie jest to zbyt pięknie wykonane?
Można by użyć singletona i te metody byłyby na obiekcie, ale obiekt byłby de facto globalny, czyli praktycznie to samo (ale potem łatwiej zrobić refaktoryzację, czy też dodać jakieś cache'owanie).
Można zrobić to w zwykłym obiekcie, ale wtedy byłby tworzony obiekt tylko po to, by w zasadzie wywołać funkcję, czyli rolą tego obiektu byłoby tylko grupowanie metod, co również spełnia klasa statyczna.
Czy takie coś załatwiłby DI container
, jakieś fabryki (czyli w sumie jakiś podzbiór DIC), czy może coś jeszcze innego? Co byście polecali tutaj zrobić z takim kodem?
Zasadniczo przykład odnosi się do php i klasy do logowania userów, ale jest więcej takich klas, które są naklepywane statycznie z różnych powodów, chociażby złożoności incjalizacji nowych obiektów (tutaj DIC to akurat typowe use-case, co nie?), a i sam język nie musi być php, może być czymś innym.