Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Código limpio sin loops

Joe Cohen
September 21, 2016

Código limpio sin loops

Joe Cohen

September 21, 2016
Tweet

More Decks by Joe Cohen

Other Decks in Programming

Transcript

  1. $totalSalesByItem = 0; foreach ($customers as $customer) { $countryCode =

    $customer->country; if ($countryCode == 'MEX') { $orders = $customer->orders; foreach ($orders as $order) { if ($order->status == 'paid') { foreach ($order->items as $item) { $totalSalesByItem += $item->total; } } } } } return '$'.number_format($totalSalesByItem, 2);
  2. function getUsersEmails($users) { $emails = []; for ($i = 0;

    $i < count($users); $i++) { $user = $users[$i]; if ($user->email !== null) { $emails[] = $user->email; } } return $emails; }
  3. $emails = []; foreach ($users as $user) { $email =

    $user->getEmail(); $emails[] = $email; } return $emails;
  4. $cartTotals = []; foreach ($cart->items as $item) { $product =

    [ 'id' => $item->id, 'name' => $item->name, 'total' => $item->quantity * $item->price, ]; $cartTotals[] = $product; } return $cartTotals;
  5. // $emails = []; // foreach ($users as $user) {

    $email = $user->getEmail(); $emails[] = $email; // } // return $emails;
  6. // $cartTotals = []; // foreach ($cart->items as $item) {

    $product = [ 'id' => $item->id, 'name' => $item->name, 'total' => $item->quantity * $item->price, ]; $cartTotals[] = $product; } // return $cartTotals;
  7. $results = []; foreach ($items as $item) { $result =

    [ // 'id' => $item->id, // 'name' => $item->name, // 'total' => $item->quantity * $item->price, ]; $results[] = $result; } return $results;
  8. $results = []; foreach ($items as $item) { $result =

    // $user->getEmail(); $results[] = $result; } return $results;
  9. $callback = function ($item) { return $item->getEmail(); }; // $results

    = []; // foreach ($items as $item) { $result = $callback($item); // $results[] = $result; // } // return $results;
  10. $callback = function ($item) { return [ 'id' => $item->id,

    'name' => $item->name, 'total' => $item->quantity * $item->price, ]; }; // $results = []; // foreach ($items as $item) { $result = $callback($item); // $results[] = $result; } // return $results;
  11. function map($items, $func) { $results = []; foreach ($items as

    $item) { $result = $func($item); $results[] = $result; } return $results; }
  12. function each($items, $func) { for ($i = 0; $i <

    count($items); $i++) { $func($items[$i]); } }
  13. // Mal! Debes de usar `map`. each($customers, function ($customer) use

    (&$emails) { $emails[] = $customer->email; }); // Bien! $emails = map($customers, function ($customer) { return $customer->email; });
  14. $admins = []; foreach ($users as $user) { if ($user->isAdmin())

    { $admins[] = $user; } } return $admins;
  15. $activeUsers = []; foreach ($users as $user) { if ($user->status

    == 'active') { $activeUsers[] = $user; } } return $activeUsers;
  16. // $admins = []; // foreach ($users as $user) {

    if ($user->isAdmin()) { // $admins[] = $user; } // } // return $admins;
  17. // $activeUsers = []; // foreach ($users as $user) {

    if ($user->status == 'active') { // $activeUsers[] = $user; } // } // return $activeUsers;
  18. $callback = function ($item) { return $item->isAdmin(); } // $results

    = []; // foreach ($items as $item) { if ($callback($item)) { // $results[] = $item; } // } // return $results;
  19. $callback = function ($item) { return $item->status == 'active'; }

    // $results = []; // foreach ($items as $item) { if ($callback($item)) { // $results[] = $item; } // } // return $results;
  20. function getActiveUsersEmails($users) { $emails = []; foreach ($users as $user)

    { if ($user->status == 'active') { $emails[] = $user->email; } } return $emails; }
  21. // function getActiveUsersEmails($users) // { $activeUsers = array_filter($users, function ($user)

    { return $user->status == 'active'; }); // $emails = []; // foreach ($users as $user) { // if ($user->status == 'active') { // $emails[] = $user->email; // } // } // return $emails; // }
  22. // function getActiveUsersEmails($users) // { // $activeUsers = array_filter($users, function

    ($user) { // return $user->status == 'active'; // }); $emails = []; foreach ($activeUsers as $user) { $emails[] = $user->email; } return $emails; // }
  23. function getActiveUsersEmails($users) { $activeUsers = array_filter($users, function ($user) { return

    $user->status == 'active'; }); $emails = array_map(function ($user) { return $user->email; }, $activeUsers); return $emails; }
  24. // function getActiveUsersEmails($users) // { $activeUsers // = array_filter($users, function

    ($user) { // return $user->status == 'active'; // }); // $emails = array_map(function ($user) { // return $user->email; }, $activeUsers); // return $emails; // }
  25. function getActiveUsersEmails($users) { return array_map(function ($user) { return $user->email; },

    array_filter($users, function ($user) { return $user->status == 'active'; })); }
  26. class Collection { protected $items; public function __construct($items) { $this->items

    = $items; } public function map($callback) { return new static(array_map($callback, $this->items)); } public function filter($callback) { return new static(array_filter($this->items, $callback)); } public function toArray() { return $this->items; } }
  27. function getActiveUsersEmails($users) { return (new Collection($users))->filter(function ($user) { return $user->status

    == 'active'; })->map(function($users)) { return $user->email; })->toArray(); }
  28. // class Collection // { // protected $items; // //

    public function __construct($items) // { // $this->items = $items; // } public static function make($items) { return new static($items); } // ...
  29. // class Collection // { // .. public function map($callback)

    { return new static(array_map($callback, $this->items)); } public function filter($callback) { return new static(array_filter($this->items, $callback)); } // ... // }
  30. class Collection implements ArrayAccess, Countable, IteratorAggregate { protected $items; public

    function __construct($items) { $this->items = $items; } public function offsetExists($offset) { return array_key_exists($offset, $this->items); } public function offsetGet($offset) { return $this->items[$offset]; } public function offsetSet($offset, $value) { if ($offset === null) { $this->items[] = $value; } else { $this->items[$offset] = $value; } } public function offsetUnset($offset) { unset($this->items[$offset]); } public function count() { return count($this->items); } public function getIterator() { return new ArrayIterator($this->items); } }
  31. $items = Collection::make([ 'Rasmus' => 'Lerdof', 'Adam' => 'Watham', 'Joe'

    => 'Cohen', ]); echo $items[2]; // => Joe Cohen echo count($items); // => 3
  32. <?php $data = file_get_contents(__DIR__.'/stubs/data.json'); $customers = json_decode($data); $totalSalesByItem = 0;

    foreach ($customers as $customer) { $countryCode = $customer->country; if ($countryCode == 'MEX') { $orders = $customer->orders; foreach ($orders as $order) { if ($order->status == 'paid') { foreach ($order->items as $item) { $totalSalesByItem += $item->total; } } } } } echo '$'.number_format($totalSalesByItem, 2)."\n";
  33. $totalSalesByItem = $customers->filter(function ($customer) { return $customer->country == 'MEX'; })->flatMap(function

    ($customer) { return $customer->orders; })->filter(function ($order) { return $order->status == 'paid'; })->flatMap(function ($order) { return $order->items; })->reduce(function ($carry, $item) { return $carry + $item->total; }); echo '$'.number_format($totalSalesByItem, 2)."\n";
  34. $customers = json_decode($data); $totalSalesByItem = 0; foreach ($customers as $customer)

    { $countryCode = $customer->country; if ($countryCode == 'MEX') { $orders = $customer->orders; foreach ($orders as $order) { if ($order->status == 'paid') { foreach ($order->items as $item) { $totalSalesByItem += $item->total; } } } } } echo '$'.number_format($totalSalesByItem, 2)."\n";