On Tue, 5 May 2020 at 16:56, Marco Pivetta <ocram...@gmail.com> wrote:

>
> Sorry, but no: you provide multiple constructors, each with a limited set
> of arguments, each guaranteeing constraints that depend on context.
>
> For instance, a `fromArray()` may check for key existence, while
> `fromJson()` may use a JSON-Schema definition to check that all is as
> required, and `fromXmlPayload()` may apply an XSD validator, and so on...
>



Maybe it's just an unfortunate choice of example, but my reaction was the
same as Benjamin's: "fromArray" doesn't look like "a named constructor with
a limited set of arguments", it looks like a hack used to emulate named
parameters by setting them as keys in an array which then has to be
manually documented and validated.

The only fully generic alternative I know of that can be properly checked
by static analysis is some kind of builder API:

myHorribleLegacyAndOrganicallyGrownApi(
    ...(new MyInfiniteSequenceOfParametersBuilder)
        ->setFoo($foo)
        ->setBar($bar)
        // ... etc
        ->toSequentialParameters()
);



I do sympathise with the problems of making parameter names part of the
compatibility contract, and until recently have always argued it should be
opt-in at the call-site. I've been somewhat won round to the idea that that
leaves the migration too painfully slow.


Regards,
-- 
Rowan Tommins
[IMSoP]

Reply via email to