Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> Tworzenie małych obiektów a funkcje proceduralne
stroju
post 29.11.2011, 13:42:04
Post #1





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


Zastanawiam się czy warto tworzyć małe klasy z kilkoma funkcjami zamiast tworzenia po prostu samych funkcji, jak choćby do wyświetlania komentarzy przy newsach czy artykułach, do generowania menu, do formatowania dat i czasu? Funkcje same w sobie spełniają założoną funkcjonalność jednak w obiekcie były by prostsze w użyciu i dawały większe możliwości manewrowania danymi, choć nie wiem czy takie rozwiązania nie były by wtedy bardziej obciążające dla samego serwera.

Jakieś rady od wprawionych już w boju??
Go to the top of the page
+Quote Post
Ilware
post 29.11.2011, 13:44:31
Post #2





Grupa: Zarejestrowani
Postów: 248
Pomógł: 31
Dołączył: 14.12.2010
Skąd: Wrocław

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


czy warto?To zleży od osoby, stylu pisania itp. Czy powinno się?Tak! Nawet dla klasy która ma tylko jedną metodę , ułatwia to bardzo czytanie kodu, robi go przejrzystym i łatwym do poprawy.


--------------------
Jeżeli pomogłem kliknij "Pomógł" :)
Go to the top of the page
+Quote Post
nospor
post 29.11.2011, 13:46:07
Post #3





Grupa: Moderatorzy
Postów: 36 477
Pomógł: 6301
Dołączył: 27.12.2004




Albo programujesz obiektowo albo proceduralnie.
Z tego co zrozumiałem używasz już klas do innych większych rzeczy, więc używaj klas w całości a nie raz a raz tak.


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
stroju
post 29.11.2011, 13:52:38
Post #4





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


Używam klas do większych rzeczy jak szablony styli, sesje, autoryzacja uprawnień. Nie wiem tylko jak później sobie poradzić w przekazywaniem tych klas mniejszych do większych, aby nie pogarszać wydajności w dużym stopniu..
Go to the top of the page
+Quote Post
by_ikar
post 29.11.2011, 14:57:40
Post #5





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Cytat(stroju @ 29.11.2011, 13:52:38 ) *
Używam klas do większych rzeczy jak szablony styli, sesje, autoryzacja uprawnień. Nie wiem tylko jak później sobie poradzić w przekazywaniem tych klas mniejszych do większych, aby nie pogarszać wydajności w dużym stopniu..


Od tego to już są wzorce projektowe. A tych metod jest kilka fajnych, chociażby ostatnio za sprawą symfony 2 popularne staje się dependency injection.

Tak jak napisał @nospor obiektówka to obiektówka, jeżeli masz kilka klas a reszta kodu jest strukturalna, to żadna to obiektówka. Tak jak niektórzy autorzy CMS'ów opisując swoje dzieło że ich cms jest full oop, a w gruncie rzeczy używają tylko kilku klas, z czego większość to pdo + mailer i już tworzą z tego obiektowy cms wink.gif

Małe klasy z kilkoma metodami warto tworzyć, możesz wtedy tą samą klasę wykorzystać w różny sposób.

Odnośnie wzorców, daleko nie szukając, praktycznie pod nosem: http://php.pl/Wortal/Artykuly/PHP/Architek...emow-w-praktyce wink.gif
Go to the top of the page
+Quote Post
stroju
post 29.11.2011, 19:03:36
Post #6





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


rozumiem, a jeszcze jedno pytanie, jak można wywołać takie działanie??
  1. $user->setData($data)->save();


bo gdyby to wyglądało tak:
  1. $user->setData->save();

no to wtedy wiadomo że przekazaliśmy sobie klasę setdata do user i wywołujemy save, ale tego pierwszego zapisu nie rozumiem, znaczy nie potrafię sobie wyobrazić jak wygląda struktura klas aby to zadziałało poprawnie a natrafiłem na taki przykład wykonania na jakiejś stronie..
Go to the top of the page
+Quote Post
Dipter
post 29.11.2011, 19:14:47
Post #7





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

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


  1. class Lancuch
  2. {
  3.  
  4. public function ala()
  5. {
  6. return $this;
  7. }
  8.  
  9. public function ma()
  10. {
  11. return $this;
  12. }
  13.  
  14. public function kota()
  15. {
  16. return $this;
  17. }
  18.  
  19. }
  20.  
  21. $lancuch = new Lancuch();
  22. $lancuch->ala()->ma()->kota();
  23.  


Po prostu w metodzie zwracasz obiekt klasy.
Go to the top of the page
+Quote Post
stroju
post 29.11.2011, 19:27:07
Post #8





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


czyli mówiąc dokładniej jeśli w funkcji ala np pobiorę dane użytkownika z bazy, i wrzucę w zmienną $this->data i zwrócę $this, to byłoby to równoznaczne z takim kodem:
  1. class class1
  2. {
  3.  
  4. public function get()
  5. {
  6.  
  7. }
  8.  
  9.  
  10. }
  11.  
  12. class class2
  13. {
  14. public $class1;
  15.  
  16. public function __construct($class1)
  17. {
  18. $this->class1 = $class1;
  19. }
  20.  
  21. public function set()
  22. {
  23.  
  24. }
  25.  
  26. }
  27.  
  28. $class1 = new class1;
  29.  
  30. $class2 = new class2($class1);
  31.  
  32. $class2->get()->set();


czy chodzi o coś innego??
Go to the top of the page
+Quote Post
Dipter
post 29.11.2011, 21:45:24
Post #9





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

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


Po pierwsze twój kod nawet nie zadziała. Żeby zrobić "ciąg" wykonywanych metod, w każdej z nich musisz zwracać jakiś obiekt, w twoim przypadku tej samej klasy.

W klasie masz metody save oraz setData. W metodzie setData ustawiasz dane i w metodzie zwracasz obiekt, a dalej możesz wykonywać inne operacje.

  1. class X
  2. {
  3.  
  4. private $data = array();
  5.  
  6. public function setData(array $data)
  7. {
  8. $this->data = $data;
  9.  
  10. return $this; // Zwracasz obiekt klasy X
  11. }
  12.  
  13. public function save()
  14. {
  15. // Zapis danych...
  16. }
  17.  
  18. }
  19.  
  20. $data = array('foo' => 'bar');
  21.  
  22. $x = new X();
  23. $x->setData($data)->save();
  24.  
Go to the top of the page
+Quote Post
stroju
post 29.11.2011, 21:57:07
Post #10





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


no tak zapomniałem return wsadzić.

czyli w Twoim przykładzie gdyby tego return nie było to można by ten sam efekt otrzymać w ten sposób??
  1. $data = array('foo' => 'bar');
  2.  
  3. $x = new X();
  4. $x->setData($data);
  5. $x->save();


jest jakaś znacząca różnica pomiędzy oboma przykładami?? co daje takie zwracanie obiektu??
Go to the top of the page
+Quote Post
Dipter
post 29.11.2011, 22:19:27
Post #11





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

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


Dokładnie tak, różnicą w tym przypadku może być wygoda pisania, zaoszczędzać parę linijek kodu tongue.gif
Go to the top of the page
+Quote Post
stroju
post 29.11.2011, 23:08:19
Post #12





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


rozumie, w sumie całkiem ciekawe zastosowanie smile.gif

a jest jakiś darmowy skrypt forum, cms itp napisany w 'całości' obiektowo??
Go to the top of the page
+Quote Post
Crozin
post 29.11.2011, 23:12:23
Post #13





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

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


W PHP nie ma niczego napisanego "w całości obiektowo", bo PHP nie jest językiem stricte obiektowym - jest językiem wieloparadygmatowym, a zdecydowana większość jego biblioteki standardowej jest strukturalna, więc siłą rzeczy zawsze znajdują się w nim elementy strukturalne.
Go to the top of the page
+Quote Post
stroju
post 29.11.2011, 23:16:48
Post #14





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


dlatego całości jest w cudzysłowu, a jakiś w dużym stopniu pisany obiektowo istnieje??
Go to the top of the page
+Quote Post
by_ikar
post 29.11.2011, 23:19:35
Post #15





Grupa: Zarejestrowani
Postów: 1 798
Pomógł: 307
Dołączył: 13.05.2009
Skąd: Gubin/Wrocław

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


Szukaj jakichś frameworków, takich jak symfony, zend, yii i tym podobne. Kilka cmsów obiektowych by się znalazło, ale przeważnie są to już napisane aplikacje z użyciem jakichś frameworków, jak chociażby ten cms: http://diem-project.org/ akurat napisanie cms'a kiedy ma się już framework to jest prosta sprawa, tak szczerze mówiąc wink.gif najważniejsze są podstawy które udostępnia ci dany framework, tworzenie później newsów, artykułów, forum itp to można w niektórych cms'ach wykonać na prawdę szybko, niektóre mają gotowe generatory, lub nawet gotowe pluginy, dzięki czemu napisanie jakiegoś blogaska to może być kwestia godzin.

Kod
$user->setData($data)->save();


nic innego jak method chaining: http://www.webnote.pl/method-chaining-w-php.html ciekawe, ale nie wszędzie dobrze jest to stosować, zależy tak na prawdę od tego czego chcesz od obiektu. Jeżeli powiedzmy przekazujesz do obiektu szereg danych, do różnych metod, to wtedy można bawić się w method chaining, ale wszędzie pchać tego raczej nie polecam wink.gif
Go to the top of the page
+Quote Post
stroju
post 30.11.2011, 00:06:32
Post #16





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


a jest jakiś poradnik żeby się w tym całym diem połapać, bo ciężko byłoby coś popróbować robić na ślepo a plików jest tam strasznie dużo..
Go to the top of the page
+Quote Post
Crozin
post 30.11.2011, 00:08:03
Post #17





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

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


1. Dokumentacja Symfony / ZF / jQuery.
2. Dokumentacja samego projektu.
Go to the top of the page
+Quote Post
stroju
post 30.11.2011, 16:48:33
Post #18





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


Mam jeszcze jedno pytanie. Posiadam klasę odpowiedzialną za szablony z kodem html, deklarowaną na początku kodu do zmiennej. Dotychczas używałem kilku funkcji aby tę klasę wykorzystać i wprowadzać zmienne w szablon, czyli wpisywałem w funkcji global $zmienna_szablonu i działąlo to poprawnie, jednak teraz chciałbym wsadzić klasę szablonu w inną klasę odpowiadającą za przetwarzanie samego widoku oraz generowanie tego co ma się pojawić np lista newsów, artykułów itd, no i nie wiem czy deklarować klasę szablonów na początku i przy deklarowaniu drugiej klasy wprowadzić wcześniej zadeklarowane szablony do tej drugiej klasy czy też zadeklarować w pliku np index.php tą drugą klasę i w środku drugiej deklarować dopiero szablony, oba rozwiązania dadzą ten sam efekt, choć z punktu konstrukcyjnego sporo się różnią..
Go to the top of the page
+Quote Post
Dipter
post 30.11.2011, 17:20:43
Post #19





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

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


Jeśli starasz się pisać "obiektowo", nie używaj czegoś takiego jak global. Skoro upierasz się przy szablonach, dlaczego nie skorzystasz chociażby z gotowych rozwiązań takich jak Twig czy Open Power Template? Ten pierwszy system jest już zespojony z Symfony2, więc jeśli tego frameworka zacząłbyś się uczyć masz wszystko na miejscu.
Go to the top of the page
+Quote Post
stroju
post 30.11.2011, 17:29:19
Post #20





Grupa: Zarejestrowani
Postów: 179
Pomógł: 2
Dołączył: 17.11.2005

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


No właśnie nie chcę używać global, stąd moje pytanie. Rozumiem jak możliwośći dają gotowe rozwiązania jednak stawiam sobie za cel przerobić już gotowy własny system napisany w dużej części proceduralnie na obiektowy, stąd moje pytania, bo dotychczas pisałem kilka klas głównych i w funkcjach wykorzystywałem ich zastosowania, a teraz chcę łączyć ze sobą klasy a nie wiem jak by to było najlepiej zrobić, czy takie ciągłe przekazywanie sobie obiektów w konstruktach nie jest zbyt obciążające dla samego przetworzenia przy wywoływaniu tych klas.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 5.06.2024 - 19:55