4 ms·
Got that, but was triggered by ‘algorithmic structure’; that sounds a tad ‘over the top’ when you then come with some basic web request. However, I would not c
by tluyben2 6y ago
Got that, but was triggered by ‘algorithmic structure’; that sounds a tad ‘over the top’ when you then come with some basic web request.
However, I would not call your example particularly well typed. Array is still basically untyped.
When I talk about types I mean things like;
Either<Error,Group> AddGroup(string GroupName, User[]? users)
In this case I know what I am getting and I know the users are already, when reaching the webserver, deserialized, validated (or the type would reject them and produce an error and I know I am getting an actual Group back.
in your case that would be;
function AddGroup(GroupName, Users)
I have no idea how that is better or clearer or less work to write? No idea what it returns; Users probably is an array of users, but is it? Or is it a typo? And I need to validate whatever comes in.
You can add docs but I do that still with the typed version (although thats automated mostly unless I need to explain something).
Worse as well is that when I have this:
function AddGroup(GroupName, Users)
function AddGroups(GroupNames, Users)
Now i'm completely lost. I'm not even sure these users as input are the same things? Both arrays? Both the same User 'things'? Output?
But yes, in php I write typeless mostly too (although I luckily do not have to touch it much anymore) as the types mostly suck. But in more advanced type systems, the types will tell you a lot/all about the input/output, so you can do without a lot of docs and trying things out can be automated; as we know the precise input so some generator can generate example input that will immediately work; like swagger on speed.
Etc. But agreed, your example does not benefit too much from typing, however I would define Option[] as something precise than just a void* and hope for the best. Also Method and URL so I know invalid input for those very well defined things cannot be violated.
So your example:
private static function request(Method $method, URL $url, Option[]? $options): WebResult
would clear up a lot for me. Now, for instance, I can see, and not guess, that you are answering a web request instead of some request with confusingly similar names to webrequests.
But how about some more 'concrete' examples; 'request' is rather a low level / abstract thing (I hope...). But your business logic would contain more concrete functions; any examples from those that are similarly badly geared to types?
- TooCreative 6y agoAnd now instead of $body = Http::request('GET', 'https://example.com')['body']; You have to do this? $body = Http::request(new Method('GET'), new URL('https://example.com'))->body; And you have cuttered the global namespace with "Method", "URL" and "Option"?
- tluyben2 6y agoWhy would they be in the global namespace? They would be in imported namespaces (something\Http for instance). That's rather normal. And yes, now you have to make sure you are passing the proper and valid types, which is obviously the goal here: $body = Http::request(Method.GET, URL.Parse('https://example.com'))->body; In other languages you can make it so that the static URL is validated at compile time even.
- TooCreative 6y agoFor that to work, you have to import those explicitly: use something\Http; use something\Http\Method; use something\Http\URL; $body = Http::request(Method.GET, URL.Parse('https://example.com'))->body; Now you have a bunch of lines instead of one. And have "Method" and "URL" in your current scope. And all of that instead of this beauty: $body = Http:request('GET', 'https://example.com')['body'];
- tluyben2 6y agoBeauty is in the eye of the beholder, however we were not talking about verboseness vs terseness though. You can make anything terse with stringy types and you indeed seem to favour that, however, this was about how types change readability and brittleness. This is all easier to read by people who do not know what request() does => request is not a good example, but it still stands. In your case, you have no case what $method or $url are supposed to be; you can do; $body = Http:request('rabbit', 'cracker')['body']; I assume something in Symfony catches that, but I cannot see it from the signature at all, and the validation error is, in my opinion (obviously) in the wrong place; it should be at the call site because that's where you are creating the erroneous input so that's where I want to be lead to.