![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Rozmyslam nad pewną sprawą. Pewnie samym rozwiązaniem ameryki nie odkryłem, pewnie są już jakieś implementacje tego, jednak chodzi mi o to co o tym szanowne jury myśli ;]
Ostatnio popularny jest temat abstrakcji na bazy danych ;] Jednak rozwiązanie w stylu
jest dla mnie niesatysfakcjonujące. Dlaczego? Jakbym chciał "przestawić" aplikację aby dane czerpała z plików txt, czy np. z SOAP ( ![]() Mój pomysł jest taki
Itd. ;] Klasy xxxQuery przygotowywały by co trzeba, jak trzeba itp. Tworzyłby by odpowiednie zapytania do MySQL czy PgSQL a potem byłby to wykonywane. Jednak takim sposobem nie obsłużę takiego "złożonego" zapytania jak np. SELECT * FROM table LEFT JOIN cos ON cosik=2 LIMIT 4 Co w tym momencie ? Ano użytkownik (czyli ja) tworzył by sobie własną klase xxxQuery której zadaniem byłoby obslużenie tego jednego konkretnego zapytania. Potem w skrypcie tylko
i wszystko by grało. Teraz gdybym np. z MySQL chciał przejść do plików TXT wszystko polegalo by na przepisaniu podstawowych klas InsertQuery, SelectQuery, UpdateQuery itd. by obsługiwały owe pliki teksowe oraz tych "własnych" klas xxxQuery. Czy coś takiego ma jaki kolwiek sens ? Jakie są ewentualne wady a jakie zalety? Proszę o pomoc ![]() -------------------- |
|
|
![]()
Post
#2
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
ja robie cos takiego:
podobnie mam dla innych instrukcji jak delete, update i select (to jest najtrudniejsze), napisalem tu o insercie bo od niego zaczolem. Caly czas to rozwijam ale chodzi mi o to zeby oberaowac zmiennymi przekazywac z obiektu do obiekty z metody do metody a zapytania robi tylka warstwa abstrakcji -------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
czyli to samo u mnie ;] tylko ze ja bym przekazywal do query() obiekt.
czemu ? wykonaj na tym swoim select jakies baardzo rozbudowane zapytanie ;] moze sie nie udac ![]() U mnie zas dopisalbys wlasna klase do obslugi tego jednego konkretnego zapytania. -------------------- |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
moj glowny select obsluguje cala skladnie selecta z sql92 i zadnych problemow nie ma nic nie musze ingerowac, ma tylko spora liste parametrow ale ze sa domyslne to nie wszystkie trzeba wypelniac, zrobilem sobie tez prostrza wersje metody pt. simpleSelect ktora obsluguje najpopulaniejsze slowa kluczowe, poza tym metody sa inteligentne i same rozpoznaja zapodane parametry i dopisuja sobie reszte, mi dodatkowe obiekty nie sa potrzebne a juz kilka projektow na tym zrealizowalem alej jesli twierdzisz ze nie mozesz bez nich zyc...
-------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
a no to teraz rozumiem ;] skoro tak to nie sa ci potrzebne ;]
jednak mnie chyba nie chce sie robic obslugi calego sql ![]() pozatym dzieki tym moim obiektom moge jeszcze wstepnie obrabiac pobrane dane. pozdrawiam ![]() -------------------- |
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
no calego sql nie bylo potrzeby implementowac ale zgodnie ze specyfikacja mam:
select, insert, update, delete innych nie potrzebuje dorobilem sobie dodatkowe metody np. do sprawdzania czy wartosc jest w tabeli jesli tak zwraca te wartosc jak nie to false itp. osobiscie nie widze potrzeby obrabiania danych w warstwie abstrakcji u mnie wszelikmi obrobkami zajmuje sie warstwa logiki biznesowej ale jestem ciekaw jak to tealizujesz, opowiedz o swoim rozwiazaniu wiecej -------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
nie no chodzilo mi oto ze user moze sobie jakby "rozszerzać jezyk sql" ;]
w takim adodb o ile sie nie myle tez sa jakies pluginy (nigdy nie uzywalem adodb). U mnie user moglby sobie stworzyc wlasna klase dla zapytania, ona pobrala by jakies dane, obrobila wg przekazanych paramterow i zwrocila to co potrzebne. Taka klasa mogla by na raz robic od razu jakis select potem update, delete i cos tam jeszcze ;] Cos jak procedury w sql. -------------------- |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 521 Pomógł: 0 Dołączył: 3.11.2003 Skąd: 3city Ostrzeżenie: (0%) ![]() ![]() |
Idea uniezależnienia się od źródła danych jest szczytana, ale dlaczego wpychać to do klasy obsługującej bazę danych? Jeżeli robisz $db->query(...), to widać na pierwszy rzut oka, że za tym stoi baza danych, a nie SOAP. To nie jest warstwa, w której można wprowadzać abstrakcję. Za późno na to. Co innego, jeżeli masz UserManager->getInstance()->getUserByName('foobar'). Tutaj jesteś w stanie napisać implementacje klasy UserManager operujące na DB, SOAP czy czymkolwiek. Ale nie ma poziomie zapytania SQL, bo trzeba wtedy - co sam widzisz - interpretować składnię SQL lub zastępować czymś innym.
Spójrz na to tak: musisz wyciągnąć artykuł. Masz napisany kod, który wie, jakie zapytanie SQL stworzyć i przekazuje to do jakiegoś managera db. Teraz chcesz napisać kod, który "odkręci" to zapytanie SQL i przełoży na coś abstrakcyjnego... a potem kod który przetłumaczy to abstrakcyjne zapytanie np. na SQL. |
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
Czyli jak to "wykończyć". W takim getUserByName() powinny być czyste zapytania SQL dostosowane pod konkretną baze danych? i w razie
chęci przestawienia się na pliki TXT miałbym robić "nowe implementacje" tej metody? Tak by wykorzystywała ów pliki? (sądze ze nie o to chodziło) Jeśli miałbyś czas to byłym wdzięczny za jakiś pseudo kod tego rozwiązania. Sam zarys. Łatwiej wtedy zrozumieć kod niż słowa ![]() Ale to jak ci sie zachce. W każdym bądź razie dzięki za wypowiedzi. -------------------- |
|
|
![]()
Post
#10
|
|
![]() Grupa: Zarejestrowani Postów: 358 Pomógł: 0 Dołączył: 3.07.2003 Skąd: Szczecin->niebuszewo->*(next to window) Ostrzeżenie: (0%) ![]() ![]() |
Cytat(Vengeance @ 2004-12-23 18:27:07) Łatwiej wtedy zrozumieć kod niż słowa ![]() no to ja Cie podziwiam, jestes komputerem czy jak? hawk dobrze prawi ale raczej nie bedzie tu prezentowal swojego kodu aczkolwiek dolaczam sie do prosby dalszego wytlumaczenia -------------------- Jeśli życie to kara to nieźle nabroiłem ;-)
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
hehe moze i jestem ;]
ale serio latwiej mi zawsze zrozumiec cos na przykladzie, nawet w jakims pseudo kodzie ![]() ![]() Bo slowo pisane mozna roznie interpretowac ![]() -------------------- |
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 742 Pomógł: 0 Dołączył: 14.12.2003 Skąd: Gdańsk, Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
Ja tu tak czytam, i czytałem coś podobnego w książce i mam jedno rozwiązanie w głowie:
Kod | abstrakcja bazdy danych (jakis adodb, creole czy coś własnego) | | warstwa klas i metod typu User->getUserById, Auto->getAutoByRejestracja czyli takich, które ukrywają skąd są te dane, zwracają Ci same dane, dodatkowo mogą na nich operować) | | warstwa logiki czyli cały kod, który wszelkie dane wyciąga przez klasy/metody opisane w warstwie wyżej. co Wy na to? |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
to jest standard. chodzi tylko o to ze gdy uzywasz tego adodb i chcesz teraz
przjesc na pliki txt to masz do zmiany wszystkie te twoje "warstwa klas i metod". Mi chodzi o napisanie wlasnej abstrakcji na baze danych aby te zmiany zmniejszych do minimum. Bo takie adodb przyjmuje tylko sql i tylko na bazach operuje o ile mi wiadomo. -------------------- |
|
|
![]()
Post
#14
|
|
![]() Grupa: Zarząd Postów: 2 277 Pomógł: 6 Dołączył: 27.12.2002 Skąd: Wołów/Wrocław ![]() |
Cytat chęci przestawienia się na pliki TXT miałbym robić "nowe implementacje" tej metody? Tak by wykorzystywała ów pliki? (sądze ze nie o to chodziło) A ja myślę, że chodziło właśnie mniej więcej o to. np.
życie można sobie jeszcze bardziej uproscić, tworząc klasę automatycznie zwracającą odpowiednią instancję, w zależności od tego, czy pracujemy na Db, czy na txt. ps. soorki za php5, choć to nie to forum - wybaczcie, siła przyzwyczajenia. -------------------- "Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
a tak?
-------------------- |
|
|
![]()
Post
#16
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
@Vengeance mi sie w tym rozwiazaniu te statici nie podobają, czy nie lepiej stworzyc klase do budowanie zapytan i potem
? -------------------- |
|
|
![]()
Post
#17
|
|
![]() Grupa: Przyjaciele php.pl Postów: 742 Pomógł: 0 Dołączył: 14.12.2003 Skąd: Gdańsk, Trójmiasto Ostrzeżenie: (0%) ![]() ![]() |
ja proponuję tak: (php5)
|
|
|
![]()
Post
#18
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
a nie return new User{$type}(); ?
-------------------- |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 657 Pomógł: 2 Dołączył: 15.08.2003 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
po 1. wlasnie chcialem zapytac. jaka jest roznica (ale juz w php5) miedzy singletonem a 'static' ;] wydaje mi sie (pewnie zle) ze jesli cala klasa bedzie miala argumenty jak i metody okreslone jako static
to wykorzystywanie singletona nie ma sensu. po 2. bela_666 w sumie to na jedno wychodzi ;] ja tam wole swoje nie wiem czemu. kazdy ma jakies fobie ![]() ---edit--- hmm no nie wiem olo. w kazdym sposobie jest ciut poprawnosci. jednak zauwaz ze zwalasz tu na uzytkownika implementacje obslugi sql, txt i innych. Mi chodzi o to aby mozna bylo szybko sobie wybrac czy chce pliki czy sql czy co innego. Cos jak adodb. Ty piszesz zapytania ustawiasz w confie z jakiej bazy korzystasz i gra (przynajmniej powinno). A nie piszesz po 6 rodzajow wywolania funkcji po jednym na kazda baze danych ![]() Ten post edytował Vengeance 24.12.2004, 00:11:00 -------------------- |
|
|
![]()
Post
#20
|
|
Administrator PHPedia.pl Grupa: Developerzy Postów: 1 102 Pomógł: 2 Dołączył: 14.09.2003 Ostrzeżenie: (0%) ![]() ![]() |
@Vengeance pisanie klas w ktorych sa same metody statyczne jest zle i tak B. Eckel mowi "nalezy wtedy przemyslec jeszcze raz klase"
![]() Singleton to jest wzorzec projektowy ![]() a przeciez jak jest ten queryBuilder to mozesz ustawic jak chcesz generowac tutaj masz queryBuiler z OPD http://bora.netburg.pl/oop/database/build/...ile=sql_builder Ten post edytował bela_666 24.12.2004, 00:13:05 -------------------- |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 10:20 |