2008-10-28 30 views
21

Ví dụ:Suy nghĩ của bạn về các hằng số phạm vi phương pháp là gì?

public void doSomething() { 

    final double MIN_INTEREST = 0.0; 

    // ... 
} 

Cá nhân, tôi thà nhìn thấy những hằng số thay tuyên bố tĩnh ở cấp lớp. Tôi cho rằng tôi đang tìm kiếm một "quan điểm của ngành" về vấn đề này.

+0

Có lợi thế sử dụng bộ nhớ nào để khai báo hằng số ở cấp lớp trái ngược với mức phương thức, nếu lớp đó là Singleton? Bất kỳ suy nghĩ nào: @Chris Cudmore – Adam

Trả lời

16

Vị trí bắt đầu của tôi là mọi biến hoặc hằng số phải được khai báo/khởi tạo gần với lần sử dụng đầu tiên nhất có thể/thực tế (tức là không phá vỡ một khối mã logic một nửa, chỉ để khai báo một vài dòng gần hơn) , và scoped càng chặt càng tốt. - Trừ khi bạn có thể cho tôi một lý do chết tiệt lý do tại sao nó nên khác nhau.

Ví dụ: kết quả phạm vi phương pháp sẽ không hiển thị trong API công khai. Đôi khi bit thông tin này có thể được bỏ hữu ích cho người dùng của lớp học của bạn, và nên được di chuyển lên.

Trong ví dụ bạn đưa ra câu hỏi, tôi có thể nói rằng MIN_INTEREST có lẽ là một trong những mẩu thông tin mà người dùng muốn nắm tay, và nó phải được đưa vào lớp chứ không phải là phương pháp. (Mặc dù, không có ngữ cảnh đối với mã ví dụ và giả định của tôi có thể hoàn toàn sai.)

29

Tôi nghĩ rằng bạn chỉ nên đặt chúng ở cấp lớp nếu chúng được sử dụng bởi nhiều phương pháp. Nếu nó chỉ được sử dụng trong phương pháp đó thì có vẻ ổn với tôi.

+0

Cảm ơn ớn lạnh. Tôi đã suy nghĩ theo hướng đó, nhưng tò mò muốn nghe nếu có bất kỳ lý do gì để tránh tuyên bố phương pháp. Ví dụ, tôi tìm thấy quá nhiều contstants tuyên bố trong phương pháp để được distracting từ logic. – Liggy

+0

Tôi hoàn toàn đồng ý, tôi nghĩ rằng điều quan trọng là giữ giá trị không đổi càng gần càng tốt nơi nó đang được sử dụng, vì vậy theo thời gian bạn tự nhiên kết thúc xem xét các hằng số để đảm bảo chúng vẫn có ý nghĩa. Như đã lưu ý, nếu có nhiều hơn một phương pháp sử dụng nó thì hằng số phải là cấp lớp. –

+0

Nếu hằng số chứa một phần thông tin mà người dùng muốn nhận được trên tay (giá trị mặc định), thì nó sẽ được đặt ở cấp lớp. Trong câu trả lời của tôi dưới đây, tôi đã cho thấy rằng MIN_INTEREST có thể cần phải truy cập được thông qua api công cộng, và do đó, nên được scoped ở lớp. –

1

Lý do tại sao bạn có thể xác định biến cuối cùng ở cấp lớp hoặc cấp phương thức (cục bộ) vì bạn có thể ghi đè hằng số tĩnh chung bên trong phương thức (cục bộ).

Ví dụ:

public class Test { 

    final double MIN_INTEREST = 0.0; 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) { 


     Test test = new Test(); 

     test.doSomethingLocal(); 
     test.doSomethingGlobal(); 

    } 

    public void doSomethingGlobal() { 

     System.out.println("Global-> " + MIN_INTEREST); 

    } 

    public void doSomethingLocal() { 

     final double MIN_INTEREST = 0.1; 

     System.out.println("Local-> " + MIN_INTEREST); 

    } 
} 

Kết quả sẽ là:

Local-> 0.1 
Global-> 0.0 

Vì vậy, câu hỏi của bạn không thực hiện bất kỳ ý nghĩa.

+0

Xin lỗi nếu câu hỏi có chút không rõ ràng. Tôi sẽ thuật lại câu hỏi. Phương pháp biến đổi phạm vi phương pháp có thực thi phổ biến không? Tôi nghĩ rằng chills42 cung cấp một câu trả lời khá âm thanh. – Liggy

2

Tôi đã sử dụng phương pháp này hằng số phạm vi bản thân mình nhưng mọi người thường xuyên sẽ giảm mod trong quá trình đánh giá mã. Một lần nữa, các đồng nghiệp này không đọc/viết mã nguồn mở nhưng chúng được sử dụng cho phần mềm doanh nghiệp.

Tôi nói với họ rằng KHÔNG có ý nghĩa khi sử dụng hằng số cấp lớp nếu nó được sử dụng trong một phương pháp duy nhất nhưng tôi đã tìm thấy hơn 1 đồng nghiệp nhấn mạnh rằng nó được chuyển lên. Tôi thường tuân thủ vì tôi không cứng nhắc như vậy trừ khi nó ảnh hưởng đến khả năng đọc và/hoặc hiệu suất.

3

Ẩn và mô đun thông tin là các nguyên tắc chính và phạm vi hẹp là ẩn thông tin tốt hơn. Nếu hằng số chỉ cần bằng phương pháp, việc ẩn là tốt. Nếu và khi hằng số hữu ích ở nơi khác, hãy mang nó đến phạm vi rộng hơn, nhưng chỉ rộng rãi khi cần.

Bạn có thể quan tâm vì đây là một hằng số và do đó, nó có vẻ như thuộc về một số bảng thuộc tính chung. Có thể nó. Có lẽ nó không. Mối quan tâm của bạn là hợp lệ, nhưng không có nơi nào tốt nhất cho tất cả các hằng số.

1

Tôi có một mất khác nhau về vấn đề này: IMHO của nó tốt hơn để đặt chúng vào tập tin/phạm vi lớp học đặc biệt là nếu bạn đang làm việc theo nhóm vì lý do này: nói rằng bạn bắt đầu với một đoạn mã nhỏ .. .

public void doSomething() { 

    final double MIN_INTEREST = 0.0; 

    // ... 
} 

và các thành viên của bạn đội mở rộng lớp học với toàn bộ loạt các phương pháp và bây giờ là lớp là một tuyệt vời 500 lines/50 methods lớp khổng lồ. Hãy tưởng tượng trải nghiệm của một kỹ sư đang cố gắng thêm một phương thức mới với hằng số, họ sẽ phải 1 quét toàn bộ lớp tìm kiếm các hằng số phù hợp với nhu cầu của họ, 2 di chuyển hằng số đến phạm vi lớp với hy vọng rằng không có xung đột với hiện tại mã và 3 cũng thêm phương thức của chúng.

Nếu bạn thay thế tất cả các hằng số ở phạm vi tệp/lớp để bắt đầu, các kỹ sư có một vị trí đơn để tìm các hằng số hiện tại và 2 lấy một số hằng số từ những người khác. (ví dụ: nếu bạn có hằng số cho pi, bạn cũng có thể muốn xác định một hằng số mới có giá trị là pi/2).

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