Cytat(pinochet @ 4.01.2009, 20:08:37 )

I teraz jeszcze pytanie (stwierdziłem że dotyczy ono topicu) Jak wygląda wasze API modelu ? Co brac pod uwagę przy jego tworzeniu ?
Spróbuję jeszcze raz napisać.
U mnie modele prócz getterów i setterów i możliwości inicjalizacji w miejscu - kiedy podaje id do metody inicjalizującej model sam pobiera swoje dane - posiadają metody odpowiadające logice aplikacji.
Kilka miesięcy temu pisałem projekt dla Służby Zdrowia. Wymagał on pełnego zarządzania różnymi jednostkami lecznictwa tj. ZOZY, praktyki lekarskie, pielęgniarskie, grupowe, indywidualne itd.
Prócz cech wspólnych takich jak REGON, adres, data rozpoczęcia działalności miały też tylko sobie przypisane: ZOZY na przykład tzw numer księgi, który był unikalny (w przeciwieństwie do Regonu), a grupowe praktyki były podpięte pod jakiś ZOZ.
Posiadałem już modele na wzór powyższych blogowych typu
HealthCareInstitution (ZOZ),
IndividualPrivatePractice,
GroupPrivatePractise itd.
Zaznaczam, że już na tym etapie modele nie odzwierciedlały tabel w bazie 1:1 tj.
reporting_units(id, name, regon, address, zip_code, city, unit_type, ...) - główna tabela, trzymająca wspólne dane dla wszystkich typów jednostek.
health_care_institutions (id, book_number, opened_at, closed_at, reporting_unit_id, ...) - tabela ZOZów trzyma unikalne dla nich dane.
medical_practises (id, type, suspended_at, unsuspended_at, ...) - tabela praktyk_medycznych trzyma unikalne dla nich dane.
itd.I tak model RepostingUnitModel (reporting, bo aplikacja służyła do mielenia danych ze specjalnych okresowych formularzy/raportów) miał kilka metod pozyskiwania:
ReportingUnitModel::getActiveUnits() - pobierane są tylko aktywne jednostki, a aktywność była liczona na podstawie zupełnie innych danych dla ZOZów i praktyk.
ReportingUnitModel::getMZ06RepostrByUnitId($id) - pobiera konkretny formularz, wypełniony przez jednostkę.
itd.Ponieważ zrobiłem wywiad środowiskowy - wiedziałem, że nikt nie będzie korzystał z wielkich formularzy po 15 pól i nie będzie szukał po adresie na przykład - chciałem po goglowemu. I tak powstał problem szukajki - bo szukać można na podstawie kilku rodzajów danych w różnych tabelach np. po regonie w tabeli głównej, ale po numerze księgi w tabeli ZOZów - po wpisaniu ich w jedno pole (plus kilka checkboxów zaznaczających jaki rodzaj jednostki sie chce szukać).
Stworzyłem kolejny model, zupełnie oderwany od struktury bazy, SearchModel - był za to w moich oczach zgodny z logiką. Kilka setterów i metoda search(). W bebechach drzemał nadal poczciwy Propel i przy użyciu buildera szukałem po tabelach. Rozwiązanie działało, może nie do końca elegancko, ale banglało.
Czyli już teraz widać, że model nie reprezentuje tabeli DB 1:1. W dodatku niekoniecznie musi posiadać metody do wszystkiego, a tylko do Tego co potrzeba.
Co mogę jeszcze napisać. Że przy tym trybie projektowania nie boję się błędów oraz powyższa szukajka chodzi, na dzień dzisiejszy, na Zend_Searchu

Dopiero teraz jest eleganckie

Zmiana nastąpiła bez ani jednej linijki kodu w akcjach i widokach. Podmieniłem tylko model.
Całkiem niedawno miałem ciekawą rozmowę z kolegą i doszliśmy do wniosku, że gdyby się zawziąć mógłbym w modelach nawet zrezygnować z Zenda i działać bezpośrednio na Lucene poprzez java bridge.
Pozdrawiam, Alan
edit:
Cytat(wlamywacz @ 4.01.2009, 20:28:45 )

Mam pytanko, czy mógłbyś pokazać przykład jak wyglądało by odpowiednik mojego kodu w `Twoim` Propel-u ? [...]
To niczego nie dowodzi, trudno zrobić skomplikowaną aplikację gdzie nie zdarzy się zapytanie wklepane z palca. Normalka.
Natomiast wszelkie INSERTy, DELETEy, UPDATE są bajeczne, bo obiektowe.