600 likes | 856 Views
Statinės kodo analizės įrankiai. Julius Vitkauskas. Vilnius 2013. Planas. Trumpai apie statinę kodo analizę FxCop NDepend Nitriq StyleCop Išvados. Trumpai apie statinę kodo analizę. Statinė kodo analizė.
E N D
Statinės kodo analizės įrankiai Julius Vitkauskas Vilnius 2013
Planas • Trumpai apie statinę kodo analizę • FxCop • NDepend • Nitriq • StyleCop • Išvados
Statinė kodo analizė • Statinė (priešingai, negu dinaminė) kodo analizė yra vykdoma nepaleidžiant pačios programos. Dažniausiai analizuojami išeities tekstai, tačiau statinei analizei tinka ir objektinis kodas. Automatinę analizę galima atlikti pasitelkiant įvairius tam skirtus įrankius, „rankinė“ tokio tipo analizė – bandymas suprasti programos išeities tekstus, kodo peržiūros.
Įrankiai • Įrankius galima būtų suskirstyti į: • Kodo pažeidimų aptikimo įrankiai (angl. CodeviolationdetectionTools) • Kokybės metrikos įrankiai (angl. QualityMetricTools) • Stiliaus tikrinimo įrankiai (angl. Style CheckingTools)
FxCop • Nemokamas įrankis, turintis virš 200 įmontuotų kodo patikrinimų. • Tikrinami sukompiliuoti .dll/.exe failai, o ne išeities tekstai. • Galima apsirašyti savo taisykles .dll faile pasinaudojus FxCop SDK. • Prieinama tiek grafinė, tiek komandinės eilutės sąsaja.
FxCop • FxCop komandinės eilutės sąsaja gana gerai pritaikyta integracijai su kitais programinės įrangos procesą palaikančiais įrankiais: • Rezultatai gali būti išvedami XML formatu. • Rezultatams gali būti pritaikyta XSL transformacija. • Sėkmingos analizės metu gali būti sukurtas tai patvirtinantis failas.
FxCop - aprašymas <?xmlversion="1.0"encoding="utf-8"?> <RulesFriendlyName="MyCustomRules"> <RuleTypeName="AllTypeNamesShouldEndInTest" Category="CustomRules.Naming"CheckId="CR1234"> <Name>Alltypenamesshouldendin'Test'</Name> <Description>Alltypesshouldendin 'Test'‚ sothat I knowthey'retests.</Description> <Url>http://example.com/TestingRules</Url> <Resolution>The name oftype {0} doesnotendwiththesuffix 'Test'. Addthesuffix to thetype name.</Resolution> <MessageLevelCertainty="100">Warning</MessageLevel> <FixCategories>Breaking</FixCategories> <Email/> <Owner/> </Rule> </Rules>
FxCop - kodas publicoverrideProblemCollectionCheck(TypeNodetype) { if (!type.Name.Name.EndsWith("Test")) { varresolution = GetResolution(type.Name.Name); varproblem = newProblem(resolution, type) { Certainty = 100, FixCategory = FixCategories.Breaking, MessageLevel = MessageLevel.Warning }; Problems.Add(problem); } returnProblems; }
Visual Studio Achievements • Linksmas Visual Studio papildinys. Leidžia „atrakinti“ pasiekimus padarius vieną ar kitą dalyką. • Naudoja FxCop, veikia programos kompiliavimo metu.
Kas yra kodo kokybė? • Koks programos kodas yra kokybiškas? • Greitai veikiantis? • Kompaktiškas? • Lengvai plečiamas? • Lengvai palaikomas?
Kas yra kodo kokybė? • kokýbė sf. (1) J, kokỹbė (2) [K], NdŽ; SD74 • 1. daikto ypatybė, savybė: Visa tai, kuo viena medžiaga skiriasi nuo kitos, kas apibrėžia ją kaip tam tikrą medžiagą, mes vadiname medžiagos kokybe rš. Taigi ne tik kiekybė pereina į kokybę, bet ir atvirkščiai – kokybė pereina į kiekybę rš. Būdvardis aptaro daikto kokybę, būdą A.Baran. • 2. tinkamumo laipsnis: Pagerėjo gydomojo ir profilaktinio gyventojų aptarnavimo kokybė sp.Šieno kokybė priklauso ir nuo tinkamo išdžiovinimo sp.
Kas yra kodo kokybė? • Pažvelgę į kokybės apibrėžimą, galime padaryti išvadas, kad kodo kokybės vienareikšmiškai apibrėžti negalime ir matavimo įrankiai turi mums leisti apibrėžti ypatybes, pagal kurias galėsime vertinti kokybę (tinkamumo laipsnį).
NDepend • NDependyra .NET programų statinės analizės įrankis. Šis įrankis palaiko didelį kodo metrikų skaičių, leidžia vizualizuotipriklausomybes. Įrankiu taip pat galima palyginti skirtingas kodo versijas. Naudotojai gali aprašyti taisyklesLINQ užklausomis. Kodo taisyklės gali būti tikrinamos programoje, Visual Studio aplinkoje ar tęstinės integracijos metu.
NDepend Pagrindinės NDependgalimybės: • Priklausomybių vizualizacija (naudojant priklausomybių grafus ir priklausomybių matricas) • PĮ metrikos (NDependpalaiko 82 kodo metrikas: ciklomatinį sudėtingumą, sukibimo,rišlumo, kodo padengimo testais procentą ir t.t.) • Code Quality LINQ kalba išrinkti norimam kodui • Grafinis, komandinės eilutės ir Visual Studio interfeisai. • Kelių kodo versijų palyginimas
Ndepend - Grafas Pagal eilučių skaičių Pagal ciklomatinį sudėtingumą
Ndepend - CQLinq • Kurios klasės per sudėtingos? from t inJustMyCode.Typeswhere t.NbLinesOfCode > 500 || t.NbILInstructions > 3000 orderbyt.NbLinesOfCodedescending select new { t, t.NbLinesOfCode, t.NbILInstructions,t.Methods, t.Fields }
Ndepend - CQLinq • Kuris metodas pasudėtingėjo? from m in JustMyCode.Methods.Where(m1 => !m1.WasAdded())letoldComplexity = m.OlderVersion().CyclomaticComplexityletnewComplexity = m.CyclomaticComplexitywhereoldComplexity > 8 && oldComplexity < newComplexityselect new { m, oldComplexity, newComplexity }
Ndepend - CQLinq • Klasės be būsenos, kurias galima būtų paversti į statines? from t inJustMyCode.Typeswhere t.IsClass && !t.IsStatic && t.InstanceFields.Count() == 0 && t.NbInterfacesImplemented == 0 && t.NbChildren == 0 && t.DepthOfDeriveFrom("System.Object") == 1 select t
Ndepend - CQLinq • Ar yra tokių interfeisų, kurie neprasideda “I” raide? from t inJustMyCode.Types where t.IsInterface && t.Name[0] != 'I' select t
Ndepend - CQLinq • Kokiose klasėse yra blogas rišlumas? from t inJustMyCode.Typeswhere t.LCOMHS > 1 && t.NbFields > 10 && t.NbMethods >10 orderby t.LCOMHS descending select new { t,t.LCOMHS, t.NbMethods, t.NbFields }
NDepend • NDepend komandinės eilutės sąsaja gerai pritaikyta integracijai su kitais programinės įrangos procesą palaikančiais įrankiais: • Rezultatai gali būti išvedami XML formatu. • Rezultatams gali būti pritaikyta XSL transformacija.
Nitriq • Nitriq yra nemokamas įrankis, kuris kai kuriais atžvilgiais yra panašus į NDepend, tačiau turi mažiau galimybių. • Panašumai: • Naudojama Linq sintakse paremta kalba kodui išrinkti. • Ištrinkta kodo dalis parodoma vizualiai lange. • Galima sugeneruoti kodo atitikimo taisyklėms ataskaitą. • Skirtumai: • Nepalaikomas ryšių tarp kodo nustatymas (t.y. ryšių grafai, matricos) • Neveikia su naujausiomis Windows versijomis (8 / 8.1 / 2012 / 2012 R2)
Nitriq – LINQ • Kokius metodus reiktų pertvarkyti? from method in Methods where (method.Cyclomatic > 25 || method.PhysicalLineCount > 200 || method.TypesUsed.Count > 30) && method.Type.IsInCoreAssembly select new { method.MethodId, method.Name, method.Cyclomatic, method.PhysicalLineCount, OutTypes = method.TypesUsed.Count, method.ParameterCount };
Nitriq – LINQ • Kur yra per didelis paveldėjimo skaičius? from type in Types wheretype.InheritanceDepth > 5 select new { type.TypeId, type.Name, type.InheritanceDepth };
Nitriq – LINQ • Kurie laukai nėra niekada nustatomi? from field in Fields wherefield.SetByMethods.Count == 0 && field.IsPrivate && !field.IsConstant&& field.Type.IsInCoreAssembly select new { field.FieldId, field.Name, field.FullName };
Nitriq • Nitriq turi komandinės eilutės sąsają, tačiau ji gana ribota: • Ar buvo rasta klaidų, galima sužinoti iš proceso išeities kodo. • Detalesni rezultatai išvedami tik HTML formatu.