Ik had een class in pseudo code, als volgt:
<?php
class Foo {
private $locked;
public function foo () {
if ($this->locked) throw Exception('class is locked');
}
public function is_locked() {
return $this->locked;
}
}
?>
Toen bedacht ik vandaag... is het wel correct dat foo() rechtstreeks de locked property aanspreekt. Ligt de verantwoordelijkheid of de class gelockt is niet bij is_locked()? Stel bijv. dat in de toekomst het niet alleen van de property locked afhangt, maar ook nog van een andere variabele, dan werkt de code niet meer zoals het zou moeten. Zou het daarom niet zo moeten, vroeg ik me af?
<?php
class Foo {
private $locked;
public function foo () {
if ($this->is_locked()) throw Exception('class is locked');
}
public function is_locked() {
return $this->locked;
}
}
?>
Op zich zou je denken dat dit beter is, omdat nu daadwerkelijk is_locked bepaalt of de class op slot zit.
Maar... als je die lijn doortrekt, dan zou je dus ook niet dit krijgen...
<?php
class Data {
private $data;
public function foo() {
if (isset($this->data['foo'])) // doe iets;
}
public function has($id) {
return isset($this->data[$id]);
}
}
?>
Maar dit...
<?php
class Data {
private $data;
public function foo() {
if ($this->has('foo')) // doe iets;
}
public function has($id) {
return isset($this->data[$id]);
}
}
?>
Immers, de verantwoordelijkheid of iets bestaat hebben we bij has() neergelegd.
Trek je deze lijn nog verder door, dan zou je niet dit krijgen...
<?php
class Data {
private $data;
public function count() {
return count($this->data);
}
public function foo() {
if (count($this->data) > 3) // doe iets;
}
}
?>
Maar dit...
<?php
class Data {
private $data;
public function count() {
return count($this->data);
}
public function foo() {
if ($this->count() > 3) // doe iets;
}
}
?>
Maar sla je dan niet te ver door vraag ik me af? Wie kan er iets zinnigs over zeggen?
2.580 views