Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: obsługa artykułów - pierwsza klasa
Forum PHP.pl > Forum > PHP > Object-oriented programming
barii
Ostatnio zacząłem czytam o programowaniu obiektowym trochę w necie. Napisałem sobie pierwszą klasę, która ma być odpowiedzialna za obsługę artykułów (tworzenie newsów, kategorii, administrację).

  1. <?
  2. class Articles{
  3. var $id; //nr artukułu
  4.  
  5.  
  6. function remove_news($id){
  7. $sql = "DELETE FROM rada_news WHERE id = $id";
  8. $result = mysql_query($sql);
  9. echo '<p id="succes">Usunięto aktualość o id='.$id.'</p>';
  10. }
  11.  
  12. function add_news($tytul,$img,$kategoria,$tekst){
  13. $data=Date("Y-m-d");
  14. $sql = "insert into rada_news ( tytul, img, kategoria, tekst, data, akcept ) values ( '$tytul','$img', '$kategoria', '$tekst', '$data', '0');";
  15. $result = mysql_query($sql);
  16. echo '<p id="succes"><b>Dodano aktualość '.$tytul.'</b></p>';
  17. }
  18.  
  19. function change_st($id,$stan){
  20. $sql = "UPDATE rada_news SET akcept='$stan' WHERE id=$id";
  21. $result = mysql_query($sql);
  22. if($stan==1) $statut='aktywnty';
  23. if($stan==0) $statut='niaktywnty';
  24. echo '<p id="succes">Zmieniono status wiadomości o id='.$id.' na <b>'.$statut.'</b></p>';
  25. }
  26.  
  27. function edit($id,$tytul,$img,$kategoria,$tekst){
  28. $sql = "UPDATE rada_news SET tytul='$tytul', img='$img', tekst='$tekst', kategoria='$kategoria' WHERE id=$id";
  29. $result = mysql_query($sql);
  30. echo '<p id="succes">Zapisano poprawnie aktualość: <b>'.$tytul.'</b></p>';
  31. }
  32.  
  33. function pobierz_dane($opcja,$id){
  34. $sql = "SELECT $opcja as pole FROM `rada_news` WHERE id='$id'";
  35. //echo $sql.'<br>';
  36. $res = mysql_query($sql);
  37. $row = mysql_fetch_array($res);
  38. return $row['pole'];
  39. }
  40.  
  41. function show_news($id){
  42. $sql = "SELECT * FROM rada_news WHERE akcept=1 AND id=$id";
  43. $result = mysql_query($sql);
  44. $ile = mysql_num_rows($result);
  45. $row = mysql_fetch_array($result);
  46. //echo $ile;
  47. if($ile==0){
  48. echo '<p id="error">Brak aktualości w bazie</p>';
  49. }
  50. elseif($ile>1){
  51. echo '<p id="error">Błąd w bazie. Gdy błąd będzie się powtarzał skontaktuj się z administratorem</p>';
  52. }
  53. else{
  54. $tytul=$this->pobierz_dane('tytul',$id);
  55. $tekst=$this->pobierz_dane('tekst',$id);
  56. $data=$this->pobierz_dane('data',$id);
  57. $img=$this->pobierz_dane('img',$id);
  58. echo'<div id="main_text" style=";margin-top:10px;background-color: white; padding:0px 0px;">';
  59. echo'<div style="border-bottom:1px solid #6600ff; padding:5px 5px;background:#f4f9fb"><b>'.$tytul.'</b>';
  60. echo'<div style="font-size:10px; color:silver">Dodano '.$data.'</div></div>';
  61. echo'<P style="margin:0px;padding:8px 5px">';
  62. if($img) echo '<img src="'.$img.'" align="left" style="margin-right:5px">';
  63. echo $tekst.'</p>';
  64. echo '</div>';
  65. }
  66. }
  67.  
  68. function skroc($tekst,$ile)
  69. {
  70. $znaki = strlen($tekst);
  71. if ($znaki>=$ile)
  72. {
  73. $tnij = substr($tekst,0,strpos($tekst, ".", $ile));
  74. $skrocone = $tnij.".";
  75. }
  76. else
  77. {
  78. $skrocone = $tekst;
  79. }
  80. return $skrocone;
  81. }
  82.  
  83. function html2txt($document){
  84. $search = array('@<[\/\!]*?[^<>]*?'.'>@si'
  85. );
  86. $text = preg_replace($search, '', $document);
  87.  
  88. return $text;
  89. }
  90.  
  91. function show_news_zaj($id){
  92. $sql = "SELECT * FROM rada_news WHERE akcept=1 AND id=$id";
  93. $result = mysql_query($sql);
  94. $ile = mysql_num_rows($result);
  95. $row = mysql_fetch_array($result);
  96. //echo $ile;
  97. if($ile==0){
  98. echo '<p id="error">Brak aktualości w bazie</p>';
  99. }
  100. elseif($ile>1){
  101. echo '<p id="error">Błąd w bazie. Gdy błąd będzie się powtarzał skontaktuj się z administratorem</p>';
  102. }
  103. else{
  104. $tytul=$this->pobierz_dane('tytul',$id);
  105. $tekst=$this->pobierz_dane('tekst',$id);
  106. $data=$this->pobierz_dane('data',$id);
  107. $img=$this->pobierz_dane('img',$id);
  108. echo'<table><tr><td><div id="main_text" style=";margin-top:10px;background-color: white; padding:0px 0px;">';
  109. echo'<div style="border-bottom:1px solid #3b8cdd; padding:5px 5px;background:#f4f9fb"><b><a href="'.WWW.'aktualnosc/'.$row['id'].',_">'.$tytul.'</a></b>';
  110. echo'<div style="font-size:10px; color:silver">Dodano '.$data.'</div></div>';
  111. echo'<P style="margin:0px;padding:8px 5px">';
  112. if($img) echo '<img src="'.$img.'" align="left" style="margin-right:5px">';
  113. $tekst = $this->html2txt($tekst);
  114. $tekst = $this->skroc($tekst,400);
  115. echo $tekst.'</p>';
  116. echo '</div></td></tr></table>';
  117. }
  118. }
  119.  
  120. }
  121. ?>
  122.  


Czy sądzicie że dobrze zaczynam? Czy to jest programowanie obiektowe, czy tylko pseudo-obiektowe? Co muszę poprawić, na co zwrócić uwagęquestionmark.gif
karolrynio
Zwróć uwagę na to żeby oddzielić warstwe prezentacji od pobierania i przetwarzania danych....
Czyli do klasy ładujesz metody które służą do pobierania danych, a nie do ich wyświetlania, np:
  1. funtion get_news ($id) {
  2. $sql = "SELECT * FROM rada_news WHERE akcept=1 AND id=".(int)$id;
  3. $result = mysql_query($sql);
  4. $row = mysql_fetch_array($result);
  5. return $row;
  6. }
skowron-line
Cytat(barii @ 14.04.2010, 21:30:33 ) *
Czy sądzicie że dobrze zaczynam? Czy to jest programowanie obiektowe, czy tylko pseudo-obiektowe? Co muszę poprawić, na co zwrócić uwagęquestionmark.gif


No niestety jest to do bani.
- to co próbowałeś napisać to php4, zainteresuj się php5
- jak kolega napisał wyżej wzorzec MVC
barii
... a można powiedzieć chociaż że to co napisałem jest zalążkiem programowania obiektowego??

Akurat wykorzystałem tę moją klasę do implementacji strony i wszystko działa. Jakie są konsekwencje takiej implementacji. Są poważne zagrożenia dla bezpieczeństwa albo poprawnego działania?
Pilsener
Napisze jasno: Twoja klasa to nic innego, jak zwykły, przestarzały, prowizoryczny, amatorski itp. itd. etc. skrypt, który wyróżnia się tylko tym, że został upakowany w klamry poprzedzone słowem kluczowym "class" i podzielony na funkcje. Powiem więcej - klasa wręcz utrudnia utrzymanie takiego kodu! Lepszy logiczny kod strukturalny, niż obiektowa sieka bez ładu i składu!

Odpowiedz sobie na pytania:
- jaka jest przewaga/zaleta tego kodu w porównaniu z identycznym, lecz nie podzielonym na klasę i funkcje?
- czy zaimplementowanie tej klasy do obsługi artykułów w serwisie x.com będzie łatwe, czy trudne?
- albo inaczej, który kod jest lepszy:
  1. //Twój:
  2. function pokaz(){
  3. echo '<p>Tekst</p>';
  4. }
  5. pokaz();
  6.  
  7. //Mój:
  8. echo '<p>Tekst</p>';


Masz pisać aplikacje na warstwach:
1. Odbierasz dane i parametry z url, post, cfg
2. Przygotowujesz treść i meta (często używa się tu nazwy silnik - to zasadnicza część aplikacji, nie zawiera kodu html)
3. Upychasz to w kod html
4. Wysyłasz stronę do przeglądarki

Jaki sens pisać klasę czy funkcję, która drukuje coś na ekranie?? Na początek wywal z silnika chociaż echo i html, poczytaj trochę o obiektówce, wykorzystaj wzorce i dziedziczenie, konstruktory, metody dostępowe i wiele innych zalet obiektówki.
barii
Czyli np. komunikaty robić:

1. wpisać do zmiennej

  1. private function przyklad(){
  2. // kod coś robiący
  3. $this->info.='info błędu';
  4. }


2. a potem dopiero w innej metodzie czy klasie zrobić wyświetlenie zmiennej $info questionmark.gif
Crozin
Jeżeli jakaś metoda nie może zakończyć się poprawnie powinna wyrzucić wyjątek.
barii
ok. Musze poczytać o tych wyjątkach jeszcze. Ale czy teraz zacząłem lepiej kumać. W funkcji która jest silnikiem mam robić przypisania do zmiennych a potem dopiero w innych funkcjach korzystać z tych danych ?
Pilsener
Tak. I podzielić to funkcjonalnie:
1. Obróbka parametrów, generowanie meta-tagów, słów kluczowych etc.
2. Model danych - tu będą zapytania do bazy
3. Widok - w najprostszej postaci system szablonów via PHP:
  1. <h4>Artykuły</h4>
  2. <p>
  3. <?php
  4. echo $this->$tresc;
  5. ?>
  6. </p><p>
  7. <?php
  8. echo $this->$data_dodania;
  9. ?>
- w ten sposób obsługa i walidacja parametrów/adresów/konfigów jest w jednym miejscu (czyli całe "wejście"), zapytania do bazy w drugim a kod html w trzecim, oczywiście łączy to kontroler, który na podstawie otrzymanych parametrów korzysta z określonych modeli danych, pakuje pobraną przy ich pomocy treść w zmienne i wysyła do widoku - w ten sposób powstaje przejrzysty kod łatwy w utrzymaniu i rozbudowie.
barii
...czyli każdą warstwę mam podzielić na osobną klasę? Czy wystarczy jak podzielę na metody...?
Pilsener
Zależy jak to ma funkcjonować, integralna część jakiejś większej aplikacji czy tylko moduł do niej? Najlepiej każdą warstwę w oddzielnym pliku, a jeden plik = jedna klasa/funkcja (nazwa pliku = nazwa klasy/funkcji), dzięki czemu każdy od razu połapie się w kodzie, będzie to łatwe do rozbudowy/modyfikacji czy implementacji.
smentek
Ok ja tez się dorzucę. Jest to programowanie pseudo obiektowe. Ale bardzo dobrze, że próbujesz nie od razu Rzym zbudowano, z czasem Twój kod będzie dużo lepszy.

Twój kod niestety nie jest kodem obiektowym. I można to stwierdzić to zanim nawet człowiek spojrzy na pierwszą jego linijkę. Dobry obiekt ma bardzo wąska odpowiedzialnośc a Ty już na wstępie piszesz:

Cytat
Napisałem sobie pierwszą klasę, która ma być odpowiedzialna za obsługę artykułów (tworzenie newsów, kategorii, administrację)


Za dużo odpowiedzialności, zresztą wyimaginowanej bo Twój obiekt w najlepszym razie odpowiada za dostęp do danych i za nic więcej. Jest to nieprzemyślana hybryda Active Record z wmieszanymi elementami prezentacji danych. Fuj! smile.gif

Zainteresuj się MVC, a póki co, może zrób z tego co masz dwa obiekty niech jeden pobiera dane a drugi wyświetla dane które pobrał pierwszy.

I jeszcze uwaga:
Crozin:
Cytat
Jeżeli jakaś metoda nie może zakończyć się poprawnie powinna wyrzucić wyjątek.


To nie jest prawda... Prawdziwsze jest stwierdzenie:

Jeżeli wykonywanie jakiejś metody może zakończyć się błędem, przy czym jest to błąd, nad którym programista piszący dany kod nie ma kontroli (np. kod korzysta z zasobów zewnętrznych, które mogą być niedostępne) to należy wyrzucić wyjątek (obsłużony w innym miejscu programu).

Panie Crozin, warto chyba ubrać to co się chce powiedzieć w parę zdań tak aby to miało ręce i nogi, a nie rzucać sentencje w tylu "Jak się jest głodnym to trzeba zjeść"...
Crozin
Cytat
o nie jest prawda... Prawdziwsze jest stwierdzenie:

Jeżeli wykonywanie jakiejś metody może zakończyć się błędem, przy czym jest to błąd, nad którym programista piszący dany kod nie ma kontroli (np. kod korzysta z zasobów zewnętrznych, które mogą być niedostępne) to należy wyrzucić wyjątek (obsłużony w innym miejscu programu).

Panie Crozin, warto chyba ubrać to co się chce powiedzieć w parę zdań tak aby to miało ręce i nogi, a nie rzucać sentencje w tylu "Jak się jest głodnym to trzeba zjeść"...
Tak na dobrą sprawę to to co napisałeś jest dokładnie tym samym co podałem ja.

A sentencja "głodny -> zjedz coś" jest przecież jak najbardziej poprawna. Nie ma sensu się rozpisywać co to znaczy być głodnym, ani co to znaczy zjeść coś. Jak odbiorca nie będzie czegoś pewny to sobie wygooglea albo poprosi o doprecyzowanie odpowiedzi.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2024 Invision Power Services, Inc.