Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kilka pytań o praktyczne zastosowanie programowania obiektowego
Zagiewa
post
Post #1





Grupa: Zarejestrowani
Postów: 84
Pomógł: 0
Dołączył: 12.08.2009

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


Witam. Dopiero wchodzę w programowanie obiektowe i choć oczytałem się już trochę, wiele poradników dostępnych w internecie opisuje obiektowość w sposób teoretyczny nie pokazując jak można go wykorzystać w praktyce dlatego też mam parę pytań, które nie dają mi spokoju.

1. Tworząc klasy powinno się je trzymać w tym samym pliku co całość kodu czy najlepiej jest utworzyć nowy plik zawierający tylko klasy, a następnie je includować w plikach w których będziemy z tych klas korzystać?
2. Jeśli utworzymy klasę to tworzenie do niej obiektów za pomocą np. formularzy jest proste (przynajmniej teoretycznie) natomiast jak zapisywać obiekty do bazy danych? zapisujemy samą nazwę obiektu czy należy zapisać nazwę wraz ze wszystkimi właściwościami tego obiektu? Np. mamy klasę o nazwie prostokąt. Właściwościami będzie bok_a i bok_b. Tworzymy nowy obiekt o nazwie pierwszy_prostokat i nadajemy mu właściwości bok_a=5 i bok_b=10 jak powinien wyglądać rekord gdy zapiszemy ten obiekt do bazy? bo mi przychodzą do głowy taki zapis:

id. || nazwa || bok_a || bok_b
1 || pierwszy_prostokat || 5 || 10

3. Czy nawet w przypadku prostych skryptów warto używać obiektowości? Dajmy na to tworząc księgę gości to ilość kodu niezależnie czy użyjemy kodu strukturalnego czy obiektowego jest niemal taka sama. Jeśli chodzi o czytelność jest też podobnie bo skrypt ogólnie jest prosty. Sposób zapisywania do bazy jest identyczny zmienia się co najwyżej struktura tabeli. Więc nasuwa się pytanie - jak pisać?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


@Darko:

Fail #1: Model MVC w skrócie: wywołanie Kontrolera -> Kontroler określa, że potrzeba użyć tego Widoku i wrzucić mu ten a ten Model(e) -> odpalenie Widoku. Jak widzisz Kontroler nie pośredniczy w przekazywaniu danych do Widoku - on sam potrafi sobie pobrać co mu jest potrzebne.
Fail #2: Ta myśl o tym, że powinna być tylko jedna instancja obiektu obsługującego bazę danych. No to prosta sytuacja, mamy następujące modele:
  • Aktualności - pobiera aktualności do witryny z naszej lokalnej bazy danych
  • Galeria - pobiera obrazy z naszej lokalnej bazy danych
  • Użytkownik - j/w
  • Użytkownik::zasugerujListęZnajomych - metoda wykorzystuje Facebookowe API i próbuje zwrócić nam sugerowaną listę znajomych danego użytkownika
  • Płatności - nasza aplikacja to np. sklep internetowy z jednym z backendów w postaci aplikacji desktopowej, która operuje na bazie SQLite po czym udostępnia tą bazę na serwerze - tutaj Twoja teza zawodzi po raz pierwszy
  • Magazyn - skoro to sklep, to musimy mieć jakiś magazyn - ale ten znajduje się daleko od nas i musimy się połączyć z jego bazą danych - tutaj Twoja teza zawodzi kolejny raz
To, że w zdecydowanej większości przypadków mamy dokładnie jedną instancję obiektu reprezentującego bazę danych (używanego przez różne Modele) nie oznacza, że tak będzie zawsze. Aplikacji korzystających z dwóch lub więcej baz danych na raz, jako tych lokalnych jest względnie niewiele, ale ot system umożliwiający założenie sobie forum czy bloga (który jest w osobnej bazie) - i już masz konieczność wykorzystania obu baz na niektórych podstronach.

Cytat
Najlepiej podejrzyj jakieś rozwiązania frameworkowe Kohana
Jeżeli zależy Ci na tym by nauczyć się OOP - w kod Kohany v3 nawet nie zaglądaj (musisz się najpierw uodpornić (IMG:style_emoticons/default/biggrin.gif) ).

Ten post edytował Crozin 29.07.2010, 13:08:09
Go to the top of the page
+Quote Post
darko
post
Post #3





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Cytat(Crozin @ 29.07.2010, 14:07:01 ) *
@Darko:

Fail #1: Model MVC w skrócie: wywołanie Kontrolera -> Kontroler określa, że potrzeba użyć tego Widoku i wrzucić mu ten a ten Model(e) -> odpalenie Widoku. Jak widzisz Kontroler nie pośredniczy w przekazywaniu danych do Widoku - on sam potrafi sobie pobrać co mu jest potrzebne.

Taaaak, w idealnej implementacji, która nie istnieje powinien zostać zaimplementowany wzorzec obserwator i widoki powinny się same uaktualniać przy zmianie danych. To wiemy. Niestety praktyka, zwłaszcza frameworkowa oraz specyfika protokołu HTTP uniemożliwiają taką "najbliższą ideałowi" (którego nie ma!) implementację mvc i nie ma co udawać, że jest inaczej (IMG:style_emoticons/default/biggrin.gif) Oczywiście, że sam kontroler fizycznie nie przekazuje danych z modelu do widoku, jednak to w nim deklarujemy tę operację:
przykład a'la ZF:
// kontroler
public function xyzAction()
{
// przekazanie danych do widoku (w kontrolerze z modelu sic!)
$this->view->sth = $this->MyModel->getSth();
}
// (...)

// widok:
// xyz.phtml
<!-- (...) -->
<?php
if($this->sth):
foreach($this->sth as $test):
echo $test->x . '<br/>' . $test->y . '<br/>' . $test->z;
endforeach;
endif;
?>

Cytat(Crozin @ 29.07.2010, 14:07:01 ) *
Fail #2: Ta myśl o tym, że powinna być tylko jedna instancja obiektu obsługującego bazę danych. No to prosta sytuacja, mamy następujące modele:
  • Aktualności - pobiera aktualności do witryny z naszej lokalnej bazy danych
  • Galeria - pobiera obrazy z naszej lokalnej bazy danych
  • Użytkownik - j/w
  • Użytkownik::zasugerujListęZnajomych - metoda wykorzystuje Facebookowe API i próbuje zwrócić nam sugerowaną listę znajomych danego użytkownika
  • Płatności - nasza aplikacja to np. sklep internetowy z jednym z backendów w postaci aplikacji desktopowej, która operuje na bazie SQLite po czym udostępnia tą bazę na serwerze - tutaj Twoja teza zawodzi po raz pierwszy
  • Magazyn - skoro to sklep, to musimy mieć jakiś magazyn - ale ten znajduje się daleko od nas i musimy się połączyć z jego bazą danych - tutaj Twoja teza zawodzi kolejny raz
To, że w zdecydowanej większości przypadków mamy dokładnie jedną instancję obiektu reprezentującego bazę danych (używanego przez różne Modele) nie oznacza, że tak będzie zawsze. Aplikacji korzystających z dwóch lub więcej baz danych na raz, jako tych lokalnych jest względnie niewiele, ale ot system umożliwiający założenie sobie forum czy bloga (który jest w osobnej bazie) - i już masz konieczność wykorzystania obu baz na niektórych podstronach.

Jeżeli zależy Ci na tym by nauczyć się OOP - w kod Kohany v3 nawet nie zaglądaj (musisz się najpierw uodpornić (IMG:style_emoticons/default/biggrin.gif) ).

Albo ja czegoś nie rozumiem, albo Ty. Nie napisałem nigdzie, że zawsze musi być jedna instancja bazy danych i uparcie będę twierdził, że - nawet jeśli zdefiniujemy różne dane konfiguracyjne - to i tak powinniśmy mieć możliwość - przy zastosowaniu jednej instancji obiektu bazy danych - "przełączania się" pomiędzy bazami (patrz np. Zend_Application_Resource_Multidb). Tylko dlaczego mieszać kwestię komunikacji z zewnętrznym źródłem danych poprzez wspomniane FB API z modelem DB? Przecież w jakimś innym modelu obsłużysz sobie bez problemu dane z facebooka, z bazą danych nie ma to nic wspólnego, dopóki nie będziesz musiał na tych danych operować, gromadzić je w swojej bazie danych, ale i tu rozwiązanie jest proste - napisanie/użycie odpowiedniego modelu korzystającego z FB API i pobierającego dane. Oczywiście możesz napisać sobie własny pseudo-adapter, w którym będziesz symulować implementację np. metody pobierającej dane - select() gdzie zaimplementujesz pobieranie danych z FB. Grunt, to dostosować się do interfejsu. Dążę do tego, że w przypadku, kiedy mamy wiele źródeł z których pochodzą dane, możemy - trzymając się nadal koncepcji jednej instancji DB - implementować własne adaptery i przełączać się pomiędzy nimi, korzystając z jednolitego interfejsu. W ten sposób mamy możliwość rozróżniania źródła pochodzenia danych. Myślę, że jest to wykonalne.

// edit
można też wykorzystać factory do dynamicznego tworzenia obiektów DB dla poszczególnych źródeł pochodzenia danych.

Ten post edytował darko 29.07.2010, 14:24:55
Go to the top of the page
+Quote Post

Posty w temacie
- Zagiewa   Kilka pytań o praktyczne zastosowanie programowania obiektowego   24.06.2010, 12:55:44
- - tmka   Na początek dobra rada jeżeli chodzi o sam proces ...   24.06.2010, 14:47:24
- - Zagiewa   Szukałem skryptów napisanych obiektowo ale na ogół...   24.06.2010, 17:16:07
- - red9skull   To ja się podepnę: Do czego można wykorzystać kons...   24.06.2010, 17:40:17
- - croc   Programowanie obiektowe pojawiło się, ponieważ jes...   24.06.2010, 17:57:13
- - Zagiewa   Croc co prawda nie napisałem jeszcze żadnego prakt...   24.06.2010, 20:00:23
- - haahh   Strukturalny faktycznie strasznie się edytuję. Sam...   24.06.2010, 20:10:54
|- - darko   Cytat(haahh @ 24.06.2010, 21:10:54 ) ...   27.07.2010, 09:36:01
- - croc   Lepsze są tutoriale. Zacznij od tutoriala o samej ...   24.06.2010, 22:17:10
- - haahh   Tutki? Pewnie najlepszy ten z manuala , coś poleca...   24.06.2010, 22:34:41
- - croc   Kiedyś kochałem czytać książki programistyczne, al...   25.06.2010, 09:33:52
- - thek   Czemu strzałeczki, a nie kropki? Może są to wskaźn...   25.06.2010, 10:13:38
|- - red9skull   Cytat(thek @ 25.06.2010, 11:13:38 ) C...   25.06.2010, 16:07:59
|- - Mikz   Cytat(thek @ 25.06.2010, 11:13:38 ) C...   26.06.2010, 21:46:39
- - Zagiewa   Mam zamiar dzisiaj napisać pierwszy skrypt za pomo...   26.06.2010, 11:30:12
- - thek   Odpowiedź równe prosta - zwalniania zasobów przydz...   26.06.2010, 23:24:18
- - Mikz   Muszę się szczerze przyznać że nowością jest dla m...   27.06.2010, 00:20:24
- - Crozin   Wystarczy użyć zwykłego unset.   27.06.2010, 02:13:52
- - thek   Jak wspomniał Crozin - unset. Co do destruktora to...   27.06.2010, 11:53:14
- - Zagiewa   Pisałem, pisałem, aż stanąłem w miejscu Niby bez ...   28.06.2010, 01:51:33
- - thek   Po pierwsze - użyj właściwego bbcode (nie wal do z...   28.06.2010, 08:49:31
- - phpion   [PHP] pobierz, plaintext class ksiega {...   28.06.2010, 08:55:28
|- - Mikz   Cytat(phpion @ 28.06.2010, 09:55:28 )...   28.06.2010, 10:23:30
|- - phpion   Cytat(Mikz @ 28.06.2010, 11:23:30 ) O...   28.06.2010, 11:20:29
|- - Mikz   Cytat(phpion @ 28.06.2010, 12:20:29 )...   28.06.2010, 17:33:26
- - Zagiewa   thek sorki za te bbcode - już poprawiłem. phpion m...   28.06.2010, 12:31:18
|- - phpion   Cytat(Zagiewa @ 28.06.2010, 13:31:18 ...   28.06.2010, 12:42:13
- - Zagiewa   No tak dodaję wpis, więc według Ciebie powinna być...   28.06.2010, 12:51:22
- - phpion   To powinno Ci nieco rozjaśnić sytuację: [PHP] pobi...   28.06.2010, 13:05:32
- - thek   Zagiewa... Popatrz na to tak jak phpion czy ja. Na...   28.06.2010, 13:18:55
- - tmka   Witam, ja jeszcze wtrącę się na temat twojego kodu...   29.06.2010, 09:19:05
- - Zagiewa   Wiem, że już trochę minęło od dnia kiedy założyłem...   23.07.2010, 22:05:42
- - cojack   Zainteresuj się wzorcem GenericObject oraz Generic...   23.07.2010, 22:24:52
- - Crozin   1) Metody z serii "ustawi 123123123 wartości ...   23.07.2010, 22:30:50
|- - Luneth   Cytat(Crozin @ 23.07.2010, 23:30:50 )...   26.07.2010, 13:41:55
- - everth   Swoją drogą to najlepiej te wszystkie zawiłości op...   24.07.2010, 21:29:51
- - thomson89   Ja piszę obiektowo już od 6 miesięcy. Zacząłem gdy...   24.07.2010, 22:09:40
- - Pilsener   A ja jeszcze dodam, że pisząc obiektowo dostajemy ...   25.07.2010, 00:20:36
- - cojack   IDE jakieś sobie zainstalowałeś? Czu przesiadłeś s...   25.07.2010, 01:04:52
- - everth   To zależy. Settery ułatwiają pracę gdyby trzeba zm...   26.07.2010, 13:49:45
- - phpion   @everth: Ja nigdy nie korzystam z publicznych skła...   26.07.2010, 13:54:25
- - Crozin   @phpion: settery/gettery można z automatu generowa...   26.07.2010, 14:12:57
- - Luneth   Crozin, chodziło mi nie tyle o uzasadnienie co zap...   26.07.2010, 14:15:28
- - everth   Fakt - ale czasem ustawia się podstawowe właściwoś...   26.07.2010, 14:19:06
- - Crozin   @everth: w konstruktorze podaje się wyłącznie argu...   26.07.2010, 14:22:23
|- - everth   Cytat(Crozin @ 26.07.2010, 15:22:23 )...   26.07.2010, 15:28:32
|- - phpion   Cytat(everth @ 26.07.2010, 16:28:32 )...   27.07.2010, 07:13:54
|- - everth   Cytat(phpion @ 27.07.2010, 08:13:54 )...   27.07.2010, 13:11:45
|- - everth   Cytat(phpion @ 27.07.2010, 08:13:54 )...   27.07.2010, 13:58:52
|- - phpion   Cytat(everth @ 27.07.2010, 14:58:52 )...   27.07.2010, 14:14:44
- - phpion   @Crozin: Netbeans posiada generatory setterów/gett...   26.07.2010, 15:01:36
- - Crozin   call_user_func i inne/zmienne zmiennych - to nie s...   27.07.2010, 13:24:58
- - everth   @Crozin - co do tego że call_user_func jest wolne ...   27.07.2010, 13:38:20
- - phpion   @everth: Mój przykład faktycznie był średnio trafi...   27.07.2010, 13:43:14
- - Crozin   Przecież oczywisty jest, że wywołanie call_user_fu...   27.07.2010, 13:50:01
- - everth   Co do tablicy, to odpuszczam, kwestia przyzwyczaje...   27.07.2010, 14:23:49
- - phpion   Masz rację, jest to dyskusja, w której obie strony...   27.07.2010, 14:28:43
- - everth   Zaciekawiłeś mnie z tym automatem w NetBeans, nie ...   27.07.2010, 14:32:21
- - darko   Korzystam z Eclipse Helios Release Build id: 20100...   27.07.2010, 14:46:37
- - phpion   Niestety chyba nie ma   27.07.2010, 14:46:51
- - Crozin   Z tego co widzę PDT niestety nie udostępnia czegoś...   27.07.2010, 15:18:20
- - IceManSpy   A mnie zastanawia jedna rzecz odnośnie programowan...   29.07.2010, 10:39:13
|- - darko   Cytat(IceManSpy @ 29.07.2010, 11:39:1...   29.07.2010, 10:50:05
|- - IceManSpy   Cytat(darko @ 29.07.2010, 11:50:05 ) ...   29.07.2010, 11:06:29
- - Crozin   @Darko: Fail #1: Model MVC w skrócie: wywołanie K...   29.07.2010, 13:07:01
|- - darko   Cytat(Crozin @ 29.07.2010, 14:07:01 )...   29.07.2010, 14:16:48
- - everth   Wczoraj poczytałem o tym MVC i wyszło na to że cał...   29.07.2010, 13:49:59
- - Crozin   CytatTaaaak, w idealnej implementacji, która nie i...   29.07.2010, 14:38:40
|- - darko   Cytat(Crozin @ 29.07.2010, 15:38:40 )...   29.07.2010, 15:30:35
- - Crozin   CytatJak sam zaznaczyłeś istnieją opisy koncepcyjn...   29.07.2010, 18:34:16
- - phpion   Ja mam pytanko: wychodząc z założenia, że w kontro...   30.07.2010, 07:42:13
- - Crozin   Jest 9 rano, czyli od jakiś 26 godzin jestem na no...   30.07.2010, 07:59:39


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: 6.10.2025 - 19:21