Limbikitsani kusanthula kosasintha munjira, m'malo moyang'ana nsikidzi nazo

Ndinauziridwa kulemba nkhaniyi ndi chiwerengero chachikulu cha zipangizo pa kusanthula static zomwe zikuchulukirachulukira kubwera kudutsa. Choyamba, izi PVS-studio blog, yomwe imadzilimbikitsa yokha pa HabrΓ© ndi ndemanga za zolakwika zomwe zidapezeka ndi chida chawo mumapulojekiti otseguka. PVS-studio yakhazikitsidwa posachedwa Thandizo la Java, ndipo, ndithudi, omanga IntelliJ IDEA, omwe analyzer omwe amapangidwira mwina ndi apamwamba kwambiri kwa Java lero, sindikanakhoza kukhala kutali.

Powerenga ndemanga zoterezi, munthu amamva kuti tikukamba za matsenga amatsenga: dinani batani, ndipo apa pali - mndandanda wa zolakwika pamaso panu. Zikuwoneka kuti pamene ma analyzers akuyenda bwino, padzakhala nsikidzi zochulukirachulukira, ndipo zinthu zomwe zimayang'aniridwa ndi malobotiwa zitha kukhala zabwinoko, popanda kuyesetsa kwathu.

Koma palibe mankhwala amatsenga. Ndikufuna kulankhula za zomwe nthawi zambiri sizikambidwa m'makalata monga "awa ndi zinthu zomwe robot yathu ingapeze": zomwe osanthula sangathe kuchita, ntchito yawo yeniyeni ndi malo awo ndi chiyani pakupanga mapulogalamu, ndi momwe angagwiritsire ntchito molondola.

Limbikitsani kusanthula kosasintha munjira, m'malo moyang'ana nsikidzi nazo
Ratchet (gwero: wikipedia).

Zomwe Ma Static Analyzer Sangachite

Kodi, kuchokera pamalingaliro othandiza, kusanthula kwa code source ndi chiyani? Timadyetsa m'malo ena, ndipo m'kanthawi kochepa (kanthawi kochepa kwambiri kuposa kuyesa mayeso) timapeza zambiri za dongosolo lathu. Cholepheretsa chachikulu komanso chosagonjetseka pamasamu ndikuti titha kungopeza chidziwitso chochepa kwambiri.

Chitsanzo chodziwika bwino cha vuto lomwe silingathetsedwe ndi static analysis ndi siyani vuto: iyi ndi theorem yomwe imatsimikizira kuti ndizosatheka kupanga algorithm yodziwika bwino yomwe ingatsimikizire kuchokera ku gwero la pulogalamuyo ngati idzazungulira kapena kutha munthawi yomaliza. Kuwonjezera kwa chiphunzitso ichi ndi Theorem ya Ricekunena kuti katundu aliyense sanali wamng'ono wa ntchito computable, kudziwa ngati pulogalamu umasinthasintha amawunika ntchito ndi katundu wotere ndi vuto algorithmically unsolvable. Mwachitsanzo, ndizosatheka kulemba analyzer yomwe imatha kudziwa kuchokera pamtundu uliwonse ngati pulogalamu yowunikiridwa ndikukhazikitsa algorithm yomwe imawerengera, titi, squaring integer.

Chifukwa chake, magwiridwe antchito a static analyzer ali ndi malire osagonjetseka. A static analyzer sangathe kudziwa nthawi zonse zinthu monga, mwachitsanzo, kupezeka kwa "null pointer exception" m'zilankhulo zosawerengeka, kapena nthawi zonse kuti adziwe kupezeka kwa "mawonekedwe omwe sanapezeke" m'zinenero ndi kulemba kwamphamvu. Zonse zomwe static analyzer apamwamba kwambiri angakhoze kuchita ndikuwunikira milandu yapadera, yomwe chiwerengero chake, pakati pa zovuta zonse zomwe zingatheke ndi code yanu, ndi, popanda kukokomeza, kutsika kwa nyanja.

Kusanthula mosasunthika sikusakasaka zolakwika

Zotsatirazi zikutsatira zomwe tafotokozazi: static analysis si njira yochepetsera chiwerengero cha zolakwika mu pulogalamu. Ndingayesere kunena kuti ikayamba kugwiritsidwa ntchito ku projekiti yanu, ipeza malo "osangalatsa" mu code, koma, mwina, sichipeza zolakwika zomwe zimakhudza mtundu wa pulogalamu yanu.

Zitsanzo za zolakwika zomwe zimangopezeka ndi osanthula ndizodabwitsa, koma tisaiwale kuti zitsanzozi zidapezeka poyang'ana gulu lalikulu la ma codebases akulu. Momwemonso, ochita chinyengo omwe amatha kuyesa mapasiwedi angapo osavuta pamaakaunti ambiri pamapeto pake amapeza maakaunti omwe ali ndi mawu achinsinsi osavuta.

Kodi izi zikutanthauza kuti kusanthula kokhazikika sikuyenera kugwiritsidwa ntchito? Inde sichoncho! Ndipo ndendende pazifukwa zomwezo chifukwa chake kuli koyenera kuyang'ana mawu achinsinsi aliwonse kuti mulowe pamndandanda wamayimidwe achinsinsi "osavuta".

Kusanthula kosasunthika ndikoposa kupeza zolakwika

M'malo mwake, mavuto omwe amathetsedwa mwa kusanthula ndi okulirapo. Kupatula apo, nthawi zambiri, kusanthula kwa static ndi cheke chilichonse cha ma source code omwe amachitidwa asanakhazikitsidwe. Nazi zina zomwe mungachite:

  • Kuyang'ana kalembedwe ka zilembo m'lingaliro lalikulu la liwu. Izi zikuphatikizapo kuyang'ana masanjidwe ndi kuyang'ana kugwiritsa ntchito zopanda kanthu / zolembera zowonjezera, kukhazikitsa malire pazitsulo monga kuchuluka kwa mizere / njira ya cyclomatic, ndi zina zotero. Ku Java chida ichi ndi Checkstyle, mu Python ndi flake8. Mapulogalamu a kalasi iyi nthawi zambiri amatchedwa "linter".
  • Osati ma code executable okha omwe angasanthulidwe. Mafayilo azinthu monga JSON, YAML, XML, .properties angathe (ndipo ayenera!) kufufuzidwa kuti ndi oona. Kodi sikwabwino kudziwa kuti chifukwa cha mawu osasinthika mawonekedwe a JSON adasweka atangoyamba kumene kutsimikizira Kokani Kufunsira kuposa poyesa mayeso kapena pa Run time? Zida zoyenera zilipo: mwachitsanzo, YAMLlint, JSONLint.
  • Kuphatikiza (kapena kugawa zilankhulo zosinthika) ndi mtundu wa kusanthula kokhazikika. Monga lamulo, compilers amatha kupereka machenjezo omwe amasonyeza mavuto ndi khalidwe la code source, ndipo sayenera kunyalanyazidwa.
  • Nthawi zina kuphatikizira sikungongopanga ma code otheka. Mwachitsanzo, ngati muli ndi zolemba mumtundu AsciiDoctor, ndiye panthawi yomwe idasinthidwa kukhala HTML/PDF chothandizira AsciiDoctor (maven plugin) akhoza kupereka machenjezo, mwachitsanzo, okhudza maulalo osweka amkati. Ndipo ichi ndi chifukwa chabwino kuti musavomereze Kokani Pempho ndi zosintha zolembedwa.
  • Kuyang'ana kalembedwe ndi mtundu wa kusanthula kosasintha. Zothandiza aspell imatha kuyang'ana kalembedwe osati pazolembedwa zokha, komanso m'makhodi amtundu wa pulogalamu (ndemanga ndi zolemba) m'zilankhulo zosiyanasiyana zamapulogalamu, kuphatikiza C/C++, Java ndi Python. Vuto la kalembedwe pamawonekedwe a ogwiritsa ntchito kapena zolemba ndizovuta!
  • Mayeso kasinthidwe (zomwe zili, onani izi ΠΈ izi malipoti), ngakhale amachitidwa mu nthawi yoyeserera yama unit ngati pytest, alinso mtundu wa kusanthula kokhazikika, chifukwa sapanga ma code source pakuphedwa kwawo.

Monga mukuonera, kupeza nsikidzi pamndandandawu kumatenga gawo lofunika kwambiri, ndipo china chilichonse chimapezeka pogwiritsa ntchito zida zaulere zotseguka.

Ndi mitundu iti mwa mitundu iyi yowunikira yomwe iyenera kugwiritsidwa ntchito mu polojekiti yanu? Inde, kwambiri, ndi bwino! Chinthu chachikulu ndikuchigwiritsa ntchito moyenera, chomwe chidzakambidwenso.

Mapaipi otumizira ngati sefa yamasitepe ambiri komanso kusanthula kosasunthika ngati kusefukira kwake koyamba

Fanizo lachikale la kuphatikiza kosalekeza ndi payipi (paipi) momwe kusintha kumayendera - kuchoka pakusintha kachidindo koyambira kupita ku kutumiza kupita kukupanga. Mayendedwe okhazikika a payipi iyi amawoneka motere:

  1. static kusanthula
  2. kuphatikiza
  3. mayunitsi mayeso
  4. mayeso ophatikiza
  5. Mayeso a UI
  6. cheke pamanja

Zosintha zokanidwa mu gawo la Nth la mapaipi sizikuchulukitsidwa mpaka siteji N+1.

Chifukwa chiyani ndendende mwanjira iyi osati mwanjira ina? Mu gawo loyesera la mapaipi, oyesa adzazindikira piramidi yoyesera yodziwika bwino.

Limbikitsani kusanthula kosasintha munjira, m'malo moyang'ana nsikidzi nazo
Piramidi yoyesera. Gwero: nkhani Martin Fowler.

Pansi pa piramidi iyi pali mayeso omwe ndi osavuta kulemba, kuthamanga mwachangu, ndipo samakonda kunena zabodza. Chifukwa chake, payenera kukhala zambiri, ziyenera kuphimba ma code ambiri ndikuyamba kuphedwa. Pamwamba pa piramidi, zosiyana ndi zowona, kotero kuchuluka kwa kuphatikiza ndi kuyesa kwa UI kuyenera kuchepetsedwa mpaka pakufunika. Munthu mu unyolo uwu ndi gwero lamtengo wapatali, lochepetsetsa komanso losadalirika, kotero iye ali kumapeto kwenikweni ndipo amagwira ntchito pokhapokha ngati magawo apitawo sanapeze chilema chilichonse. Komabe, malinga ndi mfundo zomwezo, payipi imamangidwa m'zigawo zomwe sizikugwirizana mwachindunji ndi kuyesa!

Ndikufuna kupereka fanizo mu mawonekedwe a multistage madzi kusefera dongosolo. Madzi odetsedwa amaperekedwa ku zolowetsa (kusintha ndi zolakwika), pazotulutsa tiyenera kupeza madzi oyera, momwe zonyansa zonse zosafunika zimachotsedwa.

Limbikitsani kusanthula kosasintha munjira, m'malo moyang'ana nsikidzi nazo
Zosefera zambiri. Gwero: Wikimedia Commons

Monga mukudziwira, zosefera zoyeretsera zidapangidwa m'njira yoti kutsetsereka kwina kulikonse kungasefe kagawo kakang'ono kazinthu zowononga. Panthawi imodzimodziyo, ma cascades oyeretsa kwambiri amakhala ndi zotulukapo zambiri komanso zotsika mtengo. M'chifaniziro chathu, izi zikutanthauza kuti zipata zolowera bwino zimathamanga, zimafuna khama pang'ono kuti ziyambe, ndipo iwonso ndi odzichepetsa kwambiri pakugwira ntchito - ndipo izi ndizomwe zimapangidwira. Udindo wa kusanthula kosasunthika, komwe, monga tikumvetsetsa tsopano, kumatha kutulutsa zolakwika zazikulu zokha, ndi gawo la "matope" kumayambiriro kwa fyuluta.

Kusanthula kosasunthika pakokha sikumapangitsa kuti zinthu zomaliza zikhale zabwino, monga momwe "msampha wamatope" sumapangitsa kuti madzi amwe. Ndipo komabe, mofanana ndi zinthu zina za conveyor, kufunika kwake ndi koonekeratu. Ngakhale muzosefera zamitundu yambiri, magawo otulutsa amatha kujambula chilichonse mofanana ndi magawo olowera, zikuwonekeratu zotsatira zake zomwe kuyesa kupitilira ndi magawo abwino oyeretsera, popanda magawo olowera, kungayambitse.

Cholinga cha "wotolera matope" ndikutsitsa zipolopolo zotsatizana ndi zovuta zazikulu. Mwachitsanzo, osachepera, wowunikira ma code sayenera kusokonezedwa ndi ma code osasankhidwa molakwika komanso kuphwanya malamulo okhazikika (monga mabatani owonjezera kapena nthambi zokhazikika kwambiri). Nsikidzi ngati NPE ziyenera kugwidwa ndi mayeso a mayunitsi, koma ngati mayeso asanayese wosanthula akuwonetsa kuti cholakwikacho chiyenera kuchitika mosalephera, izi zidzafulumizitsa kukonza kwake.

Ndikuganiza kuti tsopano ndi zomveka chifukwa chake kusanthula kosasunthika sikumapangitsa kuti chinthucho chikhale bwino ngati chikugwiritsidwa ntchito nthawi ndi nthawi, ndipo kuyenera kugwiritsidwa ntchito nthawi zonse kuti zisefe zosintha zomwe zili ndi vuto lalikulu. Kufunsa ngati kugwiritsa ntchito static analyzer kumapangitsa kuti malonda anu akhale abwino ndi ofanana ndi kufunsa "Kodi kumwa kwamadzi otengedwa mu dziwe lakuda kudzakhala bwino ngati adutsa muchowola?"

Kukhazikitsidwa mu projekiti yakale

Funso lofunika lothandiza: momwe mungayambitsire kusanthula kosasunthika munjira yophatikizana mosalekeza ngati "chipata chamtundu"? Pankhani ya mayesero odziwikiratu, chirichonse chikuwonekera: pali mayesero angapo, kulephera kwa aliyense wa iwo ndi chifukwa chokwanira chokhulupirira kuti msonkhano sunadutse chipata cha khalidwe. Kuyesera kukhazikitsa chipata mofanana ndi zotsatira za kusanthula kosasunthika kumalephera: pali machenjezo ochuluka kwambiri mu code ya cholowa, simukufuna kunyalanyaza kwathunthu, komanso ndizosatheka kuyimitsa kutumiza kwa a. mankhwala chifukwa ali ndi machenjezo analyzer.

Akagwiritsidwa ntchito kwa nthawi yoyamba, analyzer amapanga machenjezo ambiri pa polojekiti iliyonse, zambiri zomwe sizikugwirizana ndi ntchito yoyenera ya mankhwala. Sizingatheke kuwongolera ndemanga zonsezi nthawi imodzi, ndipo zambiri za izo sizofunikira. Kupatula apo, tikudziwa kuti mankhwala athu onse amagwira ntchito, ngakhale isanayambike kusanthula kosasunthika!

Zotsatira zake, anthu ambiri amangogwiritsa ntchito episodic kusanthula kosasunthika, kapena kuzigwiritsa ntchito podziwitsa, pomwe lipoti la analyzer limangoperekedwa pakusonkhana. Izi ndizofanana ndi kusakhalapo kwa kusanthula kulikonse, chifukwa ngati tili ndi machenjezo ambiri, ndiye kuti zochitika zina (zilibe kanthu) pamene kusintha kwa code sikunazindikire.

Njira zotsatirazi zowonetsera zipata zabwino zimadziwika:

  • Amayika malire pa chiwerengero chonse cha machenjezo, kapena chiwerengero cha machenjezo ogawidwa ndi chiwerengero cha mizere ya code. Izi sizikugwira ntchito bwino, chifukwa chipata choterocho chimadumpha momasuka kusintha ndi zolakwika zatsopano mpaka malire awo adutsa.
  • Kukonza, nthawi ina, machenjezo onse akale mu code ngati anyalanyazidwa, ndi kulephera kumanga pamene machenjezo atsopano achitika. Izi zimaperekedwa ndi PVS-studio ndi zinthu zina zapaintaneti, monga Codacy. Ndinalibe mwayi wogwira ntchito ku PVS-studio, monga momwe ndinadziwira ndi Codacy, vuto lawo lalikulu ndiloti tanthauzo la "zakale" ndi zomwe "chatsopano" cholakwika ndi ndondomeko yovuta kwambiri yomwe sichitha. nthawi zonse zimagwira ntchito moyenera, makamaka ngati mafayilo asinthidwa kwambiri kapena kusinthidwanso. Ndikukumbukira, Codacy amatha kudumpha machenjezo atsopano popempha kukoka, ndipo nthawi yomweyo osadumpha pempho la kukoka chifukwa cha machenjezo omwe sanali okhudzana ndi kusintha kwa code ya PR iyi.
  • Malingaliro anga, yankho lothandiza kwambiri likufotokozedwa m'bukuli Kupitiliza kopitilira njira ya "kusokoneza". Lingaliro lalikulu ndiloti katundu wa kumasulidwa kulikonse ndi chiwerengero cha machenjezo owunikira, ndipo zosintha zokha zomwe sizikuwonjezera chiwerengero cha machenjezo ndizololedwa.

Ratchet

Zimagwira ntchito motere:

  1. Pa gawo loyambirira, zolembedwa mu metadata yotulutsidwa ya kuchuluka kwa machenjezo mu code yomwe owunikira amawunikira imakhazikitsidwa. Chifukwa chake, mukamamanga kumtunda, woyang'anira malo anu amalembedwa osati "kutulutsa 7.0.2", koma "kutulutsa 7.0.2 yomwe ili ndi machenjezo a 100500 Checkstyle". Ngati mukugwiritsa ntchito woyang'anira malo apamwamba (monga Artifactory), ndikosavuta kusunga metadata yotereyi ponena za kumasulidwa kwanu.
  2. Tsopano pempho lililonse kukoka pa kumanga akufanizira chiwerengero cha machenjezo amene amalandira ndi chiwerengero mu kumasulidwa panopa. Ngati PR imapangitsa kuti chiwerengerochi chiwonjezeke, ndiye kuti codeyo sichidutsa pachipata cha khalidwe mu kusanthula kosasintha. Ngati chiwerengero cha machenjezo chikuchepa kapena sichisintha, chimadutsa.
  3. Pakutulutsa kotsatira, machenjezo owerengedweratu adzalembedwanso ku metadata yotulutsidwa.

Chifukwa chake pang'onopang'ono, koma pang'onopang'ono (monga ndi ratchet), kuchuluka kwa machenjezo kumakhala zero. Inde, dongosololi likhoza kupusitsidwa poyambitsa chenjezo latsopano, koma kukonza la wina. Izi ndi zachilendo, chifukwa m'kupita kwa nthawi zimapereka zotsatira: machenjezo amakhazikitsidwa, monga lamulo, osati limodzi ndi limodzi, koma nthawi yomweyo ndi gulu la mtundu wina, ndipo machenjezo onse omwe amachotsedwa mosavuta amachotsedwa mwamsanga.

Chithunzichi chikuwonetsa kuchuluka kwa machenjezo a Checkstyle kwa miyezi isanu ndi umodzi yogwira ntchito ya "ratchet" yotere imodzi mwama projekiti athu otseguka. Chiwerengero cha machenjezo chatsika ndi dongosolo la kukula, ndipo izi zinachitika mwachibadwa, mofanana ndi chitukuko cha mankhwala!

Limbikitsani kusanthula kosasintha munjira, m'malo moyang'ana nsikidzi nazo

Ndimagwiritsa ntchito njira yosinthidwayi, ndikuwerengera padera machenjezo ndi gawo la polojekiti ndi chida chowunikira, zomwe zimapangitsa kuti pakhale fayilo ya YAML yokhala ndi metadata yapagulu yomwe imawoneka motere:

celesta-sql:
  checkstyle: 434
  spotbugs: 45
celesta-core:
  checkstyle: 206
  spotbugs: 13
celesta-maven-plugin:
  checkstyle: 19
  spotbugs: 0
celesta-unit:
  checkstyle: 0
  spotbugs: 0

Mudongosolo lililonse lapamwamba la CI, ratchet imatha kukhazikitsidwa pazida zilizonse zowunikira osadalira mapulagini ndi zida za chipani chachitatu. Aliyense wa analyzer amatulutsa lipoti lake m'malemba osavuta kapena mawonekedwe a XML omwe ndi osavuta kuwunikira. Zimatsalira kulembetsa malingaliro ofunikira mu script CI. Mutha kuwona momwe izi zimagwiritsidwira ntchito m'mapulojekiti athu otseguka ozikidwa pa Jenkins ndi Artifactory, mutha apa kapena apa. Zitsanzo zonsezi zimadalira laibulale ratchetlib: njira countWarnings() amawerengera ma tag a xml m'mafayilo opangidwa ndi Checkstyle ndi Spotbugs mwachizolowezi, ndi compareWarningMaps() imagwiritsa ntchito ratchet yomweyo, kuponya zolakwika pamene chiwerengero cha machenjezo m'magulu aliwonse chikukwera.

Kukhazikitsa kosangalatsa kwa ratchet ndikothekera pakusanthula kalembedwe ka ndemanga, zolemba, ndi zolemba pogwiritsa ntchito aspell. Monga mukudziwira, poyang'ana kalembedwe, si mawu onse osadziwika mumtanthauzira wamba omwe ndi olakwika, amatha kuwonjezeredwa ku mtanthauzira mawu. Ngati mupanga mtanthauzira mawu kukhala gawo la khodi ya pulojekiti, ndiye kuti chipata cha kalembedwe kalembedwe chikhoza kupangidwa motere: aspell execution ndi muyezo ndi mtanthauzira mawu. sayenera kutero musapeze zolakwika za kalembedwe.

Za kufunika kokonza mtundu wa analyzer

Pomaliza, zotsatirazi ziyenera kudziwidwa: ziribe kanthu momwe mungagwiritsire ntchito kusanthula mupaipi yanu yobweretsera, mtundu wa analyzer uyenera kukhazikitsidwa. Ngati mulola kuti analyzer asinthe mwachisawawa, ndiye pomanga pempho lotsatira kukoka, zolakwika zatsopano zikhoza "kutuluka" zomwe sizikugwirizana ndi kusintha kwa code, koma zikugwirizana ndi mfundo yakuti analyzer watsopano amatha kupeza zolakwika zambiri - ndi izi zidzaphwanya njira yovomereza zopempha zokoka. Kukweza analyzer kuyenera kukhala chinthu chozindikira. Komabe, kukonza molimbika mtundu wa gawo lililonse la msonkhano ndikofunikira kwambiri komanso mutu wokambirana.

anapezazo

  • Kusanthula kosasunthika sikungakupezereni nsikidzi ndipo sikungasinthe mtundu wa malonda anu chifukwa cha pulogalamu imodzi. Chokhacho chabwino pa khalidwe ndi ntchito yake mosalekeza pa nthawi yobereka.
  • Kupeza nsikidzi si ntchito yayikulu yowunikira konse, ntchito zambiri zothandiza zimapezeka mu zida zotsegulira.
  • Khazikitsani zipata zabwino potengera zotsatira za kusanthula kwa static pagawo loyamba la payipi yobweretsera, pogwiritsa ntchito ratchet yama code olowa.

powatsimikizira

  1. Kupitiliza kopitilira
  2. A. Kudryavtsev: Kusanthula pulogalamu: momwe mungamvetsetse kuti ndinu wolemba mapulogalamu abwino nenani za njira zosiyanasiyana zowunikira ma code (osati osakhazikika!)

Source: www.habr.com

Kuwonjezera ndemanga