ayeo
28.09.2007, 10:28:38
Witam!
W ramach próby zrozumienia obiektowego podejścia piszę bazę danych o filmach. Mam kilka wątpliwości. Mam klasę Movie, która zawiera prywatne własności jak: id, tytuł, rok produckji, reżyser, opis, gatunek... Id odpowiada id z bazy danych. Konstruktor na podstawie Id wypełnia obiekt danmi z bazy, jeżeli id nie zostało podane tworzy pusty obiekt, ktory można wypelnic za pomoca metod dostepowych. Jest jeszcze flaga change, a destruktor zapisuje zmiany do bazy jezeli została ustwiona.
Jeżeli wyszukiwarka zwróci powiedzmy 15 pasujących filmów (ich id) to do stworzenia 15 obiektów potrzeba 15 dodatkowych zapytań!! Myślałem o dodatkowej klasie MovieManager, która na podstawie jednego zapytania tworzylaby w petli puste obiekty Movie i wypelniala je danymi z wczesniejszego zapytania.
Proszę o jakieś sugestie!
Cezar708
28.09.2007, 11:34:46
tak to jest jedna z wad ORM, że w sumie tak naprawdę musiałbyć mieć tyle zapytań, na szczęście jest rozwiązanie, możesz stworzyć tę swoją klasę MovieManager lub możesz stworzyć statyczną metodę w klasie Movie i za jej pomocą możesz pobierać większe kolekcje danych, poniżej przykład:
<?php
class Movie {
// twoj dotychczasowy kod
// ..
public static function getByPk
($arrPk){ $strPk = implode ( "', '", $arrPk ); $sqlSelect = "SELECT * FROM movies WHERE id IN ('$strPk') ";
$arrMovies = dataBase::$db->getAll($sqlSelect);
foreach ($arrMovies as $movie){
$objMovie = Movie();
$objMovie->setId($movie['id']);
// .. i pozostale pola
$arrReturn[] = $objMovie;
}
return $arrReturn;
}
}
?>
aczkolwiek stworzenie klasy MovieManager (lub MovieCollector) jest lepszym i bardziej przejrzystym rozwiązaniem
ayeo
28.09.2007, 11:56:18
Wielkie dzięki za szybką odpowiedź!
Mam jednak kolejne wątpliwości. Klasa Movie zawiera prywatne własności takie jak tytuł, rok, rezyser, aktorzy, gatunek i opis. Wyszukiwarka umożliwia wyszukanie filmu np po roku produkcji. Załóżmy, że zwraca 20 pasujących produkcji. Nie widzę większego sensu, żeby wypełniać obiekt wszystkimi danymi tylko po to, żeby wyświetlić tytuły,rok i gatunek na liście wyników wyszukiwania. Jak już pisałem dopiero staram się zrozumieć OOP.
Mam taki pomysł, żeby stworzyć klasę powiedzmy EasyMovie, z własnościami: tytuł, rok, gatunek, a dopiero klasa Movie rozszerzałaby ją o dodatkowe. Mówię o dziedziczeniu. Wyszuiwarka (klasa MovieFinder) zwracałaby jako wynik kolekcję (już mam szkic klasy Collection) obiektów EasyMovie.
Pytanie brzmi czy to jest dobre podejście?
Cezar708
28.09.2007, 12:06:58
to, co chcesz zastosować fachowo nazywa się
leniwą konkretyzacją czyli nie pobierasz danej z bazy tak długo, aż do momentu gdy będzie Ci potrzebna.
więcej na ten temat znajdziesz tu
Leniwa konkretyzacja? Jak to ugryźć?, Inicjowanie obiektu wybranymi wartościami