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

Código limpio sin loops

Avatar for Joe Cohen Joe Cohen
September 21, 2016

Código limpio sin loops

Avatar for Joe Cohen

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";