On Tue, Apr 19, 2016 at 2:13 PM, Stanislav Malyshev <[email protected]>
wrote:
> Hi!
>
> > namespace Application;
> > function log(Eloquent\Collection | Haldayne\Map $entity) {
> > $logger->log($entity->toArray());
> > }
>
> This is bad design. It assumes that two completely unrelated classes
> have the same function and it means the same.
Both of these exist in the wild, and both have identical function wrt
toArray: reducing a set of collection-like things to an array of arrays.
> If it's indeed true, we
> have a way to express it. It's called "interface".
Except these two are in separate libraries that cannot share an interface.
> > "Ugh, this is much easier in multi-catch. If only functions took
>
> multiple types, this would be much simpler to write."
>
> And it would be completely wrong, abuse of typing. If you mean to say
> "anything that has [toArray] method", you should either have interface or
> just get rid of the strictness and duck-type it and rely on PHP to throw
> exception if anything happens. Otherwise it is just a sloppy design.
>
An interface is not possible: separate libraries. Duck-typing is not
appropriate: only these two specific classes are supported.
Union types solve certain problems better than equivalent run-time checks.
Multi-catch solves certain *other* problems better than equivalent
many-catch. They are orthogonal, but the syntax is similar: *"into this
block, accept this type or this type or ...."*
I contend that this apparent similarity must be consistent, lest we earn
another sadness.