Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CSSplexity (Barcamp Salzburg)

CSSplexity (Barcamp Salzburg)

Mein Vortrag am Barcamp »The Next Web« an der FH Salzburg am 21. Oktober 2016 über die Anwendung von Komplexitätsmetriken auf eine Nicht-Programmiersprache.

Thomas Rasshofer

October 21, 2016
Tweet

More Decks by Thomas Rasshofer

Other Decks in Programming

Transcript

  1. »Not everything that can be counted counts. Not everything that

    counts can be counted.« »You can‘t control what you can‘t measure«
  2. KRITIERIEN FÜR GUTE METRIKEN ▸ Objektivität: Keine subjektiven Einflüsse ▸

    Zuverlässigkeit: Gleiche Ergebnisse bei Wiederholung ▸ Normierung: Messergebnisskala und Vergleichbarkeitsskala ▸ Vergleichbarkeit: Maß mit anderen Maßen in Relation setzbar
  3. KRITIERIEN FÜR GUTE METRIKEN ▸ Ökonomische Effizienz: Minimale Kosten ▸

    Nützlichkeit: Messbare Erfüllung praktischer Bedürfnisse ▸ Validität: Schluss von messbaren Größen auf andere Kenngrößen
  4. LOC

  5. LINES OF CODE So einfach wie unaussagekräftig (→ Nützlichkeit und

    Validität) ▸ Zeilen mit »echtem« Code ▸ Zeilen mit Kommentaren (insgesamt vs. einzeilig vs. Blöcke) ▸ Zeilen mit Code und Kommentaren ▸ Leere Zeilen
  6. !

  7. ZYKLOMATISCHE KOMPLEXITÄT Eine statische Quellcode-Metrik, die durch Erstellung eines Kontrollflussgraphen

    berechnet wird. Definiert als Anzahl linear unabhängiger Pfade durch den Fluss des Quellcodes des Programms. !
  8. ZYKLOMATISCHE KOMPLEXITÄT Unabhängige Pfade sind definiert als Pfade, die zumindest

    eine Kante besitzen, die in keinem anderen Pfad durchlaufen wurde. Kontrollfluss bildet ein Programm als Graph ab, bestehend aus Knoten (Nodes) und Kanten (Edges). !
  9. ZYKLOMATISCHE KOMPLEXITÄT Kann durch folgende Formel berechnet werden… ▸ =

    Anzahl der Kanten (Edges) im Graphen ▸ = Anzahl der Knoten (Nodes) im Graphen ▸ = Anzahl der Knoten (Nodes) mit Exit-Points
  10. ZYKLOMATISCHE KOMPLEXITÄT In einem binären Kontext kann sie wie folgt

    berechnet werden… ▸ = Anzahl der Binärverzweigungen (= Knoten, die eine Bedingung enthalten) (»Anzahl an Entscheidungen plus Eins«)
  11. ZYKLOMATISCHE KOMPLEXITÄT Komplexitätszahlen und ihre Entsprechungen ▸ 1–10 = strukturiert

    und gut geschrieben, geringes Risiko ▸ 11–20 = komplex, erträgliches Risiko ▸ 21–50 = sehr komplex, hohes Risiko ▸ >50 = untestbar, extrem hohes Risiko
  12. ZYKLOMATISCHE KOMPLEXITÄT Prinzipiell die Anzahl der IFs/ELSEs sowie die Ermittlung

    der Anzahl der Pfade durch das Programm. (= Anzahl der möglichen Ergebnisse der gegebenen Bedingungen) Faustregel: Je kleiner die zyklomatische Komplexität eines Programms, desto einfacher ist es, es zu verstehen, desto geringer ist das Risiko, es zu modifizieren.
  13. ZYKLOMATISCHE KOMPLEXITÄT BEI CSS Angewandt auf CSS, sprechen wir von

    der Anzahl der Entscheidungen, die ein Browser treffen muss, ob er ein Element styled oder nicht. Faustregel: Jeder Teil eines CSS-Selektors ist ein IF-Statement. Aus je mehr IF-Statements ein Selektor besteht, desto größer ist seine zyklomatische Komplexität.
  14. ZYKLOMATISCHE KOMPLEXITÄT BEI CSS spiegel.de .column-wide .asset-list-box-hp-special ul li div.video-pic

    div.image-buttons-panel a span.button.btn-video-text tesla.com .footer-publisher__row--more
  15. SELEKTOREN = SUBJEKTE + KONDITIONEN .column-wide .asset-list-box-hp-special ul li div.video-pic

    div.image-buttons-panel a span.button.btn-video-text { // Do something } ▸ Subjekt (um was es geht): .btn-video-text ▸ Kondition (unnötige Komplexität): .column-wide .asset- list-box-hp-special ul li div.video-pic div.image-buttons-panel a span.button
  16. HALSTEAD-METRIKEN ▸ = Anzahl der einzigartigen Operatoren ▸ = Anzahl

    der einzigartigen Operanden ▸ = Gesamtanzahl der Operatoren ▸ = Gesamtanzahl der Operanden
  17. HALSTEAD-METRIKEN if (a < 5) { if (a > 10)

    b = b * a; } Einzigartige Operatoren: if, (, ), {, }, >, <, =, *, ; Einzigartige Operanden: a, 5, 10, b
  18. HALCSSTEAD IF (is_child()) { IF (is_pseudo_element('first-line')) { IF (is_on('div')) {

    IF (is_adjacent_sibling()) { IF (is_class('active')) { IF (is_id('content')) { IF (is_on('a')) { … } } } } } } }
  19. Jedes Mal, wenn du qualifizierst oder verschachtelst, fügst du ein

    neues IF-Statement hinzu. Behalte diese IFs stets im Hinterkopf, um deine Selektoren vernünftig/sinnvoll zu halten.
  20. Halte die (zyklomatische) Komplexität minimal. Verwende Tools wie CSSplexity, Parker

    oder analyze-css, um Metriken zu deinen Selektoren zu erhalten.
  21. Wenn eine Verschachtelung nicht wirklich notwendig ist, dann füge sie

    auch nicht ein. Manchmal ist Verschachteln in CSS notwendig, meistens nicht.
  22. Lies deine Selektoren von rechts. Beginne mit dem Teil, den

    du eigentlich benötigst. Stelle so wenig zusätzliches CSS voran wie möglich, um das korrekte Ergebnis zu erzielen.
  23. Keine Hacks beim Sinn und Zweck des Selektors. Stelle sicher,

    dass du die Selektoren schreibst, die du benötigst, nicht die, die gerade irgendwie funktionieren.
  24. ABSCHLIESSENDE WORTE Metriken müssen für Anwendungszwecke justiert werden. Es gibt

    keine allgemeingültigen Standards. Definiert euer eigenes Set an Metriken und ihre Maxima für euer Projekt. Metriken sind kein Ersatz für Revisionen, Tests oder Verifizierungen.