2012-10-09 34 views
6

Tôi tự hỏi làm thế nào để giảm Độ phức tạp Cyclomatic của mã sau đây và nếu điều này thậm chí là một cái gì đó mà tôi nên lo lắng về.Làm cách nào để giảm "Độ phức tạp Cyclomatic" của mã sau đây

Vui lòng tham khảo ValuePojo.getSomething() phương pháp (Xin đừng lo lắng về việc đặt tên biến, điều này đã được tái bản cho rõ ràng trong câu hỏi này)

public class ValuePojo 
{ 
    private ValueTypeEnum type; 

    private BigDecimal value1; 

    private BigDecimal value2; 

    private BigDecimal value3; 

    public ValuePojo() 
    { 
     super(); 
    } 

    /** 
    * This method reports as "HIGH Cyclomatic Complexity" 
    * 
    * @return 
    */ 
    public BigDecimal getSomething() 
    { 
     if (this.type == null) 
     { 
      return null; 
     } 

     switch (this.type) 
     { 
      case TYPE_A: 
      case TYPE_B: 
      case TYPE_C: 
      case TYPE_D: 
       return this.value1; 

      case TYPE_E: 
      case TYPE_F: 
      case TYPE_G: 
      case TYPE_H: 
       return this.value2; 

      case TYPE_I: 
      case TYPE_J: 
       return this.value3; 
     } 

     return null; 
    } 
} 
+0

Độ phức tạp chu trình được báo cáo là gì? – Vikdor

+0

11 Tôi nghĩ, chỉ đủ cao để kích hoạt tình trạng ở Sonar nhưng không đến mức điên rồ. –

+2

Bạn có thể đẩy logic vào trong enum. –

Trả lời

5

Các Cyclomatic phức tạp được xác định bởi số lượng nhánh thực hiện trong mã của bạn. if - else khối, switch báo cáo - tất cả tăng độ phức tạp của Cyclomatic của mã của bạn và cũng tăng số lượng các trường hợp kiểm tra bạn sẽ cần phải đảm bảo bảo hiểm mã thích hợp.

Để giảm độ phức tạp trong mã của bạn, tôi khuyên bạn nên xóa các tuyên bố case không có hành vi được xác định và thay thế bằng hành vi default trong tuyên bố switch của bạn.

Dưới đây là một question trên Stack Overflows khác giải quyết vấn đề này.

+0

Cảm ơn câu trả lời, tôi đã xem xét chủ đề đó và không thể tìm thấy "giải pháp" giải quyết đầy đủ vấn đề của tôi. Tôi cũng không chắc là có vấn đề gì. –

+1

Tôi nghĩ rằng độ phức tạp của chu trình là một thước đo khá chủ quan. Bạn không cần phải lo lắng về việc thay đổi mã của bạn miễn là nó có thể đọc được và thực hiện công việc. Độ phức tạp cao về chu trình có thể trỏ đến các vấn đề trong mô hình đối tượng của bạn, nhưng tôi không nghĩ rằng điều này có liên quan đến ví dụ của bạn. – Luhar

+0

Ok. Cảm ơn những nỗ lực bạn đặt trong câu trả lời này –

8

Nếu bạn thực sự cần giảm độ phức tạp của chu trình, bạn có thể xem xét sử dụng Bản đồ. Rõ ràng, trong quá trình thực hiện của bạn, nó chỉ nên được tạo và khởi tạo một lần.

public BigDecimal getSomething() { 
     if (this.type == null) { 
      return null; 
     } 
     Map<Type,BigDecimal> map = new HashMap<Type,BigDecimal>(); 
     map.put(TYPE_A, value1); 
     map.put(TYPE_B, value1); 
     map.put(TYPE_C, value1); 
     map.put(TYPE_D, value1); 
     map.put(TYPE_E, value2); 
     map.put(TYPE_F, value2); 
     map.put(TYPE_G, value2); 
     map.put(TYPE_H, value2); 
     map.put(TYPE_I, value3); 
     map.put(TYPE_J, value3); 

     return map.get(type); 
    } 
+0

Giải pháp tò mò, cảm ơn ý tưởng. Thật không may trong trường hợp của tôi các giá trị có thể thay đổi để bản đồ sẽ phải được làm lại tất cả các thời gian. –

+0

Nếu bạn refactor value1 ... 3 để sử dụng getters và setters (mà bạn có lẽ nên làm anyway), đó không phải là một vấn đề. –

+15

Điều này không thực sự làm giảm độ phức tạp của chương trình, chỉ cần ẩn nó khỏi trình phân tích mã bằng cách di chuyển logic từ trường hợp chuyển sang bản đồ. – satellite779

Các vấn đề liên quan