Re: [RFC] Pipe Operator
| From: | Bob Weinand | Date: | Fri, 29 Apr 2016 23:37:17 +0000 |
| Subject: | Re: [RFC] Pipe Operator | ||
| References: | 1 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-92963@lists.php.net to get a copy of this message | ||
Hey,
> Am 29.04.2016 um 21:58 schrieb Sara Golemon <pollita@php.net>:
>
> This is one of my favorites out of HackLang. It's pure syntactic
> sugar, but it goes a long way towards improving readability.
> https://wiki.php.net/rfc/pipe-operator
Thanks for proposing, so that I am able to show what I don't like about the |> pipe
operator:
In general, the pipe operator is hiding anti-patterns. It makes anti-patterns look nicer.
Take the first example:
$ret =
array_merge(
$ret,
getFileArg(
array_map(
function ($x) use ($arg) { return $arg . '/' . $x; },
array_filter(
scandir($arg),
function ($x) { return $x !== '.' && $x !== '..'); }
)
)
)
);
Sure, it *looks* nicer with the pipe operator, if you really want to nest it. But that nesting is
horrible in itself. It should be written as:
$files = array_filter(scandir($arg), function ($x) { $x != '.' && $x !=
'..'; });
$fullPath = array_map(function($x) use ($arg) { return "$arg/$x"; }, $files);
$allFiles = array_merge($allFiles, getFileArg($fullPath));
By limiting the nesting level to 2, the code gets itself much more readable and in addition, the
variable names are self-explaining, so that you can jump right in.
As already mentioned, the |> variant looks nicer than the above, but it still lacks the most
important part; documentation in form of obvious variable names after each small step.
It's always nice when code can look nicely, but this doesn't encourage writing
understandable code. This RFC is just providing another way to shoot any future readers into the
feet.
Readers want to quickly grasp what is going on. Having to follow a whole list of operations whose
result is written to a variable $ret is telling them absolutely nothing.
TL;DR:
-1: The |> pipe operator encourages a write-only style.
Bob