Sonntag, 5. September 2010

CCD Review Practice

Das Refactoring und die Anwendung der Pfadfinderregel ist sinnvoll bei der Pflege einer Quellcodebasis. Man bedenke: Quellcode wird häufiger gelesen als geschrieben! Die Qualität des Quellcodes spiegelt sich in der Wartungsfreundlichkeit, Nachhaltigkeit, Verständlichkeit und partiell in der Robustheit wieder.

Quellcode Reviews werden häufig zur Verbesserung der Qualität eines Softwareproduktes und noch vor dem eigentlichen Refactoring eingesetzt. Erfahrene Software-Entwickler sehen sich bei einem Review den Quellcode an, um "Code Smells" und nicht der Konzeption konformer Implementierungen zu identifizieren. Unschönheiten im Quellcode, wie beispielsweise toter Quellcode, nicht aussagekräftige Kommentare und im allgemeinen Verstöße gegen CCD-Prinzipien werden beim Review protokolliert und an einen oder mehrere Entwickler zur Korrektur gegeben.

Das Protokoll mit den notierten "Code Smells" ist notwendig, sofern keine Unterstützung durch Werkzeuge in der Entwicklungsumgebung vorliegt. Erfahrungsgemäß ist es sinnvoll, "Code Smells" dort zu protokollieren, wo sie auftreten. Es bietet sich deshalb die Anwendung einer CCD-Annotation an. Mit der CCD-Annotation werden "Code Smells" im Quellcode gekennzeichnet und mit dem Quellcode eingecheckt. Entwickler, die mit der Korrektur beschäftigt sind, können die Stellen an denen die CCD-Annotation im Quellcode verwendet wird leicht finden und die Probleme beseitigen.

Anwendung der CCD-Annotation aus Sicht des Reviewers:
  1. Code Smells im Quellcode identifizieren
  2. Code Smells mit der CCD-Annotation kennzeichnen
  3. Quellcode in das Source Code Control System einchecken
  4. Entwickler, die Code Smells korrigieren sollen informieren
Anwendung der CCD-Annotation aus Sicht der mit der Korrektur beauftragten Entwickler:
  1. Finden der CCD-Annotation in Eclipse mit der Tastenkombination Shift-Ctrl-T
  2. Finden der Verwender der CCD-Annotation (gekennzeichnete Code Smells)
    mit der Tastenkombination Shift-Ctrl-G auf dem selektierten Klassennamen
    der CCD-Annotation
  3. Code Smells korrigieren
  4. CCD-Annotations aus dem Quellcode entfernen
  5. Quellcode in das Source Code Control System einchecken
  6. Reviewer über die Korrektur des Quellcodes informieren
Exemplarische Implementierung einer CCD-Annotation:

package ccd.java.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.SOURCE)
@Target({  
    ElementType.TYPE,
    ElementType.FIELD,
    ElementType.METHOD,
    ElementType.PARAMETER,
    ElementType.CONSTRUCTOR,
    ElementType.LOCAL_VARIABLE,
    ElementType.PACKAGE})  
public @interface CCD {
  
    /*   
        SMELL=Code Smell                   
        DIP=Dependency Inversion Principle (DIP)
        DRY=Don't Repeat Yourself (DRY)
        FCOI=Favour Composition over Inheritance (FCoI)
        IHP=Information Hiding Principle (IHP)
        ISP=Interface Segregation Principle (ISP)
        KISS=Keep It Simple Stupid (KISS)
        LOD=Law of Demeter (LOD)
        LSP=Liskov Substitution Principle (LSP)
        OCP=Open Closed Principle (OCP)      
        POLA=Principle of Least Astonishment (PoLA)      
        SLA=Single Level of Abstraction (SLA)
        SOC=Seperation of Concerns (SoC)      
        SRP=Single Responsibility Principle (SRP)
        TDA=Tell don't ask (TDA)      
        YAGNI=You ain't gonna need it (YAGNI)       
    */
    public enum Reason {
      
        SMELL, DIP, DRY, FCOI, IHP, ISP,
        KISS, LOD, LSP, OCP, POLA,
        SLA, SOC, SRP, TDA, YAGNI;
    };
      
    public enum Severity {
      
        IMMEDIATELY, CRITICAL, IMPORTANT, TRIVIAL, DOCUMENTATION
    };
      
    public enum Task {
      
        REVIEW,
        SCOUTING_RULE,
        SIMPLE_REFACTORING,
        COMPLEX_REFACTORING,
        REMOVE_CODE;
    }
  
    Reason reason() default Reason.SMELL;
    Severity severity() default Severity.IMPORTANT;
    Task task() default Task.REVIEW;
    String reviewer() default "";
    String assignedTo() default "";
    String dateAssigned() default "";
    String description() default "";
}

Die CCD-Annotation beinhaltet folgende Attribute:
  1. Grund des Code Smells
  2. Wichtigkeit der Korrektur
  3. Auszuführender Arbeitsschritt
  4. Kürzel des Reviewers
  5. Kürzel des Entwicklers, welcher die Korrektur leistet
  6. Datum der Zuweisung
  7. Kurzbeschreibung
Die Attribute der CCD-Annotation sind optional, können aber bei Bedarf ergänzt und als Muss-Attribute gekennzeichnet werden.

Anwendung der CCD-Annotation:

package ccd.java.annotation;

import ccd.java.annotation.CCD.Reason;
import ccd.java.annotation.CCD.Severity;
import ccd.java.annotation.CCD.Task;

public class CCDAnnotationTest {

    @CCD(reviewer = "JR",
               assignedTo = "KR",
               dateAssigned = "06.09.2010",
               reason = Reason.LOD,
               severity = Severity.IMPORTANT,
               task = Task.REVIEW)
    public void lodViolation() {

        // Verstoß gegen LOD
    }
   
    @CCD(reviewer = "JR",
               assignedTo = "KR",
               dateAssigned = "06.09.2010",
               reason = Reason.SMELL,
               severity = Severity.TRIVIAL,
               task = Task.REMOVE_CODE,
               description = "Falscher Kommentar bitte entfernen!")
    public void wrongComment() {

        /*
         * Ein falscher Kommentar
         */
    }
}

Der Rechtshinweis des Java Blog für Clean Code Developer ist bei der Verwendung und Weiterentwicklung des Quellcodes des Blogeintrages zu beachten.