Witam wszystkich.
W projekcie nad którym pracuję ma się znaleźć 5 działów: newsy, artykuły (posegregowane w kategoraich), pliki (również kategorie), projekty(bez kategorii) i linki(bez kategorii).
Napisałem juz skrypt obsługujący newsy, dodawanie, przeglądanie, tagi i komentarze. Chciałem przejść do kolejnego etapu - artykułów. I "naszła mnie" refleksja.
Czy zamiast pisać to strukturalnie, nie lepiej zbudować strukturę klas i z niej obsługiwać nie tylko artykuły, ale też projekty, pliki i linki? W końcu są to tylko rekordy w bazie, z których każdy ma swój ID, jakąś nazwę i opis (w przypadku artykułu to jest tekst artykuły, ale to i tak pole text w mysql). Mogłyby to być więc dane składowe klasy. Pozostałe informacje (np. w przypadku pliku bylyby to nr kategorii, wielkość pliku oraz link do pliku) można by przechowywać w danej składowej $data, która byłaby tablicą.
Te dane utworzyłyby zestaw danych klasy Item. Klasa item miałaby jeszcze metody: addNewItem, deleteItem, updateItem, które odpowiednio: dodają itema, usuwają lub zmieniają już istniejący item.
Do tego trzeba by utworzyć oczywiście 4 klasy dziedziczące po Item, a więc: articleItem, projectItem, fileItem i linkItem. Zadaniem tych klas byłoby obsługiwanie tych danych i metod, które nie są wspólne dla wszystkich rodzajów itemów. Właściwie to głównie chodziłoby o takie zaimplementowanie w nich funkcji __tostring, żeby wyświetlenie obiektu wstawiało od razu potrzebny kod na stronie (czyli nazwę pliku, datę publikacji, link, wilekość, typ pliku itd. itd.).
Jak to wygląda jeśli popatrzy się okiem kogoś bardziej doświadczonego ode mnie? (to byłaby moja trzecia od początku napisana samodzielnie klasa, więc na pewno wiele mi jeszcze trzeba). Jest tu gdzieś jakiś błąd w rozumowaniu?
I od razu, wiążące się z tym zagadnienie: tabele bazy danych. Tworzyć 4 tabele dla każdego rodzaju itema osobno, czy stworzyć jedną, zbierającą wszystkie właściwości wszystkich rodzajów itemów? 4 to zawsze kłopot, trzeba za każdym razem pamiętać, jakiego typu jest potrzebny item i wybierać odpowiednią tabelę w bazie. Z kolei 1 to wszystko w jednym miejscu, ale dużo dziur (bo nie wszystkie pola będą wykorzystywane przez dany typ itema). Jest też sprawa tego, że jeśli wykorzystuję dziedziczenie to chyba bardziej naturalne jest odtworzenie struktury dziedziczonych danych w strukturze tabeli (czyli 1 tabela items z tylko wspólnymi polami, a druga tabela itemsProperties z czterema polami (propertyId, propertyItem, propertyName, propertyValue), gdzie dodawałbym właściwości niewspólne (czyli w przykładzie itemu typu plik byłoby to np. (23, 9, link, http://www.costam.gdzies).
Jeśli ktoś się przez to przebrnął, to najpierw gratuluję (żona mi powtarza,że z pisaniem u mnie kiepsko), a potem proszę o opinie, za które już teraz serdecznie dziękuję.