Nekenčiantys žmonės visada naudojo PHP dėl įvairių priežasčių, tačiau vienas iš paprasčiausių tikslų yra tai, koks bjaurus gali būti kodas. Kai kurie žmonės gali nesutikti, kad kodo švarumas ir „dailumas“ yra svarbūs, bet kai kalbama apie ilgalaikį kodų bazių palaikymą, galite sutaupyti daug laiko savo komandai, turėdami kodą, kurį lengva skaityti.
Dirbdamas „Apple“ sukūriau finansų programų, kurias naudoja vidinės suinteresuotosios šalys, ekosistemą. Bėgant metams aš nuolat įtraukdavau naujus kūrėjus į įrankius, kurie padėtų atlikti bendrą priežiūrą ar patobulinimus. Vienas iš svarbiausių to meto dalykų yra tai, kaip svarbu mokėti skaityti savo kodą natūralia kalba.
Įdomu pastebėti, kad dauguma kodų yra parašyti taip, kad jūs turite perskaityti didelę jo dalį, tada grįžti į pradžią, kad suprastumėte, kas vyksta. Rašant kodą naudojant išraiškingesnę kalbą ar API, gali labai sutrumpėti naujų kūrėjų priėmimo ir įsibėgėjimo laikas.
Čia kolekcijos spindi. „Laravel“ kolekcijose atliekamos sudėtingos masyvo peržiūros, todėl jas nepaprastai lengva skaityti ir suprasti. Jūsų kodas tampa komandų grandine, pavyzdžiui: „Filtruokite šį masyvą tik į žodžius, prasidedančius raide a, tada susiekite išlaidų sumą su eilute ir galiausiai sumažinkite ją iki visų išlaidų sumos“. Labai lengva nuvertinti kodo rašymo svarbą išraiškingesne kalba, bet kai tai įpratai, sunku įsivaizduoti, kaip kas nors kitas yra priimtinas.
Žinoma, skaitomumas negali nukentėti našumo sąskaita, todėl svarbu užtikrinti, kad visada priimtume teisingą pasirinkimą ir pirmenybę teikiame skaitomumui tik ten, kur tai tinkama. Visada turėtume suprasti, kas vyksta užkulisiuose, ir puikiai suvokti, su kokiais kompromisais susiduriame, priimdami sprendimus. Mūsų kodui nėra jokios naudos, jei jis užtrunka visa sekunde ilgiau nei mažiau skaitomas sprendimas.
Pasinerkime ir nuodugniai pažvelkime į PHP masyvus ir kolekcijas bei palyginkime jų našumą.
Vienas didžiausių „Laravel Collections“ naudojimo pranašumų yra sklandi sintaksė, leidžianti sujungti grandininius metodus. Taip gaunamas švarus ir skaitomas kodas, nes galite atlikti kelias operacijas iš eilės nereikalaujant laikinųjų kintamųjų ar sudėtingų įdėtųjų funkcijų iškvietimų.
Palyginkime kai kurias dažniausiai naudojamas masyvo manipuliavimo funkcijas, kad pamatytume, kaip PHP palyginama su kolekcijomis labai paprastame pavyzdyje.
PHP
array_filter($data, function($row) { return substr($row, 0, 1) === "a"; });
Kolekcijos
$data->filter(function($row) { return substr($row, 0, 1) === "a"; });
PHP
array_search(function($row) { return substr($row, 0, 1) === "a"; }, $data);
Kolekcijos
$data->search(function($row) { return substr($row, 0, 1) === "a"; });
PHP
array_map(function($row) { return "test"; }, $data);
Kolekcijos
$data->map(function($row) { return "test"; });
PHP
sort($data);
Kolekcijos
$data->sort();
PHP
foreach($loop as $item) { $doSomething = true; }
Kolekcijos
$data->each(function($row) { return "test"; });
PHP
array_reduce($data, function($carry, $row) { return $carry + strlen($row); });
Kolekcijos
$data->reduce(function($carry, $row) { return $carry + strlen($row); });
PHP
array_splice($data, count($data)/2);
Kolekcijos
$data->splice(count($data)/2);
Visi kartu (PHP)
$data = array_filter($data, function($row) { return substr($row, 0, 1) === "a"; }); $data = array_search(function($row) { return substr($row, 0, 1) === "a"; }, $data); $data = array_map(function($row) { return "test"; }, $data); sort($data); foreach($loop as $item) { $doSomething = true; } $sum = array_reduce($data, function($carry, $row) { return $carry + strlen($row); });
Visi kartu (kolekcijos)
$sum = $data->filter(function($row) { return substr($row, 0, 1) === "a"; })->search(function($row) { return substr($row, 0, 1) === "a"; })->map(function($row) { return "test"; })->sort() ->each(function($row) { return "test"; })->reduce(function($carry, $row) { return $carry + strlen($row); });
Palyginimas
Taikant tokį paprastą metodą, neatrodo, kad būtų didžiulis kompromisas dėl kiekvienos atskiros funkcijos skaitomumo, nors pažvelgę į pavyzdį, kai jums reikia juos visas pritaikyti vienam masyvui, aiškiai matote, kad tai yra daugiau glausta ir lengviau skaitoma, kai rinkinyje naudojami grandininiai metodai.
Užuot nuolat turėję perrašyti savo kintamąjį ir pabaigoje nustatyti naują išvesties kintamąjį, galime tiesiog sujungti kiekvieną komandą, kol pasieksime norimą išvestį. Rinkinius tikrai lengviau skaityti, kuo sudėtingesnis tampa jūsų kodas.
Aš paėmiau aukščiau pateiktus pavyzdžius ir sugeneravau kai kuriuos bandymo duomenis, kad pamėginčiau nustatyti, ar kolekcijos buvo daugiau ar mažiau našios nei standartinės PHP funkcijos.
Kiekviename masyve buvo 100 000 atsitiktinių eilučių, o kiekvieną funkciją vykdžiau 100 kartų. Galų gale apskaičiavome visų atsakymo laikų vidurkį.
Galutiniai rezultatai pateikiami žemiau:
========== Tests Complete (ms) ========== php filter: 5.07 collect filter: 6.49 ======================= php search: 0.79 collect search: 0 ======================= php map: 3.45 collect map: 4.18 ======================= php sort: 25.27 collect sort: 11.18 ======================= php each: 1.03 collect each: 6.96 ======================= php reduce: 2.78 collect reduce: 7.75 ======================= php splice: 1 collect splice: 0.74 =======================
Kaip aiškiai matote, nors iš kolekcijų gauname daug aiškumo, kai kuriose pagrindinėse srityse prarandame didelį našumą.
Filtras , žemėlapis , Foreach ir Reduce yra greitesni naudojant standartines PHP funkcijas. Foreach ir Reduce iš tikrųjų yra neįtikėtinai reikšmingi skirtumai. Paieška , rūšiavimas ir sujungimas rodo kolekciją kaip nugalėtoją, o Rūšiavimas iš tikrųjų sutaupo daug laiko.
Taip pat svarbu pažymėti, kad kiekvieną kolekciją turėsite sukurti iš sukurto masyvo, kuris šiek tiek prideda prie kolekcijos nustatymo pradžios, tačiau net ir įdedant nedidelį papildomo darbo ir laiko kiekį, rezultatai yra gana aiškus.
Mano nuomone (ir tai tik nuomonė, pagrįsta šiais rezultatais), jei našumas kelia didžiulį susirūpinimą, aš tikrai pasilikčiau su standartine PHP funkcija Foreach kilpoms ir greičiausiai tokia pati, kai reikia Reduce . Jei reikia rūšiuoti didelius duomenų rinkinius, kolekcijos yra tinkamas būdas. Likusieji yra taip arti, kad atrodo, kad tai yra asmeninis pasirinkimas.
Tuo metu sakyčiau, kad kolekcijas visada lengviau skaityti ir prižiūrėti.
Akivaizdu, kad turėtumėte pasinaudoti šia informacija ir priimti pagrįstą sprendimą, tačiau, jei esate panašus į mane, manau, kad atsidursite kolekcijose dėl daugelio aukščiau išvardytų funkcijų. Tačiau manau, kad toliau naudosiu →each
ir →reduce
!