9

Tôi đang sử dụng câu lệnh chuyển đổi với 13 trường hợp, mỗi trường hợp chỉ có một giá trị trả về một dòng.Độ phức tạp của chu trình biến đổi McCabe trong Java

McCabe sơn màu đỏ. Có một cách dễ dàng hơn để viết một tuyên bố chuyển đổi lớn? Nó không có vẻ phức tạp để đọc, nhưng tôi không thích các thiết lập mặc định chuyển sang màu đỏ. Nếu người khác sử dụng cùng một công cụ trên mã của tôi và nhìn thấy công cụ màu đỏ, họ có thể nghĩ tôi là ngu ngốc :-)

Chỉnh sửa: Tôi đang lập bản đồ các loại SQL khác nhau cho các loại trừu tượng hơn của mình, do đó giảm tổng số tiền các loại.

case Types.TIME: 
    return AbstractDataType.TIME; 
case Types.TIMESTAMP: 
    return AbstractDataType.TIME; 
case Types.DATE: 
    return AbstractDataType.TIME; 
case Types.BIGINT: 
    return AbstractDataType.NUMERIC; 
case Types.DECIMAL: 
    return AbstractDataType.NUMERIC; 

và vân vân ...

+4

Sẽ dễ dàng hơn nếu bạn giải thích tại sao bạn có 13 trường hợp trong một chuyển đổi và lý do tại sao bạn không thể làm tương tự bằng cách sử dụng đa hình hoặc Bản đồ. –

+0

Đồng ý. Bạn có thể cho chúng tôi thấy mã không? – Kane

+0

Cảm ơn, hãy xem bản chỉnh sửa. –

Trả lời

6

Tôi không biết nhiều về công cụ McCabe. Một trong những điều phức tạp của Cyclomatic xem xét là nhiều điểm thoát.

Tôi thích ý tưởng EnumMap.

Nếu chuyển đổi sẽ được sử dụng, bạn có thể có biến kết quả và loại bỏ tất cả các câu lệnh trả lại. Bạn cũng có thể sụp đổ tất cả các giá trị nguồn mà có cùng một loại kết quả:

result = null; 

case Types.TIME: 
case Types.DATE: 
case Types.TIMESTAMP: result = AbstractDataType.TIME 

// etc. 

return result; 

Tôi nghĩ rằng điều này làm giảm sự phức tạp cyclomatic, bất kể những gì có ai nghĩ về nó như là phong cách. Và đó là một cách khác để viết lời tuyên bố, cho dù bạn có nên phán xét dễ dàng hơn hay không.

7

Bạn đang sử dụng mã để thể hiện dữ liệu thực sự là gì. Chỉ cần sử dụng một bản đồ enum hoặc xác định một lần cho tất cả một từ điển liên tục. Bằng cách này, bạn chỉ cần parametrizing một thuật toán tương ứng đơn giản và chung chung, thay vì viết một trường hợp chuyển đổi dài.

3

1 cho ý tưởng Map ...

Something như thế này:

Khởi tạo bản đồ

Map<Types, AbstractDataType> map = new HashMap<Types, AbstractDataType>(); 
map.put(Types.TIME, AbstractDataTypes.TIME); 
// and so on 

Sau đó, trong mã của bạn đơn giản làm

return map.get(sqlTimeType); 

Một thậm chí tuy nhiên, giải pháp tốt hơn là đưa bản đồ này vào chính enum để bạn có thể thực hiện ssuming bạn không có quyền kiểm soát các loại enum Sql ...

AbstractDataTypes.fromSqlType(timeType); 

và nếu bạn làm:

sqlTimeType.getAbstractType(); 

Encapsulated và Tái sử dụng được :-)

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