Post on 07-Feb-2018
©PITSSGmbH2015
©PITSSGmbH2015 1
Implementierung erster Klasse-
CodeQualität inPL/SQL
StephanLaRocca– ConsultingManager
Berlin,April26th 2016
©PITSSGmbH2015
©PITSSGmbH2015 2
3
LocationUSA
GermanyUK
17
Years oldfounded
in1999
80
Colleagueswell trained
highly experiencedspecialists
>500
Customerssatisfied
customers in40 countries
100%
Oracle Partnerspecialized
in Oracletechnologies
©PITSSGmbH2015
©PITSSGmbH2015
Motivation
3
Wenn es einen Weg gibt, etwas besser zu machen: finde ihn.ThomasAlvaEdison(1847-1931),amerik.Erfinder
©PITSSGmbH2015
©PITSSGmbH2015
Def inition Code Qualität
4
lesbar�
Code�
wartbar�
testbar
�
�DieDefinitionvonCode-Qualitätlässt sich unterscheiden nach:
�
�Wie leicht können andereEntwickler dieSoftwarebearbeiten
Wartbarkeit
�
Layout,Darstellung,verständlicheBenennungen
Lesbarkeit
�Modularisierung,wieleicht lässt sich derCodeautomatisch testen
Testbarkeit
©PITSSGmbH2015
©PITSSGmbH2015
Metrics
6
„Eine Softwarequalitätsmetrik ist eine Funktion, die eine Software-Einheit in einen Zahlenwert abbildet, welcher als Erfüllungsgrad einer Qualitätseigenschaft der Software-Einheit interpretierbar ist.“– IEEE Standard 1061, 1998[1]
wartbar
MauriceHowardHalstead Thomas J. McCabe
©PITSSGmbH2015
©PITSSGmbH2015
Halstead
7
wartbar
TrennungvonOperatorenundOperanden
create or replace function get_all_emails(p_adre_id in number)return varchar2is
v_emails varchar2(1000);begin
for i in (select adem_emailfrom adem_adressen_email
where adem_adre_id=p_adre_id) loopif v_emails is not null then
v_emails:=v_emails||';';end if;v_emails:=v_emails||i.adem_email;
end loop; return v_emails;
end;
©PITSSGmbH2015
©PITSSGmbH2015
Halstead
8
wartbarUnterschiedliche
Operatoren (nt)
Operanden (nd)
GrößedesVokabulars
Gesamtanzahl
Operatoren (Nt)
Operanden (Nd)
Länge desCode
N_Vocal N_Code
Halstead-Volume := N_Code * log2(N_Vocal)
©PITSSGmbH2015
©PITSSGmbH2015
Halstead
9
wartbar
Halstead-Volume := N_Code * log2(N_Vocal)
Code-Review (Komplexität) CRD := nt/2 * (Nd/nd)
Code-Review (Aufwand) CRA := CRD * HV
Zeit (Implementieren/Verstehen) := CRA/18 in Sekunden
HV = 31*log2(20) = 92CRD = 14/2 * (15/6)= 17,5CRA = 17,5 * 92 = 1.610
In 1:30 Min. verstanden
©PITSSGmbH2015
©PITSSGmbH2015
McCabe
10
wartbar
AnzahlderBinär-Verzweigungen
create or replace function get_all_emails(p_adre_id in number)return varchar2is
v_emails varchar2(1000);begin
for i in (select adem_emailfrom adem_adressen_email
where adem_adre_id=p_adre_id) loopif v_emails is not null then
v_emails:=v_emails||';';end if;v_emails:=v_emails||i.adem_email;
end loop; return v_emails;
end;
©PITSSGmbH2015
©PITSSGmbH2015
Npath-Complexity
11
wartbar
AnzahldermöglichenDurchläufe
create or replace function get_all_emails(p_adre_id in number)return varchar2is
v_emails varchar2(1000);begin
for i in (select adem_emailfrom adem_adressen_email
where adem_adre_id=p_adre_id) loopif v_emails is not null then
v_emails:=v_emails||';';end if;v_emails:=v_emails||i.adem_email;
end loop; return v_emails;
end;
©PITSSGmbH2015
©PITSSGmbH2015
CRAP
12
testbar
ChangeRisk Analysisand Predictions
Cyclomatic Complexity
CodeCoverage inProzent
©PITSSGmbH2015
©PITSSGmbH2015
CodingandNaming Convention
15
lesbar
create or replace function gea(p_1 in number)return varchar2 isve varchar2(1000);beginfor i in (select adem_email from adem_adressen_email
where adem_adre_id=p_1) loopif ve is not null then ve:=ve||';';end if;ve:=ve||i.adem_email;
end loop; return ve;end;
©PITSSGmbH2015
©PITSSGmbH2015
CodingandNaming Convention
16
lesbar
create or replace function get_all_emails(p_adre_id in number)return varchar2is
v_emails varchar2(1000);begin
for i in (select adem_emailfrom adem_adressen_email
where adem_adre_id=p_adre_id) loopif v_emails is not null then
-- Trennzeichen nicht an die erste Stelle setzenv_emails:=v_emails||';';
end if;v_emails:=v_emails||i.adem_email;
end loop; return v_emails;
end;
©PITSSGmbH2015
©PITSSGmbH2015
CodingandNaming Convention
17
lesbar�
�
�
�
NamingConvention
Lesbarkeit,Reg.Expression,
Kürzel,Sonderzeichen,Wiedererkennung
BestPractise
Globale Variablen,Magische
Konstanten,vermeideDeadCode NumberPrecission
SystemProtectionPerformanceAdvises
ContextSwitches,Subqueries,
Union
SQLInjection,Potentielle
Fehlerquellen
©PITSSGmbH2015
©PITSSGmbH2015
Messung conCode Qualität
19
lesbar�
Code�
wartbar�
testbar
�
�Messbare Größen helfen für dieVerbesserung:
�
�Halstead,McCabe,Wartbarkeit
�
AuditRulesLesbarkeit
Crap,CodeCoverageTestbarkeit
©PITSSGmbH2015
©PITSSGmbH2015
Container für PL/SQL
20
� � � �
Datenbank
�
Apex Forms Reports SkriptsPackages,
Prozeduren,
Funktionen
Prozesse Trigger,Units Triggers,
Libraries,Units
Insidefile
system,*.sql
©PITSSGmbH2015
©PITSSGmbH2015
Maßnahmen für bessere Qualität
23
Qualität� �
�
��
�
KommentareEin Entwickler verbringt
mehr Zeit mit SourceCode
lesen als schreiben
AnalyseDeadCodeundRedundanzen
entfernen.Nutzen von
Refakturierungen
�
CodingStandardsEtablieren Sie neben den
BestPractise eigene
Unternehmensstandards
� �
VersionskontrolleNutzen vonBranches,
CompilerFlags,
gesicherten Ständen
ProfilingPerformanceAnalysen,
Kontext Switche,
�
UnitTestsSQLDeveloper, OATS,
Aufzeichnung von
Testfällen, Testabdeckung
��
©PITSSGmbH2015
©PITSSGmbH2015
Best Practise
24
http://nyoug.org/Presentations/2006/200611_Steven_Feuerstein_Best_Practice_PLSQL/200611_Steven_Feuerstein_Best_Practice_PLSQL.pdf
©PITSSGmbH2015
©PITSSGmbH2015
Exemplarische Maßnahmen unterschiedlichst er Ebene
25
Verwende suchbare
Namen
Bedeutsame Namen
�
Warnen vor
Konsequenzen
Kommentare
�
ErrorHandlingist Error
Handling– nicht dieLogik
ErrorHandling
�
FIRST,Fast, Independent,Repeatable,
Self-Validating,Timely
UnitTests
�
Eine Funktion für eine
Aufgabe
Funktionen
�
Guter Codeist wie ein
guter Zeitungsartikel
Formatierung
�
Verlasse Dichaufnichts
Abgrenzung
�
Erweitern, Refakturieren,
spezifische Erweiterung
vs.GlobalPicture
Systems
�
©PITSSGmbH2015
©PITSSGmbH2015
Performance Checks
26
Besser:IF v_kreditlimit > c_max_limit AND check_kreditlimit(v_kreditlimit)
THEN ...
statt:IF check_kreditlimit(v_kreditlimit) AND v_kreditlimit > c_max_limit
THEN ...
Besser:
FORALL I IN 1..50000
INSERT INTO bulk_bind_beispiel
VALUES (feld1(i), feld2(i), feld3(i));
statt:
FOR I IN 1..50000 LOOP
INSERT INTO bulk_bind_beispiel
VALUES (feld1(i), feld2(i), feld3(i));
END LOOP;
©PITSSGmbH2015
©PITSSGmbH2015
Messung vonCodeQualität
28
lesbar�
Code�
wartbar�
testbar
�
�Messbare Größen helfen für dieVerbesserung:
�
�Halstead,McCabe,Wartbarkeit
�
AuditRulesLesbarkeit
Crap,CodeCoverageTestbarkeit
©PITSSGmbH2015
©PITSSGmbH2015
Einbindung in NightlyBuild
29
CommandLineInterfacefürLaden,Parsen,Bewerten
©PITSSGmbH2015
©PITSSGmbH2015
Einbindung in NightlyBuild
30
SelectScriptinnerhalbHUDSON–Auslösen vonFehlernfürE-MailBenachrichtigung
©PITSSGmbH2015
©PITSSGmbH2015
BoyScoutRule
32
Try and leave this world a little better than you found it…
Robert Stephenson Smyth Baden-Powell
©PITSSGmbH2015
©PITSSGmbH2015
Prozess zur Qualität
33
CodeConvention&Guidelines
Übernahme vorhandener und
entwickeln unternehmenseigener
Vorgaben
�
�
��
Mitarbeiter,TeamsKontinuierliche
Auseinandersetzung mit
dem Thema Qualität
AusbildungStandards
Als VerbesserungUndnicht umdie
Mitarbeiter anden
Pranger zu stellen
Reviews
KPIs,NightlyChecksAufzeichnen,
visualisieren und
sinnvolle Ziele definieren
Automatisierung
CompanyGoalKontinuierliche
Verbesserung der
Software-Qualität