![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 1.04.2007 Ostrzeżenie: (0%) ![]() ![]() |
Cześć!
Problem jest następujący:
No i teraz bez problemu w kontrolerze:
przesyłamy model do widoku, ten go obrabia i wszystko śmiga. Problem powstaje gdy nakażemy kontrolerowi pobrać jednego, konkretnego psa. Normalnie, gdy tworzymy sobie kolekcję psów, konkretny pies nie musi sprawdzać czy to konkretnie on istnieje (po co pies miałby pytać bazę czy rzeczywiście istnieje, skoro przywołujemy go do życia danymi pobranymi właśnie z tej bazy?). Natomiast gdy chcemy powołać do życia jednego psa musimy sprawdzić czy on rzeczywiście sobie tam siedzi (np. użytkownik dopuszcza się literówki)!
i teraz gdzieś w kontrolerze:
No i widzimy, że ten kod nie ma racji bytu, ponieważ pies nie ma dostępu do połączenia z bazą danych. Kontroler musi mu je jakoś przesłać. Oto garść moich pomysłów, każdy mi nie odpowiada: 1) Na konstruktor zrzucamy jedynie odpowiedzialność za dowiedzenie się czy trzeba będzie sprawdzać swoje istnienie i ew. kontroler mu połączenie. Jeśli zajdzie potrzeba już konkretną metodą proponujemy mu imię a on albo przyjmuje je bezdyskusyjnie albo je weryfikuje. 2) Pozostawiamy konstruktor pusty i w zależności od potrzeb wykonujemy wszystkie zadania ?ręcznie?. W obu rozwiązaniach pies nie wie od razu jak się nazywa (dopiero potem proponujemy mu imię), a to chyba nie jest zbyt dobry pomysł (a może jest? tego nie wiem)? Można także: 3) Pies jest bardzo nieufny i niezależnie od wszystkiego sprawdza swoje imię. Jeśli tworzymy kolekcję 100. psów, to 100 na 101 zapytań jest całkowicie niepotrzebnych (sprawdza poprawne dane). 4) Konstruktor psa odwołuje się do prywatnej metody, która pobiera z kontrolera połączenie z bazą. Wtedy każda klasa mogłaby sobie pytać bazę, wystarczyłoby że pobierze z kontrolera dane o połączeniu. Równie dobrze mógłbym użyć singletona lub zmiennej globalnej, a tego chciałbym uniknąć? W jaki sposób wybrnąć z tego problemu? Chodzi mi o rozwiązanie, które ma ?ręce i nogi? (tutaj raczej: cztery łapy), a o takie chyba nietrudno, bo problem wydaje się dość częsty, tylko trzeba go wpierw choć raz rozwiązać a z tym mam problem? Ten post edytował Staszek27 25.07.2010, 20:43:12 |
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Cytat Dla mnie to bardzo wygodne rozwiązanie, choć pewnie ma bardzo wiele minusów. Jeden podstawowy błąd - zrobiłeś z klasy Connection paskudną "klasę globalną" i zamiast przekazywać jej instancję do obiektów (typu Dog) pobierasz ją z ich wnętrza, teraz:Spróbuj zmienić nazwę tej klasy. Spróbuj sprawić by Dog mógł działać na Danych z bazy albo z innego źródła. Spróbuj użyć tego kodu w innym projekcie. Spróbuj na tym tak na prawdę wygodnie pracować. Każda z tych i kilku innych czynności wymaga teraz zmiany w klasach: Dog, Cat, Bird, Bear, itd. |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 16:38 |