On 9/13/2016 11:38 PM, Mathieu Rochette wrote:
> I agree that blocking clone seems unnecessary. I also don't see why it
> is useful to have "clone" methods. Why not let "clone $this" produce a
> copy that is open to modification within the scope it's cloned in ? or,
> why would you limit yourself to one clone per method call ? maybe there
> is something I'm missing but I don't get why introducing a new method
> annotation is useful. it looks like an implementation details (using
> clone instead of new) of the method is leaking
>
> class Natural {
> private $n;
> public function __construct(int $n) {assert($n >= 0); $this->n = $n;}
> public function nextTen() {
> for ($i = 0, $c = $this; $i < 10; $i++, $c = clone $c;) {
> $c->n++;
> yield $c;
> }
> }
> }
Why would you want to clone here?
final immutable class NaturalNumber {
private $n;
public function __construct(int $n) {
assert($n >= 0);
$this->n = $n;
}
public function nextTen($n) {
for ($i = $this->n; $i < 10; ++$i) {
yield new static($i);
}
}
}
That being said, the whole example is kind of weird. What kind of
functionality is that? Why is a value object creating multiple instances
for itself? Single responsibility seems to be broken because some kind
of collection should take care of that anyways.
final immutable class NaturalNumber {
private $n;
public function __construct(int $n) {/*...*/}
public clone function add(int $n) {
$this->n += $n;
return $this;
}
}
final class NaturalNumberCollection {
public function nextTen(NaturalNumber $start) {
// This cast does not work (yet) ...
for ($i = (int) $start; $i < 10; ++$i) {
yield $start->add($i);
}
}
}
Same result but we just separated things nicely. I think the clone
modifier would help to create better code and keep it easy to understand.
On 9/13/2016 11:38 PM, Mathieu Rochette wrote:
> again, why mark method as clone method in an interface, if the interface
> is already marked as immutable isn't it enough to specify the return
> type "static" ?
Because it is unclear if you want to mutate in this context or return a
new instance altogether.
--
Richard "Fleshgrinder" Fussenegger
signature.asc
Description: OpenPGP digital signature
