2012-02-09 22 views
5

Trong một số mã Java cũ, tôi tìm thấy một lớp có chứa rất nhiều phương pháp mà tất cả sử dụng cùng một mã xử lý lỗi (try-catch với rất nhiều xử lý lỗi, khai thác gỗ và vân vân). Có vẻ như phương pháp đầu tiên đã được sao chép đơn giản và sau đó mã trong khối thử đã được điều chỉnh một chút. Đây là những gì nó về cơ bản trông giống như:Làm thế nào để đơn giản hóa một lớp với mã xử lý lỗi được sao chép của lô?

public class myClass{ 

    public void doSomething() { 
     try { 
      //do something 
     } catch (Exception e) { 
      //extensive error handling 
     } 
    } 

    public void doSomethingElse() { 
     try { 
      //do something else 
     } catch (Exception e) { 
      //extensive error handling, copy-pasted from the above method 
     } 
    } 

}

Làm thế nào có thể được đơn giản hóa này? Tôi không muốn thay đổi giao diện của lớp (nhiều), tôi chỉ muốn thoát khỏi các khối catch copy-dán, vì vậy mà chỉ có mã từ khối try chỉ nằm trong các phương pháp ban đầu.

Tôi nghĩ về việc sử dụng các mô hình Nhà máy Method, nơi một phương pháp thực hiện việc xử lý lỗi và gọi phương thức gốc trong khối try. Nhưng sau đó, tất cả các cuộc gọi sẽ phải trải qua phương pháp này.

Bất kỳ ý tưởng nào?

+1

Tại sao không thể bạn chỉ cần đặt mã phổ biến ở một phương pháp mà bạn gọi từ cả hai khối catch? – John3136

+0

tại sao bạn không chỉ cần viết một phương thức tĩnh trong một lớp xử lý ngoại lệ, được gọi trong khối catch? sau đó bắt khối sẽ chỉ có một vài hướng dẫn (gọi đến xử lý ngoại lệ, trả lại). – vulkanino

Trả lời

7

Đơn giản hóa nó giống như cách bạn đơn giản hóa tất cả các mã lặp đi lặp lại khác: Đặt mã lặp đi lặp lại trong một phương pháp, và gọi phương thức:

public void doSomething() { 
    try { 
     //do something 
    } catch (Exception e) { 
     handleError(e); 
    } 
} 

public void doSomethingElse() { 
    try { 
     //do something else 
    } catch (Exception e) { 
     handleError(e); 
    } 
} 

private void handleError(Exception e) { 
    //extensive error handling 
} 
+0

Nhưng sau đó bạn không phải làm instanceof specificException, instanceof otherSpecificException và như vậy? –

1

Bạn chỉ có thể trích xuất mã sao chép dán vào một phương pháp lấy tin một số Exception một đối số.

1

Trong Java, có lẽ là tốt nhất bạn sẽ nhận được chỉ đơn giản là phải rút ra khỏi các nội dung của khối catch vào một phương pháp mới. Mỗi phương pháp vẫn sẽ phải lặp lại:

try { 

} 
catch(Exception e) { handleError(e); } 

Nếu bạn muốn nhận được thêm súc tích hơn thế, bạn sẽ phải bắt đầu thực hiện một số điều kỳ lạ (như sử dụng các macro và chạy một tiền xử lý trong code).

Nếu bạn đang sử dụng một ngôn ngữ cấp cao như Clojure hoặc Ruby, bạn sẽ có nhiều lựa chọn, nhưng Java là khá hạn chế trong vấn đề này.

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