Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Poczuc OOP - zakladanie bazy firm
Forum PHP.pl > Forum > PHP > Object-oriented programming
wojckr
Witam,
postaram się pisać zwięźle i na temat.
Dotychczas projektowalem proceduralnie. Zapoznalem sie z odstawiami i filozofia OOP. Jednak jeszcze tego nie "czuje".
Chcę stworzyć bazę firm przy użyciu OOP. Nie wiem czy dobrze mysle, ale obiektem bylaby firma, ktora mialaby swoja nazwe, adres,telefon itd.(własciwosci), a firme ta moznaby bylo dodawac, usuwac, edytowac i wyswietlac (metody).
Sprobowalem projektowac klase, ale zauwazylem, ze wrzucam funkcje do klasy i w zasadzie proceduralnie zrobilbym to chyba szybciej...

Czy mozecie podpowiedziec jako doswiadczeni w OOP, jak zabralibyscie sie do tworzenia takiej bazy firm z uzyciem OOP i czy do tego wystarczy jedna klasa czy wiecej niz jedna?

Dzieki wielkie z gory za wskazowki (mam wrazenie, ze potrzebuje kilku wskazowek, a potem pojdzie z gorki).
kicaj
Wklej tutaj to co dotychczas zrobiles, podpowiemy co zmienic, poprawic, tak by bylo to OOP:)
dr_bonzo
1. skoro sie uczysz czegos nowego to bedziesz to robil N razy wolniej niz znana tobie metoda
2.uzyj jakiego frameworka, pozostanie ci tylko zamodelowanie dziedziny (danych o firmach) + kontrolery/html
3. opisz wiecej co chcesz zrobic, bo baza firm w najprostszej postaci to jedna klasa : Firma, a mozesz miec np. branże itd.
wojckr
Dzięki za pierwsze wskazowki :-)

Za frameworki zabiore sie innym razem, na razie chce pojąć OOP, a N razy wolniejsze robienie to fakt, ale może zaprocentuje?

Wklejam _wstępny_szkielet_ klasy:

  1. <?
  2.  
  3. include '../53/mysqlconn.inc.php';
  4.  
  5. class firma {
  6. public $id;
  7. public $nazwa;
  8. public $adres;
  9. public $telefon;
  10.  
  11. function __construct() {
  12. $sql=mysql_query("SELECT * FROM firmy LIMIT 1 ;");
  13. if (mysql_num_rows($sql)>0) {
  14. $row=mysql_fetch_assoc($sql);
  15. $this->id = $row['id'];
  16. $this->nazwa = $row['nazwa'];
  17. $this->adres = $row['adres'];
  18. $this->telefon = $row['telefon'];
  19. } else {
  20. echo 'Brak firm.';
  21. }
  22. }
  23.  
  24. function dodajFirme() {
  25. //pomijam walidację (a moze powinno się już tearaz ją uwzględnić?)
  26. if (mysql_query("INSERT INTO firmy SET nazwa='".$this->nazwa."', adres='".$this->adres."', telefon='".$this->telefon."' ;")) {
  27. echo 'Dodano firme';
  28. } else {
  29. echo 'Nie dodano firmy';
  30. }
  31. }
  32.  
  33. function updateFirmy() {
  34. if (mysql_query("UPDATE firmy SET nazwa='".$this->nazwa."', adres='".$this->adres."', telefon='".$this->telefon."' WHERE id=".$this->id." ;")) {
  35. echo 'Uaktualniono firmę.';
  36. } else {
  37. echo 'Nie uaktualniono firmy.';
  38. }
  39. }
  40.  
  41. function usunFirme() {
  42. if (mysql_query("DELETE FROM firmy WHERE id=".$this->id." ;")) {
  43. echo 'Firma usunieta.';
  44. } else {
  45. echo 'Firma nie usunieta.';
  46. }
  47. }
  48.  
  49. function pokazFirme() {
  50. echo '<LI>Nazwa: '.$this->nazwa;
  51. echo '<LI>Adres: '.$this->adres;
  52. echo '<LI>Telefon: '.$this->telefon;
  53. }
  54.  
  55. function formFirma() {
  56. echo '<form action="" method="post">';
  57. echo '<input type="hidden" name="id" value="'.$this->id.'"><BR>';
  58. echo 'Nazwa: <input type="text" name="nazwa" value="'.$this->nazwa.'"><BR>';
  59. echo 'Adres: <input type="text" name="adres" value="'.$this->adres.'"><BR>';
  60. echo 'Telefon: <input type="text" name="telefon" value="'.$this->telefon.'"><BR>';
  61. echo '<input type="submit" value="dodaj" name="formFirma">';
  62. echo '<input type="submit" value="usun" name="formFirmaUsun">';
  63. echo '</form>';
  64. }
  65. }
  66.  
  67. $firmaA = new firma;
  68.  
  69. if (isset($_POST['formFirma']) and $_POST['id']=='') {
  70. $firmaA->nazwa=$_POST['nazwa'];
  71. $firmaA->adres=$_POST['adres'];
  72. $firmaA->telefon=$_POST['telefon'];
  73. $firmaA->dodajFirme();
  74. } elseif (isset($_POST['formFirma']) and $_POST['id']!='') {
  75. $fimraA->id=$_POST['id'];
  76. $firmaA->nazwa=$_POST['nazwa'];
  77. $firmaA->adres=$_POST['adres'];
  78. $firmaA->telefon=$_POST['telefon'];
  79. $firmaA->updateFirmy();
  80. } elseif (isset($_POST['formFirmaUsun']) and $_POST['id']!='') {
  81. $fimraA->id=$_POST['id'];
  82. $firmaA->usunFirme();
  83. } else {
  84. $firmaA->pokazFirme();
  85. $firmaA->formFirma();
  86. }
  87.  
  88.  
  89. ?>



Co do tego co chcę zrobić, to moje założenia:
1. Firmy podzielone na branze: branzaGlowna1 skladajaca sie z podBranzy1, podBranzy2 itd. (na razie dwa poziomy, ale potem bycmoze podbranze beda sie skaldac z podpodbranz), branzaGlowna2, 3, 4 itd.
2. Na stronie wyswietlają się branże główne i podbranże. Po kliknieciu na najniższy poziom (teraz podBranza, np. na podBranza3 branzyGlownej7) pokazuje sie lista firm z danej podbranzy.
3. Po kliknieciu na firme, pokazują się szczegolowe dane o firmie.
4. Teraz mozna edytować dane o tej firmie lub usunąć.
5. Po edycji/usunięciu w panelu administracyjnym zatwierdzam lub nie, ew. coś jeszcze poprawiam, jesli byla edycja. ALBO Jesli byla zalogowana uprawniona osoba, to wprowadzone zmiany od razu sa widoczne na stronie.

6. Jest też możliwość dodania firmy z dowolnego miejsca strony (czy uzytkownik jest na str glownej, czy w jakiejs branzy to moze z tego poziomu dodawac firme).


Oto co chcę zrobić. Zagadką dla mnie jest jakie korzyści osiągnę robiąc taką bazę firm w OOP ?
Hacker
Dobrze by było jakby konstruktor pobierał id (__construct($id = 0)) i jak jest 0 to nie pobiera nic...
Początek klasy wygląda tak, jakbyś chciał dla każdej firmy tworzyć nowy obiekt (dobre podejście), ale potem... zrób zamiast dodajFirme i updateFirmy metodę save.
Pole $id powinno być private lub protected jak będziesz dziedziczył po tej klasie.
Echo w klasie nie wygląda zbyt ładnie... Może smarty? I pamiętaj przy tym, żeby nie klasa assignowała...
Patrząc na (X)HTML to najpierw piszesz <LI>, a potem <form>. Pisz wszystko małymi literami jak nowe standardy wymagają!
Sedziwoj
Cytat(Hacker @ 7.05.2007, 09:08:30 ) *
Pisz wszystko małymi literami jak nowe standardy wymagają!

Nowe standardy wymają małym, jak również zamykanie każdego taga, jak również umieszczenie w jakiejś konstrukcji a nie bezpośrednio po <form>... i pewnie parę innych rzeczy.

Co do użycia Smarty, to raczej MVC niż OOP, ale też bym sugerował zastosowanie MVC, bo kod staje się o wiele czytelniejszy.

Co do konstruktora, to jeśli nie zawsze mają być pobierane dane z bazy, to niech to nie będzie robione w konstruktorze.
Do tego nie tylko właściwości/atrybuty mają 'uprawnienia dostępu', ale również metody.
Nigdzie nie sprawdzasz, czy też nie inicjujesz połączenia z bazą. (i znów można by się czepić brak MVC...) ale również dane pobierane od użytkownika powinny być sprawdzane.

EDIT: lit.
Hacker
@Sedziwoj nie czepiałem się już tak dokładnie (X)HTML-a, tylko zauważyłem to, że wojckr nie trzyma się konwencji raz pisze dużymi raz małymi...
Jakby nie miały być pobierane dane w konstruktorze to __get, __set lub/i gettery i settery (żeby wszyscy łącznie z mike_mechem byli zadowoleni tongue.gif)


---
tongue.gif
~mike_mech
Cysiaczek
Zaprezentowałeś klasyczny przykład ujęcia kodu proceduralnego w klasie. Programowanie obiektowe to nie tylko klasy z kodem, ale przede wszystkim relacje pomiędzy obiektami. Obiekt firma może składać się z kilku obiektów, zwłaszcza a Twoim przykładzie, w którym wydzielasz funkcje zapisujące i odtwarzające dane z bazy.
Każda klasa powinna mieć ściśle wydzielone zadanie. Twoja tego nie ma, bo:
1. Obsługuje bazę danych
2. Wypisuje informacje dla użytkownika
3. Przechowuje informacje (o firmie)
4. Sama siebie kontroluje.

Widzę tu co najmniej 3 obiekty.

Również logika nieco szwankuje, bo jeśli za nią pójść, to obiekt Człowiek powinien mieć takie metody:
  1. <?php
  2. $człowiek= new Czlowiek('cysiaczek');
  3. $czlowiek->dodajCzlowiek('wojckr');
  4. $czlowiek->wypiszCzlowiek();// a może wypiszCzlowieki() ?
  5. ?>

Krótko mówiąc - nie ma to ani rąk, ani nóg.
Tu pomoże dobra książka na temat projektowania, do czego Cię zachęcam.

Małe propozycje:
1. Patrz na obiekty również pod kątem ich użytkowników (kodu, który je użytkuje)
2. Metody powinny zwracać wartości do użytkownika

Pozdrawiam. : )

P.S
Na pocieszenie napiszę, że jedna z moich klas o nazwie News dziedziczyła po obiekcie Pager, który odpowiadał za łamanie stron wyników tongue.gif
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-2025 Invision Power Services, Inc.