2011-09-14 29 views
6

Hiện tại tôi rất thú vị trong khung chơi vì khung này hứa hẹn phát triển nhanh hơn.Có bất kỳ tác dụng phụ nào khi sử dụng cho nhiều chức năng tĩnh không?

Khi tôi thấy mã, có quá nhiều mã tĩnh. ngay cả bộ điều khiển được khai báo là hàm tĩnh. Vì vậy, tất cả các mã được gọi là bên trong chức năng tĩnh phải được tĩnh phải không?

Câu hỏi của tôi là, phương pháp này có đúng không? có bất kỳ tác dụng phụ của việc sử dụng nhiều chức năng tĩnh?

+0

các phương thức tĩnh có thể gọi các phương thức không tĩnh được chuyển thành các đối số hoặc trong các trường tĩnh hoặc các đối tượng mà chúng tạo ra. Nó không thể gọi phương thức không tĩnh của cùng một lớp mà không có một cá thể. –

+0

@Peter: Bạn có thể xây dựng thêm vui lòng – indrap

Trả lời

7

Vài điều về phương pháp tĩnh trong ngôn ngữ hướng đối tượng: Hãy để tôi cố gắng giải thích các vấn đề nếu bạn chọn có tất cả các phương pháp tĩnh.

Sử dụng tất cả các hàm tĩnh có thể không phải là thành ngữ trong ngôn ngữ hướng đối tượng. Bạn không thể ghi đè các hàm tĩnh trong một lớp con. Do đó bạn mất khả năng thực hiện đa hình thời gian chạy bằng cách ghi đè.

Các biến mà bạn xác định tất cả trở thành biến lớp tự động (vì tất cả các phương thức của bạn là tĩnh), vì vậy về cơ bản bạn không có bất kỳ trạng thái nào liên kết với cá thể.

Phương pháp tĩnh khó giả lập. Bạn có thể cần các khung công tác như PowerMock để thực hiện việc nhạo báng cho bạn. Vì vậy, thử nghiệm trở nên khó khăn.

Thiết kế trở nên phức tạp một chút vì bạn sẽ không thể tạo các lớp không thay đổi được vì bạn thực sự chỉ có lớp và không có cá thể nào. Vì vậy, thiết kế các lớp học an toàn thread trở nên khó khăn.

+0

Để thử nghiệm, Play Framework sử dụng JUNIT4 và Selenium.Tôi nghĩ rằng đủ để tạo thử nghiệm đơn vị và kiểm tra hồi quy – indrap

+0

"Vì vậy, thiết kế các lớp an toàn chủ đề trở nên khó khăn" dựa trên nhận xét của bạn, nó không tốt để sử dụng khung chơi trong ứng dụng doanh nghiệp? – indrap

+0

Hãy để tôi làm rõ. Thiết kế một lớp cho tính bất biến là một cách để thiết kế một lớp thread-safe mà không cần phải giới thiệu đồng bộ hóa. Tất nhiên khi bạn cần thay đổi trạng thái cho đối tượng thì bạn phải tạo một thể hiện mới của lớp. Để xem ví dụ về lớp String. Nhưng nếu các phương pháp của bạn là tất cả tĩnh và tất cả những gì bạn có là các biến lớp, thì một lớp bất biến là không có câu hỏi, vì không có cá thể nào. Tôi không có ý nói rằng một lớp chỉ với các phương thức tĩnh không thể là chủ đề an toàn. – Aneesh

-3

Có tác dụng phụ khi sử dụng quá nhiều hàm hoặc biến tĩnh. Bạn nên tránh các khai báo tĩnh không cần thiết.

Vì các thành viên tĩnh luôn tạo không gian bộ nhớ khi lớp được tải trong JRE. Ngay cả khi bạn không tạo đối tượng của lớp, nó sẽ chiếm bộ nhớ.

+0

Vì bộ điều khiển sử dụng lớp tĩnh nên tất cả chức năng hoặc lớp được gọi là bộ điều khiển bên trong phải là tĩnh đến .. Tôi nghĩ trong trường hợp này, việc sử dụng tĩnh là khá cần thiết. – indrap

+3

Câu trả lời này không đúng. Một phương thức tĩnh sử dụng không nhiều hoặc ít không gian hơn một phương thức thể hiện. Và nó không tạo ra sự khác biệt cho dù một thể hiện của lớp được tạo ra hay không. –

+0

OP hỏi về _functions_ tĩnh, không phải tĩnh _fields_. Các trường tĩnh sẽ phân bổ không gian ngay khi lớp được nạp, trong khi các trường mẫu sẽ không phân bổ cho đến khi một cá thể được tạo ra (tuy nhiên, bộ nhớ được cấp cho một trường tĩnh chỉ được cấp phát một lần, nhưng các trường thể hiện cấp phát bộ nhớ bổ sung cho cá thể _every_). Như ghi chú @stephenc, nó không tạo ra sự khác biệt nào cho các phương thức. – Chadwick

1

Để xây dựng trên nhận xét của tôi.

phương pháp tĩnh có thể gọi các phương thức không tĩnh, miễn là bạn có một ví dụ về điều gì đó.

class A { 
    public void nonStaticMethod() { } 

    public static void staticMethod(String text) { 
     // calls non-static method on text 
     text.length(); 
     // calls non-static method on new Object 
     new Object().hashCode(); 
     // calls non static method on a instance of A 
     new A().nonStaticMethod(); 
    } 
} 
+1

tôi thấy bạn chỉ, cảm ơn bạn. Tôi có thể sử dụng google guice để tạo đối tượng instance sau đó sử dụng hàm không tĩnh trong controller – indrap

17

Câu hỏi này đã được hỏi theo cách tương tự trước đây. Câu trả lời đơn giản là Play sử dụng các số liệu thống kê mà nó hợp lý.

Mô hình HTTP không phải là mô hình OO. Bản thân các yêu cầu HTTP là không trạng thái, và do đó, các phương thức tĩnh cho phép truy cập vào các bộ điều khiển như các yêu cầu chức năng từ mã máy khách.

Các lớp Mô hình mặt khác là OO thuần túy, và kết quả là không nặng nề tĩnh. Một số phương thức tiện ích, chẳng hạn như findAll hoặc findById là tĩnh, nhưng các phương thức này không phải là statefull và là các phương thức tiện ích trên lớp. Tôi sẽ mong đợi điều này trong một mô hình OO tiêu chuẩn anyway.

Vì vậy, tôi không nghĩ có bất kỳ rủi ro nào khi thực hiện mọi thứ theo cách Play mong đợi. Nó có thể trông kỳ lạ, bởi vì nó thách thức tiêu chuẩn, nhưng nó làm như vậy vì lý do âm thanh.

+4

Đây là câu trả lời đúng vì nó liên quan cụ thể đến Play Framework. – Ryan

+1

Từ trang Cookbook Play page 15, nó cho thấy rằng người tạo đã giải quyết vấn đề này rất rõ ràng (play.classloading. enhancers.ControllerEnhancer) – indrap

+1

Thật vậy, anh ta đã làm. Guillaume là một chàng trai rất thông minh và nhóm Play đã thiết kế cấu trúc Play rất tốt. – Codemwnci

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