Witam a więc mam dość nietypowy a zarazem poważny problem .Chodzi mi o to ze duża liczba osób [profesorowie, koledzy programiści itd] zwraca mi uwagę ze dobrze znam i umiem sie posługiwać oop , tylko moim czarnym kotem są argumenty metod , tzn nie wiem w jakiej chwili i kiedy mam zdeklarować jakaś zmienną jako argument metody
i dlaczego mam tak postępować .Po prostu nie mogę tego zał pac moi profesorowie mówią ze to kwestia czasu [wyczucia] i ze dużo osób ma z tym problem .Dobrze może ma racje czas ale pisze już w php i javie obiektowo może z 7 miesięcy, myślę ze to nie mało ani nie dużo ale umiem sie posługiwać oop w miarę dobrze , nie mogę powiedzieć ze perfekcyjnie bo do tego trzeba doświadczenia i to kilku letniego .Może wy wiecie dlaczego tak sie dzieje ?,macie jakieś sugestie ?.Mam nadzieje ze ktoś mi opisze ten problem w miarę dobrze , mogą też być przykłady .I proszę nie odsyłać do innycg stron bo wszystkie które były możliwe już przeczytałem
A mozesz podac przyklady tego zlego 'argumentowania'? Bo jakos nie moge zaczaic do konca o jaki rodzaj problemu Ci chodzi.
Zerknij na to http://forum.php.pl/OOP_Problem_z__klasa___resjestracji_t78091.html
,będziesz wiedział o co mi chodzi tak do końca tak samo
to
#include <iostream.h>
int wczytaj(int arg) {
int L;
cout << "Cześć! Tu funkcja wczytaj(int arg)." << endl;
cout << "Wywołana zostałam z liczbą o wartości: " << arg;
cout << endl << "Podaj liczbę: ";
cin >> L;
cout << "Wczytałam ją do lokalnej zmiennej L" << endl;
cout << "Zwracam iloczyn arg*L" << endl;
}
Chodzi mi o to ze podobno zle robie ze nie których zmiennych lub właściwości nie podaje jako argument jakies metody , ale z skąd mam wiedzieć kiedy mam ją tam dać i po co tego właśnie nie rozumie .Myślę ze pomożecie </u>
O tutaj podam taki przykład
<?php
class ShopProduct {
public $title;
public $producerMainName;
public $producerFirstName;
private $price;
public $discount = 0;
function __construct( $title, $firstName,
$mainName, $price,
$numPages=0, $playLength=0 ) {
$this->title = $title;
$this->producerFirstName = $firstName;
$this->producerMainName = $mainName;
$this->price = $price;
}
function setDiscount( $num) { /// Co to da ? czy ja w metodzie dam jako argument $num czy ja go nie dam to tak ta klasa działa
$this->discount=$num;
}
function getPrice() {
return ($this->price - $this->discount);
}
function getProducer() {
return "{$this->producerFirstName}".
" {$this->producerMainName}";
}
function getProductXml() {
// pusta implementacja
}
}
class CdProduct extends ShopProduct {
public $playLength = 0;
function __construct( $title, $firstName,
$mainName, $price, $playLength ) {
parent::__construct( $title, $firstName,
$mainName, $price );
$this->playLength = $playLength;
}
function getPlayLength() {
return $this->playLength;
}
function getProductXml() {
return '<product type="cd" />';
}
}
class BookProduct extends ShopProduct {
public $numPages = 0;
function __construct( $title, $firstName,
$mainName, $price, $numPages ) {
parent::__construct( $title, $firstName,
$mainName, $price );
$this->numPages = $numPages;
}
function getProducer() {
return strToUpper( parent::getProducer() );
}
function getNumberOfPages() {
return $this->numPages;
}
function getProductXml() {
return '<product type="książka" />';
}
}
$product1 = new BookProduct( "Moja Antonia", "Willa", "Cather", 59.99, 300 );
$product2 = new CdProduct( "Exile on Coldharbour Lane",
"The", "Alabama 3", 25.99, 60.33 );
$product1->setDiscount( 1 );
print $product1->getPrice();
print "\n";
$product1->price;
print "Cena wynosi $product1->price\n";
print "\n";
print "Autor: ".$product1->getProducer()."\n";
print "Liczba stron: ".$product1->getNumberOfPages()."\n";
print "Wykonawca: ".$product2->getProducer()."\n";
print "Czas nagrania: ".$product2->getPlayLength()."\n";
function setDiscount( $num) { /// Co to da ? czy ja w metodzie dam jako argument $num czy ja go nie dam to tak ta klasa działa
$this->discount=$num;
}
O to mi mniej więcej chodzi
albo ni eumiesz wyrazic co masz na mysli, albo Ci sie cos pokaszanilo totalnie..
patrzac na setter:
function setDiscount( $num) {
$this->discount=$num;
}
to jak ten setter moglby dzialac bez tego parametru..?
function setDiscount( /*bez*/) {
$this->discount= ?ile?;
}
a moze nie chodzi Ci o parametry metody (tu: $num w setterze setDiscount) tylko chodzi Ci o sens istnienia tego settera? sens jest taki, ze piszac w ten sposob, dostarczasz obiektowi mozliwosci reakcji probe zmiany jego zmiennych - np. wyswietlenie komunikatu, sprawdzenie poprawnosic nowej wartosci itp. oczywiscie bedzie tak, tylko jesli wszyscy uzytkownicy obiektu beda mili i ni ebeda uzywali bezposredniego dostepu do zmiennej $discount. U Ciebie ta zmienna jest publiczna i az sie prosi zeby ja ruszac z pominieciem settera. powinna byc prywatna - wtedy kazda operacja na niej bedzie przechodzic przez getter/setter.
...a jesli taka reakcje/testwartosci/itp nie sa wymagane, to rzeczywiscie ta zmienna moze sobie byc publiczna i wtedy, uwaga, istnienie zarowno getterow jak i setterow calkowicie traci sens i nie ma co sie meczyc w generowanie szablonowych get/setX ktore jedynie a slepo cos przekazuja dalej. jak Ci profesorzy nawet w takich przypadkach kaza to robic, no to coz.. sluchaj i rob poki musisz. potem rob rozsadnie.