Temat: Przekazanie wartości do zmiennej w klasie.
Michał Wachowski:
Wracając do tematu:
A co powiesz na taki zapis (bo w cytowanym przez ciebie fragmencie strzeliłem gafę)
$bar->setValue( $Decimal->getValue() );
Według mnie, nie ma potrzeby takiego zapisu. "$Decimal->getValue()" może być wywołany w "$bar->setValue()". Taki zapis jak wyżej dalej powoduje problemy w klasie Gamma, bo uzależnia ją od integerów. Lepiej przekazać obiekt (referencję), a klasa już sobie sama wybierze co jej potrzeba.
Tak sądzę.
Chociaż masz rację, że Twój przykład usuwa zależność klasy Bar od klas pochodnych Number. Zapewne takie rozwiązanie jak Twoje również ma zalety - właśnie jeśli nie chcemy uzależniać klas od siebie.
Kilka moich wniosków, na temat czemu warto mieć gettery i settery:
- gettery bo PHP nie umożliwia rzutowania obiektów na cokolwiek innego jak array i string.
- settery bo można zwracać $this i mamy ładne method chaining
Też tak można, ale... -> (1)
Generalnie po serii prób i błędów, słucham się sprawdzonych metod ;) Ze zrozumieniem oczywiście. Jeśli settery/gettery byłyby niepotrzebne, to nikt by ich nie stosował na taką skalę ;) Chociaż też bym wolał jedno głupie słowo kluczowe "property", albo coś w tym stylu (jak np. w AS3 - to jedna z niewielu dobrych cech tego języka).
(1) -> ...ale metoda powinna w idealnym przypadku jedną rzecz. Więc jeśli setter coś zwraca, to już są dwie rzeczy. Oczywiście aby stworzyć takie ładne łańcuszki w np. Builderach to się stosuje - tylko trzeba chyba pamiętać, aby tego nie nadużywać. Powód prosty: jeśli metoda ma dwa powody do zmiany a nie jeden, to mamy 2x więcej możliwości popełnienia błędu ;)
Taki chaining fajnie jednak wygląda i bywa praktyczny.
W PHP, przez wzgląd na pokazany już przykład:
class A
{
public $x;
}
class B extends A
{
function __set($attr, $value)
{
echo '!!!!';
}
}
$b = new B();
$b->x = 5;
lepiej stosować rozwiązania z Javy, a wszelkie magiczne metody traktować jako bonus ;)
Prawdę mówiąc ma deja vu, mówiące mi, że się mylę, więc czekam na wytknięcie mi błędu ;)
//EDIT: Tak ogólnie, to wszystko jest dobre, jeśli jest stosowane w odpowiednim miejscu i czasie ;) Jestem jednak za tym, aby niektóre rozwiązania były stosowane częściej, a inne rzadziej ;)
Łukasz Karpuć edytował(a) ten post dnia 12.01.11 o godzinie 23:13