Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][oop] dlacze tak sie pisze....
Forum PHP.pl > Forum > PHP > Object-oriented programming
terabit
Witam,

ucze się oop...
i nasunęło mi się takie pytanie:

Dlaczego powinno się (chyba) pisać tak:

  1. <?php
  2. $model = new Nazwa_Modelu;
  3. $model -> text = $text;
  4. $model -> nazwa = $nazwa;
  5. $model -> dodaj_strone();
  6. ?>


czy nie wystarczy po prostu

  1. <?php
  2. $model = new Nazwa_Modelu;
  3. $modle = dodaj_strone($text, $nazwa);
  4. ?>


czy może chodzi o to że powinno się wszystko rozbijać na jak najmniejsze części (medy, classy) i każda mała część jest tylko za jedną rzecz odpowiedzialna?
Shili
Możesz i w jeden i w drugi sposób. Zależy ściśle od tego co chcesz zrobić.

Jaka jest zaleta drugiego przykładu - w pierwszym nie możesz kontrolować co zostaje wpisane do właściwości klasy przy jej wpisaniu, może się tam znaleźć największa bzdura, a przekazując dane do metody spokojnie możesz je już na wstępie walidować.
wookieb
Jak już to tak
Kod
$model = new Nazwa_Modelu;
$model->dodaj_strone($text, $nazwa);

Ale to wszystko zalezy co to za klasa i co ona ma robic. Jezeli liczba parametrow jest cholernie dluga wiec warto robic 1 metoda.
terabit
Cytat(Shili @ 14.08.2008, 13:50:38 ) *
Możesz i w jeden i w drugi sposób. Zależy ściśle od tego co chcesz zrobić.

Jaka jest zaleta drugiego przykładu - w pierwszym nie możesz kontrolować co zostaje wpisane do właściwości klasy przy jej wpisaniu, może się tam znaleźć największa bzdura, a przekazując dane do metody spokojnie możesz je już na wstępie walidować.


a tak:
  1. <?php
  2. $model = new Nazwa_Modelu;
  3. $model -> text($text);
  4. $model -> nazwa($nazwa);
  5. $model -> dodaj();
  6. ?>


i np teraz w metodzie text i nazwa moge sobie sprawdzac czy wszystko ok winksmiley.jpg
Shili
Możesz i jak najbardziej jest to jedna z używanych metod. Oczywiście w tym momencie warto właściwości klasy opisać jako chronione lub prywatne, żeby umożliwić ustawianie tylko poprzez odpowiednie metody.
Moli
Możesz w metodzie __set daj sprawdzanie poprawności smile.gif Wszystkie możliwości są prawidłowe, a to jak Ci będzie wygodniej pisać to musisz już sam sprawić smile.gif Ja np. wole dac
Kod
$class->set($nazwa,$wartosc);

niż rozbijać na oddzielne metody. A __set nie lubię jakoś smile.gif We własnej metodzie set mogę sobie tablice itp. ustawiać, więc mam większą kontrolę i większe możliwości smile.gif
wlamywacz
Pisze sie tak aby uniknąć wywołania metody z parametrami bo czasem sa cholernie długie, po drugie masz w jeden obiekcie wywołanie funkcji z tego samego obiektu to po co do każdej przekazywać usera w parametrze skoro można to zrobić tak:
  1. <?php
  2. $user = new users;
  3. $users->setUser(system::getLogined());
  4. //a nie tak
  5. $user->getUser(system::getLogined(), $model->getJakisModel($idjakies));
  6. $user->getInfo(system::getLogined(), 'type');
  7. //Bo takie długie molochy wychodzą
  8. ?>
Crozin
Przepraszam bardzo za mały OT, ale nie poraz pierwszy widze takie coś:
co oznacza wyraz Logined? Chodzi o Logged In?
wlamywacz
Ważne ze wiadomo o co chodzi smile.gif
Crozin
Nie chciałbym tu nikomu ubliżać, ale naukę programowania polecałbym od nauki podstaw języka angielskiego.

I nie ważne, że wiadomo o co chodzi - nie czepiam się literówki czy jakiegoś tam małego błędu gramatycznego, ale tworzenie nowego języka jest trochę dziwne.
.radex
Cytat(terabit @ 14.08.2008, 14:10:04 ) *
  1. <?php
  2. $model = new Nazwa_Modelu;
  3. $model -> text($text);
  4. $model -> nazwa($nazwa);
  5. $model -> dodaj();
  6. ?>


Jak najbardziej można, ale moim zdaniem jest to troszeczkę bez sensu. Rozbijanie wszystkiego na siłę na oddzielne funkcje składowe (metody) jest co najmniej dziwne - ani to szybkie (więcej kodu), ani funkcjonalne, użyteczne.

Cytat
Nie chciałbym tu nikomu ubliżać, ale naukę programowania polecałbym od nauki podstaw języka angielskiego.

I nie ważne, że wiadomo o co chodzi - nie czepiam się literówki czy jakiegoś tam małego błędu gramatycznego, ale tworzenie nowego języka jest trochę dziwne.


Daj spokój winksmiley.jpg
Sedziwoj
Cytat(.radex @ 16.08.2008, 21:56:30 ) *
Jak najbardziej można, ale moim zdaniem jest to troszeczkę bez sensu. Rozbijanie wszystkiego na siłę na oddzielne funkcje składowe (metody) jest co najmniej dziwne - ani to szybkie (więcej kodu), ani funkcjonalne, użyteczne.


Rozbicie ma sens, jeśli można wywołać jedną metodę, a drugą już nie, jeśli obie są wymagane na raz, to lepiej jest aby przyjmowały parę argumentów (ale też nie za dużo, jak więcej to znaczy, że inaczej trzeba to rozwiązać, np. przez obiekt z danymi). Więc to czy będzie dwie metody wywołane, czy jedna, zależy od tego jak dokładnie działają.
.radex
Cytat(Sedziwoj @ 18.08.2008, 16:16:34 ) *
Rozbicie ma sens, jeśli można wywołać jedną metodę, a drugą już nie, jeśli obie są wymagane na raz, to lepiej jest aby przyjmowały parę argumentów (ale też nie za dużo, jak więcej to znaczy, że inaczej trzeba to rozwiązać, np. przez obiekt z danymi). Więc to czy będzie dwie metody wywołane, czy jedna, zależy od tego jak dokładnie działają.


Hmm.. może Ciebie źle zrozumiałem, ale: pakowanie wszystkiego do jednej metody na siłę jest bez sensu, wtedy dużo lepiej dać to do kilku osobnych metod. To jest prawda, i jak rozumiem o tym właśnie mówisz. Natomiast przesyłanie argumentów przez osobne metody, jak tu:

  1. <?php
  2. $model = new Nazwa_Modelu;
  3. $model -> text($text);
  4. $model -> nazwa($nazwa);
  5. $model -> dodaj();
  6. ?>


to IMO kompletny nonsens. Zgodzisz się smile.gif ?

Obrazowo: jak chcesz zrobić pranie, to wkładasz brudną odzież do pralki i wsypujesz do niej jakiegoś persila, czy czegośtam, czy może dzwonisz do jednego specjalisty, żeby wrzucił pranie, do drugiego żeby wsypał proszek, a na końcu dopiero włączasz pralkę :] ? Takie moje zdanie tongue.gif
wlamywacz
Nie jest! Masz klasę np. comments a w niej funkcje: add i get. Kazda potrzebuje do działania id newsa dla którego ma operować wystarczy:
  1. <?php
  2. $comments->setIdnews($this->param3);
  3. ?>

niz za kazdym razem:
  1. <?php
  2. $comments->get($this->param3);
  3. $comments->add($this->param3, $content);
  4. ?>
Cysiaczek
Dlaczego nonsens? A jeśli chce zmienić tylko jedno pole?
.radex
Cytat(Cysiaczek @ 18.08.2008, 21:37:06 ) *
Dlaczego nonsens? A jeśli chce zmienić tylko jedno pole?

Cytat(wlamywacz @ 18.08.2008, 21:34:21 ) *
Nie jest! Masz klasę np. comments a w niej funkcje: add i get. Kazda potrzebuje do działania id newsa dla którego ma operować wystarczy:
  1. <?php
  2. $comments->setIdnews($this->param3);
  3. ?>

niz za kazdym razem:
  1. <?php
  2. $comments->get($this->param3);
  3. $comments->add($this->param3, $content);
  4. ?>


Też prawda. winksmiley.jpg Nie pomyślałem o tym w taki sposób tongue.gif
Sedziwoj
Cytat(.radex @ 18.08.2008, 17:41:27 ) *
Obrazowo: jak chcesz zrobić pranie, to wkładasz brudną odzież do pralki i wsypujesz do niej jakiegoś persila, czy czegośtam, czy może dzwonisz do jednego specjalisty, żeby wrzucił pranie, do drugiego żeby wsypał proszek, a na końcu dopiero włączasz pralkę :] ? Takie moje zdanie tongue.gif


A czy jak idziesz do swojego pokoju otwierasz wszystkie drzwi aby do niego wejść, czy tylko te co prowadzą do niego? Bo chyba nie ma sensu otwierać wszystkich jak chcesz tylko przez jedne przejść. To jest przykład kiedy mamy wiele metod, ale każda jest niezależna (w użyciu) od drugiej.
Crozin
  1. <?php
  2. $model = new Nazwa_Modelu;
  3. $model -> text($text);
  4. $model -> nazwa($nazwa);
  5. $model -> dodaj();
  6. ?>
Taki zapis jest wygodny gdy:
1) Możemy dodać wiele tekstów czy wiele nazw
2) Kod jest trochę rozrzucony
  1. <?php
  2. $model = new Nazwa_Modelu;
  3. //jakis kod, ktory nam cos tam pobiera
  4. $model->text($text);
  5. //znowu jakis kod, ktory robic cos zupelnie innego
  6. //i tu znowu cos tam
  7. $model->nazwa($nazwa);
  8. //cala reszta
  9. //by na koncu dac
  10. $model->dodaj();
  11. ?>
Jeżeli ma to być w "zwartym szyku" to można metodzie dodaj() dodać dwa parametry.
Cysiaczek
W praktyce, najczęściej łączy się oba sposoby. Np. w Propelu oprócz setterów i getterów jest też metoda fromArray().
Sedziwoj
Cytat(Crozin @ 19.08.2008, 13:05:42 ) *
Jeżeli ma to być w "zwartym szyku" to można metodzie dodaj() dodać dwa parametry.


No właśnie jest mowa o tym że nie zawsze chcesz podawać dwa parametry i wtedy to wychodzi dziwnie
  1. <?php
  2. $model->dodaj( $var1, null );
  3. ?>

Chodzi o to że np. jak edytujesz jakiś wpisz (AR) to przecież nie podajesz wszystkiego na raz, tylko pojedynczo, bo jak byś chciał zmienić status to nie ma sensu abyś musiał pisać resztę pól, tylko to potrzebne.
Co innego jak to ma być np. połączenie z Webservice, wtedy musisz podać adres, port, login, hasło, bo to jest konieczne do zainicjowania połączenia i zawsze muszę być wszystkie, i dlatego podaje się je jako argumenty jednej metody, czy też w konstruktorze.
Crozin
Nie bez powodu napisałem to można metodzie dodaj() dodać dwa parametry. winksmiley.jpg
Teoretycznie można dodać opcionalny argument, ale używanie metod typu
  1. <?php
  2. public function do Sth($param1 = null, $param2 = null, $param3 = null, $param4 = null, $param5 = null, $param6 = null){
  3. //...
  4. }
  5. ?>
To lekki masochizm.

Można też połączyć obie metody
  1. <?php
  2. class someClass{
  3. public function text($x){
  4. //..
  5. }
  6.  
  7. public function tytul($x){
  8. //..
  9. }
  10.  
  11. public function dodaj($x = null, $y = null){
  12. if($x !== null) $this->text($x);
  13. if($y !== null) $this->tytul($y);
  14.  
  15. //...
  16. }
  17. }
  18. ?>
Naprawdę wszystko zależy od konkretnego przypadku - i najlepiej gdyby autor podał konkret.
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.