• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Jest proceduralnie - warto obiektowo?

Object Storage Arubacloud
0 głosów
339 wizyt
pytanie zadane 25 lipca 2017 w PHP przez Bartess Gaduła (3,630 p.)
edycja 25 lipca 2017 przez Bartess

Cześć.
W ramach swojej pasji biegowej od czasu do czasu organizujemy jakiś bieg. Napisałem do tego stronę przedstawiającą wyniki z bazy danych.
Baza danych składa się z 2 tabel:
 

CREATE TABLE `zawody` (
  `zw_index` int(11) NOT NULL AUTO_INCREMENT,
  `zw_nazwa` varchar(100) COLLATE utf8_polish_ci NOT NULL,
  `zw_miasto` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `zw_data` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  `zw_dystans` int(11) NOT NULL,
  `zw_dyplom` int(11) NOT NULL DEFAULT '0',
  `zw_media` int(11) NOT NULL DEFAULT '0',
  `zw_widocznosc` int(11) NOT NULL DEFAULT '0', 
  PRIMARY KEY (`zw_index`)
) ENGINE=MyISAM AUTO_INCREMENT=1000001 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;


CREATE TABLE `wyniki` (
  `idx` int(11) NOT NULL AUTO_INCREMENT,
  `zawody` int(11) NOT NULL,
  `miejsce` int(11) NOT NULL,
  `numer` int(11) NOT NULL,
  `nazwisko_imie` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  `nazwisko` varchar(25) COLLATE utf8_polish_ci NOT NULL,
  `imie` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  `plec` varchar(1) COLLATE utf8_polish_ci NOT NULL,
  `miejsceplec` int(11) NOT NULL,
  `rocznik` int(11) NOT NULL,
  `kategoria` varchar(3) COLLATE utf8_polish_ci NOT NULL,
  `miejscekat` int(11) NOT NULL,
  `mieszkancy` int(11) NOT NULL,
  `kraj` varchar(20) COLLATE utf8_polish_ci NOT NULL,
  `klub` varchar(50) COLLATE utf8_polish_ci NOT NULL,
  `miasto` varchar(30) COLLATE utf8_polish_ci NOT NULL,
  `czas_netto` time NOT NULL,
  `czas_brutto` time NOT NULL,
  `strata` time NOT NULL,
  `tempo` time NOT NULL,
  PRIMARY KEY (`idx`)
) ENGINE=MyISAM AUTO_INCREMENT=2000001 DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci;

Teraz skrypty:
Pierwszy skrypt pobiera z bazy danych informację o zawodach i wyświetla tylko te, których `zw_widocznosc` ustawiona jest na 1 i wyświetla je w formie listy. Lista to odnośniki do skryptu skryptu 2., do którego informacja o indeksie wybranych zawodów jest przesyłana GETem.

Drugi skrypt wyniki.php wyświetla listę wyników zawodów wg przesłanego indeksu zawodów.
Podczas wyświetlania wyników sprawdzane jest:
czy zawodnik jest kobietą, jeśli tak, to wiersz jest kolorowany stylem wiersza tabeli
czy w tabeli pola `zw_dyplom` oraz `zw_media` są ustawione na 1 - jeśli tak, to pojawia się przy każdym zawodniku link do 3 skryptu wynik_personal.php
Do tego jeszcze nad tabelą generowane są linki do wyników w poszczególnych kategoriach wiekowych. Linki te są generowane dynamicznie na podstawie zapytania:
SELECT  distinct `kategoria`FROM  `wyniki` WHERE  `zawody` = ".$zw_index." order by `kategoria`

Do tego osobnym zapytaniem sprawdzane jest, czy są wyniki w kategorii mieszkańców, jeże tak, to też taka kategoria jest dokładana do listy kategorii.

Klikając w poszczególne kategorie przesyłane są GETem informacje o tym do tego samego skryptu php wyniki.php?idx=31415094245&kat=K30

Skrypt wynik_personal.php wyświetla już informację o wyniku klikniętego zawodnika. Sprawdzane jest, czy `zw_dyplom` jest ustawione na 1. Jeżeli tak, to generowany jest podgląd dyplomu w JPG oraz pojawia się link to skryptu generującego dyplom w PDFie. generowany jest również link umożliwiający udostępnienie tej strony z wynikiem na facebooku.

Tak to w ogromnym skrócie wygląda.
W ramach ćwiczeń chciałem to napisać obiektowo, ale ugrzązłem na etapie rozmyślań :-(. I tutaj mam pytanie do bardziej doświadczonych kolegów. Czy dla tak małego i raczej skończonego projektu warto „bawić” się „w obiektówkę”? Jeżeli tak, to czy wg tego opisu jesteście w stanie podpowiedzieć mi jakie obiekty z jakimi metodami tutaj utworzyć?
Czy dla listy zawodów utworzyć klasę Zawody i utworzyć tyle jej obiektów ile zawodów „wypluje” baza danych, czy może wszystko wsadzić do klasy Zawody łącznie z pobraniem ich z bazy danych, a poszczególne zawody przechowywać jako atrybuty, np.: protected $_zawody = array();?

Na ten moment chyba tyle, o ile ktoś zechce coś poradzić.

1 odpowiedź

+1 głos
odpowiedź 25 lipca 2017 przez CenterPL Pasjonat (19,070 p.)
Zawsze warto pobawić się żeby nauczyć się czegoś ciekawego. Ja obiektowo napisałem jeszcze bardziej banalny skrypt, który wyświetlał dane użytkownika przeglądającego stronę, tj IP, Hosta, itd. A nawet taki skrypt miał pare zależności doinstalowanych composerem, miał autoloader et cetera.

Spróbuj sobie Zawody, zawodników itp przerobić na modele. zrób front controller, odizoluj warstwę widoku. Możesz wrzucić tam jakiś system szablonów, np Twig'a. Aplikacja będzie bardziej rozbudowana, może wydaje się, że to takie porywanie się z motyką na słońce, ale np kiedyś łatwiej będzie ją rozwijać.
1
komentarz 25 lipca 2017 przez Bartess Gaduła (3,630 p.)
Dzięki za odpowiedź. Ale mam takie doświadczenie, że nawet nie wiem za bardzo o czym piszesz....("zależności doinstalowane composerem", "autoloader", "przerobić na modele", "front controller", "odizolowanie warstwy widoku", " system szablonów, np Twig'a"....). Bardzo proszę jaśniej :-). Na razie jestem mniej więcej tu: http://di.com.pl/php-programowanie-obiektowe-dla-poczatkujacych-35024 ...
komentarz 25 lipca 2017 przez Assasz Nałogowiec (30,460 p.)
Typowa przypadłość programistów... ;)

Wiele tych pojęć jest związanych pośrednio lub bezpośrednio ze wzorcem projektowym MVC (Model View Controller), więc od tego zacząłbym naukę.
komentarz 25 lipca 2017 przez CenterPL Pasjonat (19,070 p.)
Wybacz, poniosło mnie :D

Tak jak @Assasz napisał - ogólnie wszystko jest związane ze wzorcem MVC.

To może ciut prościej - model to taka klasa, która odwzorowuje tabelę w bazie danych (mniej więcej)

Stwórz więc np klasę Zawody, a w niej pola takie, jakie masz kolumny w bazie danych, czyli id, miejsce itd. Do tego dołóż akcesory - czyli funkcje getId, getMiejsce, setMiejsce (w ogóle to twórz po angielsku!) i masz już prosty model zawodów.

Nie chcę Ci bardzo mieszać, bo może to wydawać się skomplikowane mimo, że jest bajecznie proste.

Ogarnij sobie podstawy programowania obiektowego, a potem próbuj przerobić. Jakbyś chciał to ew. pisz na prv, mogę Cię podszkolić nieco w miarę jak będę miał czas.

Podobne pytania

–2 głosów
1 odpowiedź 317 wizyt
pytanie zadane 14 września 2017 w PHP przez `Krzychuu Stary wyjadacz (13,940 p.)
+1 głos
1 odpowiedź 222 wizyt
pytanie zadane 17 grudnia 2016 w C i C++ przez DragonCoder Nałogowiec (36,500 p.)
+1 głos
8 odpowiedzi 1,424 wizyt

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...