logi sisse meist KKK

Teadupärast vihjab faili suurus halvale koodile. Suurtes failides on pahatihti liiga palju koodi, mis tegeleb liiga paljude erinevate ülesannetega. Suur maht muudab koodist arusaamise raskemaks, programmeerijaid langevad masendusse, talse langeb, ja majanduslangus lõpetab langemise, sest on jõudnud täiesti põhja.

Võibolla siiski mitte päris nii, sest programmeerijatel on varuks salarelv - refaktoreerimine - ning uue aasta koidikul on just paras aeg eelmise aasta koodi natukene sabast sakutada ja viisakusele üles kutsuda.

Esimeseks ülesandeks olekski üles leida suurim koodifail. Seda tuleks otsida projektist, millega sa tihedates suhetes oled - näiteks seesama kood, mille kirjutamisega sa igapäevast leiba teenid, või mõni avatud koodiga projekt, kus sa aktiivne osaline oled, või kasvõi see kood mida sa omale salaja sahtlisse kirjutad. Peamine vast, et sel oleks juba väike ajalugu ja parajal hulgal faile, mille seast seda suurimat otsida.

UNIXiliste all peaks suurima faili leidmiseks sobima järgnev skriptike (kohanda faililaiendite nimekirja oma vajadustele vastavalt):

find . | egrep '\.(php|js|css|rb|sh)$' | xargs wc -l | sort -g

Nüüd küsi endalt: kas leitud suurim fail on ikkagi päris koodifail? Tihtipeale on mõned failid suured seetõttu, et nad sisaldavad lihtsalt hulka andmeid (näiteks fail kõigi maailma riikide nimedega). Sellised failid meid otseselt ei huvita, kuid dokumenteeri see leid sellegipoolest oma vastuses ja liigu edasi nimekirjas järgmise faili juurde.

Nõndaviisi peaksid sa lõpuks jõudma normaalsete programmi loogikat sisaldava failini. Dokumenteeri see leid oma vastuses - too välja erinevad parameetrid nagu näiteks ridade, klasside ja funktsioonide arv tolles failis. Anna ehk ka mõningane kirjeldus sellest, mida too fail teeb. Kõige julgemad võivad ette näidata ka terve koodi.

Seejärel kirjuta milliseid probleeme sa näed tolles failis ja mida saaks ette võtta, et seda häirivalt suurt faili väiksemaks katkuda.

Kui too fail tundub sulle aga OK, siis hõiska ja siinkohal lõpeta. Ülejäänutel seisab aga ees teema pealkirjas lubatud refaktoreerimise väljakutse. Võibolla on väljakutse liialt suur ja raske, aga katsu sellest üle olla.

Kui sul õnnestub väljakutsega toime tulla, siis pane kirja ka oma saavutus - kui väikseks fail kahanes ja muud kogemused.

PS. See on lihtsalt väike eksperiment, et ehk on tore midagi sellist üheskoos teha.

küsitud Jan 14 '10 at 18:27

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

edited Jan 14 '10 at 19:53


lihtsalt ääremärkusena - toimiv refaktoorimine on igapäevane tegevus ning on tihedalt seotud r&d tööga ja ka teadmiste edastamisega teistele meeskonnaliikmetele. kui lihtsalt kord aastas teha üks põhjalik refaktoorimine, siis ajad sa sellega vihaseks nii kliendi (kuna paratamatult tekib vigu ja mahuka refaktoorimise puhul palju vigu:) ) ja ka oma meeskonnakaaslased, kes seisavad nüüd natuke väheprognoositava ajakava ja uue oskusteabe omandamise ees. samuti on ühe põhjaliku refaktoorimise miinuseks ringi tehtavate asjade tähtsuse hindamise keerukus, liiga palju palle pead korraga õhus hoidma. raskem on hinnata refaktoorimise kasutegurit edasises progemises.

nn. "igapäevase refaktoorimise" puhul saad sa aega paremini planeerida, näiteks uue tööülesande puhul saad esmalt teha toimiva ("dirty") versiooni, selle testi anda ning sealt edasi teha vajalik refaktoorimine (taaskasutamine, optimeerimine, koodi nõuetele vastavusse viimine). kuna tööühik on väiksem, siis teed ka oma refaktoorimist ratsionaalsemalt, ilma superelegantsete ja muul moel kaelamurdvate loogikakonstruktsioonideta. refaktoorimisel ei tohi unustada, et projektis osalevad ka algajamad progejad, kelle töötempo ei pruugi keerukama arhitektuuri puhul tõusta :)

samas muidugi, kord aastas refaktoorimine on parem kui üldse mitte :)

link

vastatud Mar 04 '10 at 09:27

AllarA's gravatar image

AllarA
511

Tegin ühes oma suuremas projektis ka selle päringu. Tulemused siin:

    503 ./php/lib/html2pdf/box.inline.php
    515 ./sql/konvert/konvert_20071017.sql
    519 ./php/lib/html2pdf/pdf.fpdf.makefont.php
    524 ./php/lib/table.inc
    526 ./php/screens/yyriarvestus/kululiigid_form.inc
    531 ./php/core/database.inc
    531 ./php/lib/html2pdf/output.png.class.php
    536 ./sql/konvert/konvert_20080707.sql
    556 ./php/lib/html2pdf/default.css
    559 ./php/screens/yldandmed/yhistud_form.inc
    566 ./sql/konvert/konvert_20080228.sql
    569 ./php/lib/html2pdf/box.php
    587 ./web/FCKeditor/editor/dialog/fck_link/fck_link.js
    602 ./php/lib/html2pdf/layout.page.breaks.php
    614 ./sql/konvert/konvert_20071229.sql
    630 ./php/screens/yyriarvestus/otsekorraldused_import.inc
    661 ./php/lib/html2pdf/box.text.php
    674 ./php/core/context.inc
    694 ./php/screens/yyriarvestus/perioodid_form.inc
    887 ./php/lib/html2pdf/html.attrs.inc.php
    891 ./php/lib/html2pdf/ot.class.php
    914 ./php/core/html.inc
   1038 ./php/lib/html2pdf/box.generic.formatted.php
   1045 ./php/lib/phpmailer/class.smtp.php
   1114 ./php/lib/html2pdf/box.container.php
   1207 ./php/lib/html2pdf/pipeline.class.php
   1281 ./sql/konvert/konvert_20080219.sql
   1340 ./php/lib/html2pdf/box.table.php
   1392 ./drupal/includes/menu.inc
   1512 ./php/lib/phpmailer/class.phpmailer.php
   1806 ./web/jscalendar/calendar.js
   2694 ./php/lib/html2pdf/pdf.fpdf.php
   2913 ./php/lib/geshi/geshi.php
   3212 ./php/lib/html2pdf/fpdf/fpdf.php
   4059 ./php/lib/html2pdf/encoding.glyphs.inc.php
   4789 ./sql/tabelid.sql
 183617 total

Kõige suurem fail sql/tabelid.sql on automaatgenereeritud ja sisaldab drop käske, kommentaare jne, seda ma ei arvestaks. Seejärel tuleb hulk väliste teekide koodi, mida ma ka ei arvesta (hea mõelda, et teekide kirjutajad kirjutavad minust suuremaid lohesid? :).

Esimene käsitsi kirjutatud fail on php/core/html.inc, mis sisaldab 98-t funktsiooni erinevate HTML-lõikude väljastamiseks nii, et atribuutide sisu jm vajalik saab varjestatud. Seal on küll mõningaid legacy funktsioone, mis tuleks välja rookida, aga üldiselt see fail mind öösel ärkvel ei hoia.

Järgmine käsitsi kirjutatud fail on php/screens/yyriarvestus/perioodid_form.inc, mis ei sisalda ühtegi klassi ega funktsiooni :). Hea vana kooli PHP. Koodi taaskasutust võiks erinevate vormide vahel rohkem olla, aga ta töötab.

Minu üllatuseks ei olnud suuremate failide hulgas SQL faile. Andmebaasiinimesena meeldib mulle hoida igasugust andmeloogikat andmebaasi funktsioonides ja see on tegelikult kõige keerulisem kood kogu programmis. Ilmselt on põhjuseks see, et iga funktsioon on eraldi failis. Objekt-orienteeritud koodi puhul oleksid mitmed funktsioonid koondatud ühte klassi meetoditeks ning siis oleksid ka koodifailid suuremad. (Mõttekoht - äkki SQL failides olev loogika tundub mulle keeruline sellepärast, et ta on SQL-s?)

Kogu refaktoriseerimise juures olen ma kõige rohkem hädas sellega, et see ei lisa otseselt väärtust, st vabandust, lisab küll, aga väga pikas plaanis. Kui mul on aega 4 tundi programmeerimiseks ja mul on valida, kas refaktoriseerida kood või lahendada ära selle kliendi probleem, kes mulle iga nädal helistab, siis tavaliselt teen ma viimast. Kui just refaktoriseerimine selle kliendi probleemi ei lahenda, aga seda juhtub harva.

link

vastatud Jan 16 '10 at 22:32

Tambet%20Matiisen's gravatar image

Tambet Matiisen ♦♦
77791125

Väliste teekide puhul kehtib vast see argument, et koodi on mugavam levitada kui kõik see istub ühes suures failis. See html2pdf asi tundub aga huvitavam juhtum - miskipärast on neil neid suuri faili kohe hulgim. Leidsin selle projekti ka veebiavarustest üles ja kood tundus peale vaadates suht tip-top... ainult et kui ma mõtlen oma 400-realiste JavaScripti failide peale, siis mõte üle tuhande realiste failide haldamisest ei tundu just meeldiv.

(Jan 16 '10 at 23:35) Rene Saarsoo ♦♦

Et ise oma asjaga kohe algust teha...

Suurimaks failiks osutus mul 466 realine isend, mis sisaldas lihtsalt portsu testandmeid.

Järgmine oli aga juba huvitavam:

434 rida JavaScripti, mis sisaldas üht 14 meetodiga klassi. JavaScriptile omaselt sisaldasid need meetodid veel lisaks 21 anonüümset funktsioonikest. 129 rida (ehk 28%) neist 434-st olid kommentaarid või tühjad read. Suurim meetod 99 rida (82 rida puhast koodi).

Peab ütlema, et suurima faili otsimise metoodika pani minu puhul päris hästi täppi - tegemist tõesti ühe probleemseima failiga kogu koodipuus. Kusjuures mitte ainult kood pole halb vaid ka kasutajaliides, mille kokkupanemisega see kood tegeleb, on ülemäära keerukas. Huvitaval kombel on see ka üks vanemaid faile koodipuus, mis vast näitab seda, et sinna on aja jooksul igasugust rämpsu kuhjunud. Lisaks tähendab vanus seda, et seal on koodi, mida ma täna enam niiviisi ei kirjutaks.

Refaktoreerimise koha pealt pole samuti asjad kõige lihtsamad. On selge, et see klass on vastutav liiga paljude asjade eest, aga kuidas neid asju sealt välja sikutada pole kaugeltki selge. Nad justnagu tahavad kõik seal olla. Kuid eks ma midagi välja nuputan...

link

vastatud Jan 14 '10 at 20:27

Rene%20Saarsoo's gravatar image

Rene Saarsoo ♦♦
1.1k101121

Ei saanud kommentaarina jätta (mul on hetkel vaid 1 reputatsioonipunkt, kommenteerimiseks on vaja 100), nii et teen seda siin eraldi vastusena.

Igatahes - minu meelest on palju huvitavam küsimus hoopis, et mida sa teed lõpuks kõigi nende JS failidega, kuidas deploy protsess välja näeb? Kas laed kõik FTP-ga serverisse ja paned need ühekaupa <script> tag'iga lehele või on mingi põnevam meetod kasutusel?

Sorry, et teemast välja läks.

link

vastatud Jan 15 '10 at 23:23

Andris's gravatar image

Andris
2553310

Kuna JavaScripti faile kokku umbes 150, siis ei tule nende käsitsi haldamine eriti kõne alla. On skript, mis kõik need väiksed failid üheks suureks kokku ühendab ja siis YUICompressori abil kokku pakib.

Kui sa tahad sel teemal rohkemat arutleda, siis tee parem uus teema.

(Jan 16 '10 at 18:16) Rene Saarsoo ♦♦
Sinu vastus
lülita eelvaade

Jälgi seda küsimust

By Email:

Pärast sisselogimist saad tellida muudatuse teavitusi siit

By RSS:

Answers

Answers and Comments

Markdown Basics

  • *kaldkiri* või __kaldkiri__
  • **paks kiri** või __paks kiri__
  • link:[tekst](http://url.com/ "pealkiri")
  • pilt?![alt tekst](/path/img.jpg "pealkiri")
  • nummerdatud nimekiri: 1. Foo 2. Bar
  • to add a line break simply add two spaces to where you would like the new line to be.
  • põhilised HTML märgendid on samuti toetatud

Pinu tööpakkumised

kõik pakkumised »

Küsimuse sildid:

×1

küsitud: Jan 14 '10 at 18:27

nähtud: 3,477 korda

viimati uuendatud: Mar 04 '10 at 09:27

Sarnased küsimused

Litsents: Creative Commons Attribution License | Kontakt: info@pinu.ee