Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Object Oriented Programming - i jego pułapki.
LoPMX
post
Post #1





Grupa: Zarejestrowani
Postów: 15
Pomógł: 0
Dołączył: 25.11.2003
Skąd: Białe Błota

Ostrzeżenie: (0%)
-----


Tak wlasnie siedze i mysle sobie, bo chce przepisac swoja aplikacje z GOD classes na prawdziwe OOP. Chce aby kazda klasa reprezentowala jeden typ danych, np. klasa Articles ma metody tworzace obiekty klasy Article, ktora posiada z kolei metody zwracajace dane danego artykulu. Ale jest problem... Artykuly w bazie danych polaczone sa relacyjnie z Article_Type, oraz Category. I problem w tym, ze klasa Article_Type to tylko article_type z DB, Category to tylko category z DB. W templejcie potrzebuje wyswietlic artykuly wraz z ich kategoria oraz typem (np. test, recenzja czy cokolwiek innego). I nie wiem, jak mam polaczyc te obiekty. Moge oczywiscie zrobic wywolanie obiektu Category z Article, ale to za kazdym wyswietleniem danych tworzy jedno zapytanie do bazy o nazwe kategorii. Ma ktos jakis pomysl?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
a1internet
post
Post #2





Grupa: Zarejestrowani
Postów: 14
Pomógł: 0
Dołączył: 11.01.2004
Skąd: Gdynia

Ostrzeżenie: (0%)
-----


Cytat
zastanawiam sie jak zdolacie zaprojektowac klasy zwlaszcza wybierajace dane z baz danych np. artykuly, wraz z powiazaniem relacyjnym owych tablic. czy zrobicie moze GOD classes, co jest bledem?


W A1 Internet poradziliśmy sobie w ten sposób, że połączyliśmy klasy generowane przez DB_DataObject (http://pear.php.net/package/DB_DataObject) z klasami - kontrolerami poszczególnych stron albo modułów na stronie.

W praktyce wygląda to tak, że w oparciu o każdą z tabel w bazie danych automatycznie tworzona jest klasa - model (DAO), w której możemy nadpisać np. metodę wyciągającą, uaktualniającą albo usuwającą dane. Możemy też dopisać nowe metody.

Zazwyczaj z DAO korzysta się w taki sposób:
[php:1:b04b93a0cc]
<?php
$article=&new Model_Article;
$article->get('id',2343);
$article->find(); // tworzy zapytanie SQL i wykonuje je
$article->fetch(); // pobiera pierwszy (i jedyny) z wyników
print($article->title); // teraz możemy zobaczyć tytuł artykułu
?>
[/php:1:b04b93a0cc]

Tak mniej więcej wygląda kontroler strony wyświetlającej konkretny artykuł, tyle że bez ostatniej linii (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) , bowiem obiekt $article przekazujemy do szablonu.

A co zrobić jeśli chcemy wyciągnąć kilka artykułów? Wycwaniliśmy się i jeśli chcemy np. wyświetlić 10 ostatnich artykułów, dodajemy do klasy DAO taką oto metodę:

[php:1:b04b93a0cc]
<?php
class Model_Article {
// [...]
function findLast($limit=10) {
$this->selectAdd(); // w DB_DataObject kasuje listę pól
$this->selectAs(array('id','title','time_added','abstract','author')); // wyciągamy tylko niektóre pola
$this->orderBy('time_added DESC');
$this->limit($limit);
$this->find();
}
//[...]
}
?>
[/php:1:b04b93a0cc]

Z kolei w klasie - kontrolerze strony wyświetlającej ostatnie wiadomości dajemy taki oto kod:
[php:1:b04b93a0cc]
<?php
$article=&new Model_Article;
$article->findLast();
$this->publish('article',$article); // tutaj przekazujemy obiekt $article do szablonu
?>
[/php:1:b04b93a0cc]

Szablon zaś wygląda tak:
[xml:1:b04b93a0cc]
<div id="articlelast">
<dl>
{while $article->fetch()}
<dt>
{$article->title}<br />
<small>{$article->time_added}</small>
</dt>
<dd>
{$article->abstract}
</dd>
{/while}
</dl>
</div>
[/xml:1:b04b93a0cc]

Powyższy szablon wykorzystuje naszą klasę A1_Template (znaną też jako Template_A1), którą niedługo udostępnimy na licencji LGPL.

Powiązaniami relacyjnymi tabeli article z innymi tabelami zająć się może DB_DataObject. Związane z tym metody wywołać można w klasie - kontrolerze strony albo ewentualnie nadpisanej metodzie w klasie DAO.

Jeśli ktoś zna lepszy sposób na rozwiązanie tej kwestii, ma u mnie zimne piwo (lub czasopisma).
Go to the top of the page
+Quote Post

Posty w temacie
- LoPMX   Object Oriented Programming - i jego pułapki.   27.11.2003, 18:17:31
- - bumelang   Swojego czasu trochę nad tym z kumplem debatowaliś...   30.11.2003, 19:57:58
- - halfik   mnie z kolei interesuje ciut inne zagadnienie: czy...   5.12.2003, 08:49:57
- - LukaszLenart   Pomysle, ze masz system ktory generuje jakies rapo...   6.12.2003, 23:42:15
- - halfik   tak, wiem. znam zalety programowania obiektowego, ...   7.12.2003, 12:16:55
- - Seth   Szybsze jest programowanie strukturalne. OOP nie ...   7.12.2003, 13:06:53
- - DeyV   Na szczęscie te róznice są na tyle marginalne, że ...   7.12.2003, 14:22:39
- - LoPMX   zastanawiam sie jak zdolacie zaprojektowac klasy z...   7.12.2003, 14:25:44
- - halfik   CytatOOP nie jest natywne w php. Mimo, ze posiada ...   7.12.2003, 15:37:34
- - Użytkownik   Programowanie obiektowe bardziej pasuje mi do porz...   7.12.2003, 16:20:16
- - halfik   oj, jest potrzebne - jezyki obiektowe to przyszlos...   7.12.2003, 18:06:57
- - Użytkownik   Cytatoj, jest potrzebne - jezyki obiektowe to przy...   8.12.2003, 19:38:10
- - Seth   Pisze (ezPublish, Galaxia, Ambivalence, binaryclou...   8.12.2003, 20:00:19
- - halfik   no ale nawet pomijajac juz duze aplikacje. wezmy p...   8.12.2003, 20:42:21
- - LukaszLenart   Jedna rzecz to prostota zmian, a druga to mozliwos...   9.12.2003, 09:23:06
- - Pathfinder   Witam Swoj maly system buduje tylko na klasach. S...   30.12.2003, 04:38:43
- - LukaszLenart   A czy mozesz udostepnic swoje rowiazanie do wgladu...   30.12.2003, 07:18:01
- - radziel   CytatWitam Swoj maly system buduje tylko na klasa...   30.12.2003, 09:54:54
- - Pathfinder   CytatA czy mozesz udostepnic swoje rowiazanie do w...   30.12.2003, 13:44:35
- - lukaswoj   Ja jestem zdecydowanie za OOP. Zgadza się, że w PH...   2.01.2004, 23:53:19
- - Nalfein][WR   Dokładnie. W całej rozciągłości zgadzam się z luka...   3.01.2004, 12:26:27
- - bumelang   Cytat[WR"]Brakuje jednak tej wielowątkowości w PHP...   6.01.2004, 00:18:49
- - a1internet   Cytatzastanawiam sie jak zdolacie zaprojektowac kl...   12.01.2004, 00:01:05
- - a1internet   Cytatphp ma chyba za dużą narośl kompatybilności, ...   12.01.2004, 00:19:32
- - bumelang   CytatCytatphp ma chyba za dużą narośl kompatybilno...   13.01.2004, 10:59:47
- - halfik   CytatReausumując - doceniam rolę obiektów w tworze...   15.01.2004, 08:41:42
- - cagrET   Cytat... upieranie sie przy strukturalnym nie jest...   15.01.2004, 20:48:41
- - patrycjusz   CytatCytat ... upieranie sie przy strukturalnym ni...   15.01.2004, 21:57:46
- - cagrET   Patrycjuszu nie zrozumiales o co mi chodzilo (moze...   15.01.2004, 23:19:50
- - trax   Dobre funkcje też mogą być rozwiązaniem   7.02.2004, 12:49:40
- - Seth   Mozna tez uzywac 286 i dyskietek zamiast tydsku, t...   8.02.2004, 22:42:39
- - keedy   ja tez pisze swoj maly systemik na oop ;p ale wole...   28.09.2004, 01:17:59
- - Yarecki   Cytat(Seth @ 2004-02-08 23:42:39)Pewnych rzec...   28.09.2004, 07:26:39
- - hawk   Cytat(Yarecki @ 2004-09-28 07:26:39)Programow...   28.09.2004, 11:15:59
- - e-Gandalf   Geez... jaka bzdura... Jak napisal hawk: nie mozna...   28.09.2004, 14:10:04
- - Yarecki   Wypowiedzi na forum nie muszą być obiektywne, bo n...   28.09.2004, 15:24:01
- - hawk   Ludzie mają też problemy z programowaniem struktur...   29.09.2004, 09:19:04
- - kubatron   Seth: Czy ten Aspect Oriented Programing (AOP) będ...   1.10.2004, 06:50:27
- - Bora   na necie jest gdzies przyklad programow napisany a...   1.10.2004, 10:54:20
- - Krolik   Cytat(hawk @ 2004-09-29 08:19:04)Ja np najpie...   17.11.2004, 10:11:44
- - hawk   1) php a Java to jest, niestety, gigantyczna przep...   17.11.2004, 11:56:35
- - Krolik   @hawk: wiem ze moze jestem niepoprawnym optymista,...   17.11.2004, 14:08:22
- - DeyV   ale, do %#$^%, chłopie. Jak tak bardzo lubisz...   19.11.2004, 21:35:05
- - Krolik   @DeyV: Przecież ja nikogo nie odmawiam od pisania ...   20.11.2004, 10:56:55
- - DeyV   Ok, peace Rzeczywiście - "trochę" sie u...   20.11.2004, 11:19:47


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 13:57