Kto potrzebuje singletonów w PHP?
Zauważ, że prawie wszystkie zastrzeżenia do singletonów pochodzą z technicznego punktu widzenia - ale są one również BARDZO ograniczone w swoim zakresie. Specjalnie dla PHP. Najpierw wymienię niektóre powody używania singletonów, a następnie przeanalizuję zastrzeżenia do używania singletonów. Po pierwsze, ludzie, którzy ich potrzebują:
- Osoby, które kodują duże frameworki / bazy kodu, które będą wykorzystywane w wielu różnych środowiskach, będą musiały pracować z wcześniej istniejącymi, różnymi frameworkami / bazami kodu, z koniecznością implementacji wielu różnych, zmieniających się, a nawet kapryśnych żądań klientów / szefów / kierownictwo / liderzy jednostek tak.
Widzicie, wzorzec singletona jest samowyłączny. Po zakończeniu klasa pojedyncza jest sztywna w każdym kodzie, w którym ją umieścisz, i działa dokładnie tak, jak utworzyłeś jej metody i zmienne. I jest to zawsze ten sam obiekt w danym zapytaniu. Ponieważ nie można utworzyć go dwukrotnie, aby był dwoma różnymi obiektami, wiesz, czym jest obiekt singleton w dowolnym punkcie kodu - nawet jeśli singleton jest wstawiony do dwóch, trzech różnych, starych, a nawet spaghetti baz kodów. W związku z tym jest to łatwiejsze w celach programistycznych - nawet jeśli w tym projekcie pracuje wiele osób, kiedy widzisz, że singleton jest inicjalizowany w jednym punkcie w danym kodzie, wiesz, co to jest, co robi, jak działa i stan, w jakim się znajduje. Gdyby to była tradycyjna klasa, należałoby śledzić, gdzie został utworzony ten obiekt, jakie metody zostały w nim wywołane do tego momentu w kodzie i jaki jest jego stan. Ale upuść tam singletona, a jeśli porzuciłeś właściwe metody debugowania i informacji oraz śledzenie na singletonie podczas kodowania, wiesz dokładnie, co to jest. Ułatwia to więc pracę osobom, które mają do czynienia z różnymi bazami kodu, z koniecznością integracji kodu, co zostało zrobione wcześniej z różnymi filozofiami lub przez osoby, z którymi nie masz kontaktu. (to znaczy dostawca-firma-projektowa-czegokolwiek już nie ma, nie ma żadnego wsparcia). ułatwia to pracę osobom, które mają do czynienia z różnymi bazami kodu, z koniecznością integracji kodu, co zostało zrobione wcześniej z różnymi filozofiami lub przez osoby, z którymi nie masz kontaktu. (to znaczy dostawca-firma-projektowa-czegokolwiek już nie ma, nie ma żadnego wsparcia). ułatwia to pracę osobom, które mają do czynienia z różnymi bazami kodu, z koniecznością integracji kodu, co zostało zrobione wcześniej z różnymi filozofiami lub przez osoby, z którymi nie masz kontaktu. (to znaczy dostawca-firma-projektowa-czegokolwiek już nie ma, nie ma żadnego wsparcia).
- Osoby, które muszą pracować z interfejsami API , usługami i witrynami internetowymi innych firm.
Jeśli przyjrzysz się bliżej, nie różni się to zbytnio od wcześniejszego przypadku - zewnętrzne interfejsy API, usługi, strony internetowe są jak zewnętrzne, izolowane bazy kodów, nad którymi NIE masz kontroli. Wszystko może się zdarzyć. Tak więc, dzięki pojedynczej sesji / klasie użytkownika, możesz zarządzać DOWOLNYM rodzajem implementacji sesji / autoryzacji od zewnętrznych dostawców, takich jak OpenID , Facebook , Twitter i wielu innych - i możesz zrobić to WSZYSTKO w tym samym czasie z tego SAMEGO pojedynczego obiektu - który jest łatwo dostępny, w znanym stanie w dowolnym momencie w dowolnym kodzie, do którego go podłączysz. Możesz nawet utworzyć wiele sesji z wieloma różnymi interfejsami API / usługami innych firm dla tego SAMEGO użytkownika we własnej witrynie / aplikacji i robić z nimi co chcesz.
Oczywiście, wszystko to może być również tonowane tradycyjnymi metodami przy użyciu normalnych klas i obiektów - haczyk polega na tym, że singleton jest uporządkowany, schludniejszy i dlatego łatwiejszy w zarządzaniu / testowaniu w porównaniu z tradycyjnym użyciem klas / obiektów w takich sytuacjach.
- Ludzie, którzy potrzebują szybkiego rozwoju
Globalne zachowanie singletonów ułatwia budowanie dowolnego kodu za pomocą frameworka, który ma kolekcję singletonów do zbudowania, ponieważ gdy dobrze skonstruujesz swoje klasy singleton, ustalone, dojrzałe i ustawione metody będą łatwo dostępne i do użytku w dowolnym miejscu i czasie w spójny sposób. Dojrzewanie twoich klas zajmuje trochę czasu, ale potem są solidne, spójne i przydatne. Możesz mieć dowolną liczbę metod w singletonie robiącym, co chcesz, i chociaż może to zwiększyć ślad pamięci obiektu, przynosi znacznie więcej oszczędności czasu wymaganego do szybkiego rozwoju - metody, której nie używasz w jednej konkretnej instancji aplikacja może być używana w innej zintegrowanej aplikacji i możesz po prostu wcisnąć nową funkcję, o którą poprosi klient / szef / kierownik projektu, wprowadzając tylko kilka modyfikacji.
Masz pomysł. Przejdźmy teraz do zarzutów wobec singletonów i bezbożnej krucjaty przeciwko czemuś, co jest przydatne :
- Najważniejszym zarzutem jest to, że utrudnia to testowanie.
I naprawdę, do pewnego stopnia, nawet jeśli można to łatwo złagodzić, stosując odpowiednie środki ostrożności i kodując procedury debugowania w swoich singletonach, ZE świadomością, że będziesz debugować singleton. Ale widzisz, to nie różni się zbytnio od JAKIEJKOLWIEK innej filozofii / metody / wzorca kodowania, która istnieje - po prostu singletony są stosunkowo nowe i nie są rozpowszechnione, więc obecne metody testowania kończą się porównywalnie z nimi niekompatybilnymi. Ale to nie różni się w żadnym aspekcie języków programowania - różne style wymagają innego podejścia.
Jedna kwestia jest beznadziejna, ponieważ pomija fakt, że aplikacje nie są przeznaczone do „testowania”, a testowanie nie jest jedyną fazą / procesem, który obejmuje tworzenie aplikacji. Aplikacje są opracowywane do użytku produkcyjnego. I jak wyjaśniłem w sekcji „kto potrzebuje singletonów”, singletony mogą wyciąć WIELKĄ ofertę ze złożoności związanej z koniecznością tworzenia kodu działającego WEWNĄTRZ wielu różnych baz kodu / aplikacji / usług stron trzecich. Czas, który można stracić na testowaniu, to czas poświęcony na rozwój i wdrożenie. Jest to szczególnie przydatne w dobie uwierzytelniania / aplikacji / integracji stron trzecich - Facebook, Twitter, OpenID i wiele innych i kto wie, co dalej.
Choć jest to zrozumiałe - programiści pracują w bardzo różnych okolicznościach w zależności od ich kariery. I dla osób, które pracują w stosunkowo dużych firmach z określonymi działami, obsługującymi różne, zdefiniowane oprogramowanie / aplikacje w wygodny sposób i bez zbliżającej się klęski cięć budżetowych / zwolnień i towarzyszącej im potrzeby robienia WIELU rzeczy z wieloma różnymi rzeczami w tania / szybka / niezawodna moda, singletony mogą wydawać się niepotrzebne. I może to być nawet uciążliwe / przeszkodą w tym, co już mają.
Ale dla tych, którzy muszą pracować w brudnych okopach zwinnego rozwoju, zmuszając do wdrażania wielu różnych żądań (czasem nieracjonalnych) od swojego klienta / menedżera / projektu, singletony są zbawieniem z powodów wyjaśnionych wcześniej.
- Kolejnym zarzutem jest to, że zużycie pamięci jest większe
Ponieważ dla każdego żądania od każdego klienta będzie istniał nowy singleton, MOŻE to być zastrzeżenie dla PHP. W przypadku źle skonstruowanych i używanych singletonów, zużycie pamięci aplikacji może być większe, jeśli w danym momencie aplikacja obsługuje wielu użytkowników.
Chociaż jest to ważne dla KAŻDEGO rodzaju podejścia, które możesz zastosować podczas kodowania rzeczy. Pytanie, które należy zadać, brzmi: czy metody, dane, które są przechowywane i przetwarzane przez te single, są niepotrzebne? Jeśli są one niezbędne w wielu żądaniach, które otrzymuje aplikacja, to nawet jeśli nie używasz singletonów, te metody i dane BĘDĄ obecne w Twojej aplikacji w takiej czy innej formie za pośrednictwem kodu. Tak więc wszystko staje się kwestią tego, ile pamięci zaoszczędzisz, kiedy zainicjujesz tradycyjny obiekt klasy 1/3 do przetwarzania kodu i zniszczysz go w 3/4.
Widzisz, postawione w ten sposób, pytanie staje się zupełnie nieistotne - nie powinno być zbędnych metod, danych przechowywanych w obiektach w KODZIE ŻADNYCH - niezależnie od tego, czy używasz singletonów, czy nie. Tak więc ten sprzeciw wobec singletonów staje się naprawdę zabawny, ponieważ ZAKŁADA, że w obiektach utworzonych z klas, których używasz, będą niepotrzebne metody, dane.
- Niektóre nieprawidłowe zastrzeżenia, takie jak `` uniemożliwiają / utrudniają utrzymanie wielu połączeń z bazą danych ''
Nie mogę nawet zacząć rozumieć tego zarzutu, gdy wszystko, czego potrzeba do utrzymania wielu połączeń do bazy danych, wielu wyborów do bazy danych, wielu zapytań do bazy danych, wiele zestawów wyników w danym singletonie, to po prostu trzymanie ich w zmiennych / tablicach w singletonie tak długo, jak długo są potrzebne. Może to być tak proste, jak trzymanie ich w tablicach, chociaż możesz wymyślić dowolną metodę, której chcesz użyć, aby to osiągnąć. Spójrzmy jednak na najprostszy przypadek, użycie zmiennych i tablic w danym singletonie:
Wyobraź sobie, że poniżej znajduje się singleton danej bazy danych:
$ this -> połączenia = tablica (); (zła składnia, po prostu wpisałem to w ten sposób, aby dać ci obraz - właściwa deklaracja zmiennej to public $ connections = array (); a jej użycie to $ this-> connections ['connectionkey'] naturalnie)
W ten sposób możesz skonfigurować i utrzymywać wiele połączeń w dowolnym momencie w tablicy. To samo dotyczy zapytań, zestawów wyników i tak dalej.
$ this -> query (QUERYSTRING, 'queryname', $ this-> connections ['cząstkowe połączenie']);
Który może po prostu wykonać zapytanie do wybranej bazy danych z wybranym połączeniem i po prostu zapisać w pliku
$ this -> wyniki
tablica z kluczem „queryname”. Oczywiście będziesz musiał mieć zakodowaną metodę zapytania - co jest trywialne.
Umożliwia to utrzymywanie praktycznie nieskończonej liczby (na tyle, na ile pozwalają na to limity zasobów) różnych połączeń z bazą danych i zestawów wyników w takim stopniu, w jakim ich potrzebujesz. I są one dostępne dla KAŻDEGO fragmentu kodu w dowolnym punkcie w dowolnej bazie kodu, w której została utworzona instancja tej klasy pojedynczej.
Oczywiście naturalnie musiałbyś zwolnić zestawy wyników i połączenia, gdy nie są potrzebne - ale to oczywiste, i nie jest to specyficzne dla singletonów ani żadnej innej metody / stylu / koncepcji kodowania.
W tym momencie możesz zobaczyć, jak możesz utrzymywać wiele połączeń / stanów z aplikacjami lub usługami innych firm w tym samym singletonie. Nie tak różne.
Krótko mówiąc, w końcu pojedyncze wzorce są po prostu kolejną metodą / stylem / filozofią do programowania i są tak samo przydatne jak KAŻDE inne, gdy są używane we właściwym miejscu, we właściwy sposób. Co nie różni się od niczego.
Zauważysz, że w większości artykułów, w których atakuje się singletony, zobaczysz również odniesienia do „globalnych” będących „złymi”.
Spójrzmy prawdzie w oczy - wszystko, co nie jest używane prawidłowo, nadużywane, niewłaściwie używane, JEST złe. Nie ogranicza się to do żadnego języka, żadnej koncepcji kodowania, żadnej metody. Ilekroć zobaczysz, że ktoś wydaje ogólne stwierdzenia, takie jak „X jest zły”, uciekaj od tego artykułu. Szanse są bardzo duże, że jest to efekt ograniczonego punktu widzenia - nawet jeśli punkt widzenia jest wynikiem wieloletnich doświadczeń w czymś konkretnym - co generalnie kończy się nadmierną pracą w danym stylu / metodzie - typowym konserwatyzmem intelektualnym.
Można na to podać niezliczone przykłady, od „globalne są złe” po „iframe są złe”. Około 10 lat temu nawet proponowanie użycia iframe w dowolnej aplikacji było herezją. Potem pojawia się Facebook, ramki iframe wszędzie i zobacz, co się stało - ramki iframe nie są już takie złe.
Wciąż są ludzie, którzy uparcie twierdzą, że są „źli” - a czasem też z dobrego powodu - ale, jak widać, istnieje potrzeba, elementy iframe wypełniają tę potrzebę i działają dobrze, a zatem cały świat po prostu się przemieszcza.
Największą zaletą programisty / kodera / inżyniera oprogramowania jest wolny, otwarty i elastyczny umysł.