![]() |
![]() ![]() |
![]() |
![]() ![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Witam. Napisałem sobie klasę game
No i oczywiście plik z formularzem.
Moje pytanie brzmi, czy da to się łatwiej zrobić? (bez wykorzystywania sesji, raz ustawić obiekt i potem cały czas z niego korzystać) Po co używać wzorca singleton. Przecież podczas pisania kodu, osoba, która go pisze wie czy utworzyła już dany obiekt czy nie... |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Praktyczny przykład wykorzystania singletona
Właściwie po co ci ta klasa game? I w jakim celu zapisujesz ją do sesji zamiast stworzyć osobny obiekt dla sesji i wrzucać do niego dane z game? |
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Mógłbyś napisać jak to osiągnąć?
W klasie game, mam tworzyć sesje, a w formularzu ją odczytywać? Ten post edytował mimol 24.02.2013, 12:22:18 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 2 958 Pomógł: 574 Dołączył: 23.09.2008 Skąd: wiesz, że tu jestem? Ostrzeżenie: (0%) ![]() ![]() |
Obiekt powinien zajmować się tylko jedną rzeczą, więc nie staraj się tworzyć klasy od wszystkiego.
- stwórz klasę przechowującą sesje (google session class example) - niech game odpowiada tylko za siebie i za pomocą getterów pobieraj od niej dane do klasy obsługującej sesję |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Nie za bardzo rozumiem... Nie chcę tworzyć klasy sesji na siłę... czy to jest rzeczywiście konieczne?
Wsadzam obkiet Game do sesji ponieważ chcę skorzystać z funkcji type(). Czy według ciebie powinienem w sesji zapisywać number, try?? Co jeśli obiekt przechowuje więcej danych, wtedy będzie mały bałagan, za każdym razem odczytwać te dane... Mógłbyś mi to troszkę jaśniej wytłumaczyć? Najprostsza klasa sesji, którą udało mi się znaleźć TU czy jest ona wystarczająca? (Po przerobieniu na PHP5) lub TU Ten post edytował mimol 24.02.2013, 12:46:26 |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. Nie potrzebujesz korzystać z własnej klasy obsługi sesji. Domyślny mechanizm wbudowany w PHP w pełni tutaj wystarczy.
2. Nie ma potrzeby ręcznie (de)serializować obiektów "wrzucanych do sesji". Cała tablica $_SESSION i tak jest (de)serializowana przy zapisie/odczycie z pliku/pamięci. 3. Nie ma tutaj ani jednego powodu dla którego miałbyś korzystać z singletona, nie powinieneś tego robić. Przykład "praktycznego wykorzystania singletona" podany przez @CuteOne to jeden z paskudniejszych potworków jakie można umieścić w swoim kodzie - takiego czegoś również nie powinieneś praktykować. ![]() 4. Odpowiadając na Twoje pytanie: musisz ręcznie umieścić obiekt w sesji i ręcznie go stamtąd odczytać. Nie mniej jednak możesz troszkę uprościć swój kod: 5. Właściwość Game::try powinna nazywać się Game::tries, a komunikat o wygranej brzmieć: You needed n tries.. 6. Metoda Game::type nie powinna raczej wyświetlać komunikatów tylko zwracać informację o wyniku swojego działania. Tutaj najlogiczniejszym wydaje się zwrócenie liczby mniejszej od zera w przypadku podania za małej liczby, większej od zera w przypadku za dużej i w końcu zera w przypadku trafienia. Dzięki temu Twoja klasa będzie bardziej uniwersalna - będziesz mógł ją wykorzystać w dowolny sposób, nie tylko w tym jednym konkretnym formularzu. Ten post edytował Crozin 24.02.2013, 13:00:38 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 247 Pomógł: 5 Dołączył: 10.12.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cytat Nie ma potrzeby ręcznie (de)serializować obiektów "wrzucanych do sesji". Też mi się tak wydajeJednak jeśli nie serializuje to dostaje error
Dlaczego w tym przypadku muszę recznie serializować ? Czy może jest inny sposób na pozbycie się tego błędu?
Pojawia się jeszcze jeden problem, którego nie przemyślałem... Z tym, że zawsze obiekt odczytuje z sesji, nigdy nie zwiększa się liczba prób, w tym wypadku można to rozwiązać na 2 sposoby. a) Zapisywać liczbę prób w sesji. ![]() Który lepszy? Ten post edytował mimol 24.02.2013, 13:23:46 |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
1. W momencie wywołania funkcji session_start() następuje odczytanie i deserializacja danych z pliku (czy gdziekolwiek przechowujesz dane). W swoim kodzie nie zdefiniowałeś żadnego autoloadera, a klasę Game wczytujesz dopiero po wystartowaniu sesji, więc PHP nie ma pojęcia jak zdeserialiozwać obiekt typu Game, bo nie zna typu Game. Powinieneś skorzystać z autoloadera, albo przenieść wczytanie pliku game.php przed session_start().
2. Powinieneś raczej wrzucać cały obiekt do sesji. Gdy pojawią się nowe właściwości w grze nie będziesz musiał przynajmniej bawić się w modyfikowanie mechanizmu gry nigdzie poza samą klasą Game. 3. Jeżeli decydujesz się na wrzucenie obiektu do sesji powinieneś raczej implementować przy nim interfejs Serializable. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 12.07.2025 - 22:05 |