Pomoć oko pregleda codea, principa, savjeta, pokuda... :)

Malo vježbam OOP po nekim slučajnim zadacima (zadaci predviđeni za rješenja u C#, ali ja sam ih iskoristio sebi za vježbanje OOP-a u PHPu) i mislim da sam ok napravio.

Međutim nemam koga da mi veli jel valja ili ne valja i zašto ne valja ako ne valja, odnosno gdje postoji mjesto za poboljšanje, govoreći o principima OOP-a.

Molio bih nadležne majstore ( @creatifcode @tony @tpojka @jorgovan ) kao i ostale meštre kada uhvate malko vremena, da bace oko i kažu svoj sud.

Link: ComparingPackages/ at master · dmitrecic/ComparingPackages · GitHub

Opis zadatka je u public/index.php

Hvala!

2 Likeova

Pročit’o sam zahtjev i mislim da trebaš preurediti input. Tamo se kaže da je input samo cifra potrošnje. Što je i logično: recimo da je to forma na sajtu i mene k’o vizitora zanima da unesem samo svoju potrošnju (npr. 3750) godišnjih kilovat sati očekuući da mi forma obradi i eksportuje listu paketa.
S tim u vezi nisi poštov’o SRP (S u S.O.L.I.D.).

Treba da postaviš model koji će prihvatiti samo jednu vrijednost. Neka je to niz ['kWhy' => 3750], a
BasicElectricityTariff klasa treba da obradi takav podatak. Isto tako PackagedTariff klasa treba da prihvata isti input. Obe klase treba da eksportuju uniforman output. Nešto poput

// input
['kWhy' => 3750]

// output
[
    3750 => [
        'name' => "Basic Electricity Tariff",
        'annual_costs' => 885,
    ]
]

// ili
[
    3750 => [
        'name' => "Packaged Tariff",
        'annual_costs' => 800,
    ]
]

Tako da na nekoj drugoj strani vrtiš foreach, tipa:

$compare[1] = new BasicElectricityTariff(['kWhy' => 3750]);
...
...
...
$compare[5] = new PackagedTariff(['kWhy' => 3750]);

A potom sortiraš ispis za $compare vrijednosti.
Tako nekako bi’ iš’o.
Evo sam ovde započeo kako bi ti modeli trebalo da izgledaju ali nisam završio. Tj treba par stvari prepraviti pa sam ostavio to tebi. :smile:

Edit: nisam se bavio strukturom projekta već onim šta bi trebalo da bude odgovornost pojedinih klasa.

2 Likeova

Hvala! Danas ću opet napraviti drugu verziju istoga, vodeći se SOLIDom, KISS-om i ostalim pi*darijama.
Što se tiče podataka, oni su (po zadatku) fiksni. Nije predviđeno da bude, recimo,3879 kwh, već odabir od par ponuđenih (3500, 4500, 6000).
Al kužim te.

Ja ovo vidio k’o input i output:

The comparison should accept the following input parameter:

  • Consumption (kWh/year)

and create a list of these products with the columns

  • Tariff name
  • Annual costs (€/year)

Ako radiš više input podataka istovremeno, to treba da uradiš kroz neki servis a da ova klasa hvata po jedan u momentu. Na taj način možeš da proširuješ funkcionalnost klase tipa ['kWhm' => 350] paonda da vršiš provjeru da li si proslijedio godišnju ili mjesečnu potrošnju (kad se pojavi takav paket u ponudi) ali ti output ostaje uniforman. Nisam siguran ali mislim da bi mi bilo lakše za održavati.

Dobro si vidio :slight_smile:
Možda sam ja pogrešno protumačio (protumačio sam kao select box), zato sam to stavio u array:

$costs[]=array("consumption"=>["kwh"=>"3500"]);
$costs[]=array("consumption"=>["kwh"=>"4500"]);
$costs[]=array("consumption"=>["kwh"=>"6000"]);

Po mome to bi i trebalo biti u arrayu i tako prosljeđuje u objekt. Međutim, zato i pitah vas meštre jer ne znači da sam i u pravu ako sam si to tako zamislio :slight_smile:

Nema veze što imaš više sličnih vrijednosti. Zovi klasu za svaku vrijednost ponaosob.
Ono što sam stavio za BasicElectricityTariff recimo treba da bude minimalni sadržalac za taj paket.
Tj, da može da radi sa jednim podatkom ili sa više (ako treba).

Napravio novo rješenje, kraće i (napokon) prema zahtjevima zadatka.
Valjda je sad ok? (molim istu ekipu sa revision)
:disappointed_relieved:

Link na reješenje (V2, kraće i propisno): https://github.com/dmitrecic/ComparingPackages2

1 Like

na githabu si, cemu v2?

2 Likeova

I ja htjedo’ napisati da je moglo kroz branch-ing da se uradi.
U svakom slučaju ovo mi već liči na puno bolji kod od onog inicijalno postavljenog.
Ono što ja ne volim u PHP-u je echo, prije bi’ to uradio sa
return json_decode($this->results); a u index.php bi uradio taj foreach. S tim da bi trebalo dodatno formirati elemente meta i consumption. Eventualno upotrijebiti __toString() magic method a isporučiti json_encode niza koji bi im’o strukturu

[
    'data' => [],
    'meta' => [],
]

Imaćeš opštiji kod i moći ćeš ga lako transformisati u template (view), možda API.
U svakom slučaju što manje (a najbolje nimalo) echo konstruktora po klasama već samo return.

1 Like

Taj V2 stavih zafrkancije radi (a i još ne kužim branching).
Al dali ste mi ideju da se usput sad poigram i s time :smile:
Echo mi uopće ne paše tu, ali obzirom na zadatak, htio sam samo “pustiti” rezultat van. Razumijem primjedbu.
Još ću se poigrat i ponovno napravit još jednu verziju (i pokušat je ugurat u branch).

Samo iz postojećeg koda:

git checkout -b "drugi-naziv-umjesto-master-a"

Kad izmijeniš kod i odradiš sve kako si i dosad, git push će ti reći šta treba da uradiš prvi put umjesto git push (hint: git push --set-upstream origin drugi-naziv-umjesto-master-a, al’ ja to ne pamtim već uvijek kucam git push pa kopiram upozorenje :smiley: ).
To ako koristiš konzolu umjesto GUI-ja.

Koristim konzolu, ni ne znam da drugo postoji :smiley:
Šalim se.
Budem probao pa da vidim kako funkcionira. Tko zna, možda mi se i svidi… :smiley:

Imam instalisane i Github Desktop i Sourcetree ali koristim ih ukupno 10-15% da se darežljivo izrazim.
Nekako sam navik’o ovamo u terminalu već.
Recimo, sad ne bi’ znao naći git stash save ili git stash list na aplikaciji onako iz prve.

Vidim da svi koriste terminal, pa ga i ja koristim. Počeo sam ga (terminal) sve više koristit, što mi je apsurdno ali ajde… Naime generacijama rade grafička sučelja da bi se olakšao rad, i sad, 30 godina nakon DOS-a - opet u command line. Napredak, nema šta… :smiley:

Koristi IDE ako ti se ne da kuckati git komande i slicno :slight_smile:

Činjenica je da čovjek puno brže navikne ruku i prste da otkuca

git add . && git commit -m "my message"
# ili još kraće
# https://stackoverflow.com/questions/4298960/git-add-and-commit-in-one-command
# https://teamtreehouse.com/community/git-commit-a-m-new-message-commits-all-changes-so-what-happens-when-i-just-type-git-commit-m-new-message#answer-1079402

nego ostaviti IDE, podići drugu aplikaciju i uraditi pola ovoga sa par dodatnih klikova.

Koji IDE ti to koristis, pa nema Git u sebi integrisan ? :slight_smile:

Sad si me podsjetio: ima, ali ni to ne koristim prečesto. :smile:

Svi IDE-ovi imaju integriran GIT.

Dosta puta sam sam znao vidjeti da ljudi koriste ove GIT Cliente van IDE na windowsima.
Za GIT
https://tortoisegit.org/

Za SVN

Osobno preferiram skinut si na komp https://git-scm.com/ i koristit terminal ili https://www.iterm2.com/
Ako sam na windowsu onda si skinem http://cmder.net/

Također još sam vidio i https://www.fossil-scm.org kao alternativa za https://git-scm.com/ ali nisam isprobao.

2 Likeova

IDE alati imaju kvalitetne mogućnosti što se tiče gita, recimo jedna od mogućnosti prije commita je ta da si odabereš file-ove koje češ comiitati, a i vidiš koja je bila razlika.

Možeš raditi usporedbu bilo kojeg lokalnog file-a sa istim file-om sa bilo kojeg brancha, naravno , ako je isti projekt.
Štedi vrijeme i novac.

Kvalitetni alati: netbeans, phpstorm, zend studio

Ta tri alata su top.

Od sva tri, netbeans je besplatan.