2012-01-08 52 views
23

thể trùng lặp:
Who needs singletons?thực hành tốt nhất trên lớp singleton PHP

Tôi luôn viết liên quan đến thực hành tốt nhất, nhưng tôi cũng muốn hiểu tại sao một điều nhất định là một thực hành tốt nhất.

Tôi đã đọc trong một bài viết (không may là tôi không nhớ) rằng các lớp singleton được ưa thích được khởi tạo, thay vì được tạo bằng các hàm tĩnh và được truy cập với toán tử phân giải phạm vi (: :). Vì vậy, nếu tôi có một lớp có chứa tất cả các công cụ của tôi để xác nhận, trong ngắn hạn:

class validate { 
    private function __construct(){} 
    public static function email($input){ 
     return true; 
    } 
} 

Tôi đã nói điều này được coi thực hành xấu (hoặc ít nhất là cảnh báo chống lại), vì những thứ như các thu gom rác và bảo dưỡng. Vì vậy, những gì phê bình của "singleton class như là phương pháp tĩnh" muốn, là tôi nhanh chóng một lớp tôi là 100% nhất định tôi sẽ chỉ bao giờ nhanh chóng một lần. Đối với tôi, nó có vẻ giống như "làm việc gấp đôi", bởi vì tất cả đã sẵn sàng ở đó. Tôi đang thiếu gì?

Quan điểm về vấn đề này là gì? Tất nhiên nó không phải là một vấn đề sống và chết, nhưng người ta cũng có thể làm một điều đúng cách, nếu tùy chọn là có :)

+1

có thể trùng lặp của [Ai cần singletons?] (Http://stackoverflow.com/a/4596323/208809) – Gordon

Trả lời

51
+1

Cảm ơn các liên kết; Đã đọc chúng. Tôi nghĩ rằng tôi có thể đã hiểu sai những gì một singleton là mặc dù (được chỉ ra trong trả lời dưới đây) –

+0

@ MarkHünermundJensen Nghĩ như vậy đọc câu hỏi của bạn. Tats tại sao đăng các liên kết;). – ThinkingMonkey

+1

Xin lưu ý Dependency Injection không bằng Dependency Injection Container. DI chắc chắn là một điều tốt; DIC là một cách để thực hiện điều này và không nhất thiết phải là một giải pháp phù hợp với mọi kích cỡ (mặc dù thực tế là nó có nhiều "thịnh hành" trong thế giới PHP tại thời điểm này). Một Service Locator hoặc mẫu tương tự cũng có thể là một cách chấp nhận được để phá vỡ các phụ thuộc. – liquorvicar

2

Vâng, đây không thực sự là một singleton; một singleton đảm bảo rằng bạn chỉ có một cá thể của một lớp, và không có phương thức nào ở đây sẽ lấy ra một cá thể của Validate. Thiết kế của bạn ở đây dường như là một lớp tĩnh. Điều này sẽ không gây ra vấn đề với bộ thu gom rác (ít nhất là mã bạn đã đặt ở đây), bởi vì điều này sẽ được nạp vào bộ nhớ bất kể là gì.

+0

Điều đó chắc chắn sẽ giải thích tại sao tôi không thể tìm thấy logic trong đó loại lớp học sẽ là một vấn đề. Vì vậy, một singleton không phải là nói một lớp mà chỉ là instantiated một lần, nhưng phương pháp này là-chỉ được gọi là một lần? –

5

Một đối tượng singleton là một đối tượng mà chỉ được khởi tạo một lần. Đó không phải là giống như Singleton Pattern, mà là một (Chống) Pattern làm thế nào để viết một lớp mà thể được chỉ khởi tạo một lần, các Singleton (lớn S ngay từ đầu):

“Đảm bảo một lớp chỉ có một cá thể, và cung cấp một điểm truy cập toàn cầu cho nó.”

Theo như PHP liên quan, bạn thường không cần triển khai Mẫu Singleton. Trong thực tế, bạn nên tránh làm điều đó khi bạn yêu cầu thực hành tốt nhất, bởi vì nó là thực hành không tốt.

Ngoài ra, hầu hết các ví dụ về mã PHP mà bạn tìm thấy là việc triển khai một nửa mẫu sẵn sàng bỏ qua cách thức hoạt động của PHP. Các triển khai không có thật này không phù hợp với "đảm bảo" trong mẫu.

Điều này cũng cho biết điều gì đó: Thường thì không cần thiết. Nếu việc triển khai cẩu thả thực hiện công việc trong khi thậm chí không đến gần với mẫu, mẫu sai đã được sử dụng cho tình huống, nó bắt đầu trở thành Anti-Pattern.

Trong PHP thường không cần phải đảm bảo bằng mọi chi phí mà một lớp chỉ có một thể hiện, các ứng dụng PHP không phức tạp đến mức bạn cần (ví dụ không có nhiều luồng có thể cần tham chiếu đến nguyên tử ví dụ).

Điều thường bị bỏ qua là điểm truy cập toàn cục đối với cá thể lớp, đó là điều mà hầu hết các nhà phát triển PHP (sử dụng sai) đều sử dụng mẫu đó. Như nó được biết đến như ngày nay, việc sử dụng "Singletons" như vậy dẫn đến các vấn đề tiêu chuẩn của trạng thái tĩnh toàn cầu, đưa sự phức tạp vào mã của bạn trên nhiều cấp độ và giảm khả năng sử dụng lại. Là một lập trình viên, bạn mất khả năng sử dụng mã của mình một cách linh hoạt. Nhưng tính linh hoạt là một kỹ thuật rất quan trọng để giải quyết vấn đề. Và các lập trình viên đang giải quyết các vấn đề cả ngày.

Vì vậy, trước khi áp dụng Mẫu thiết kế ưu và nhược điểm cần được đánh giá. Chỉ cần sử dụng một số mẫu thường xuyên nhất là không hữu ích.

Để bắt đầu tôi sẽ nói, chỉ cần viết các lớp học của bạn và chăm sóc như thế nào và khi chúng được instantiated trong một số phần khác của logic ứng dụng của bạn để mọi thứ được giữ linh hoạt.

+0

Câu trả lời hay - Cảm ơn bạn :) –

+3

Cụm từ đầu tiên của bạn là mâu thuẫn :). -1. Ngoài ra -1 cho "các ứng dụng PHP không phức tạp". Bạn có thể viết phần mềm phức tạp bằng bất kỳ ngôn ngữ nào. Các mẫu thiết kế có liên quan đến kiến ​​trúc phần mềm không liên quan đến công nghệ underlaieing. Tôi sẽ triplle downvote nhưng tôi không thể. :) –

+0

@Geo C. Một lý do tại sao tôi đã viết như vậy là các ứng dụng PHP thường không cần atomicity trên các quy trình và luồng mà là một trường hợp sử dụng các trình đơn an toàn thread trong * nhiều phần mềm phức tạp hơn. Bạn có lẽ đánh giá quá nhanh bởi vì bạn nghĩ rằng đã tấn công một số ngôn ngữ cụ thể, nhưng đó không phải là trường hợp. Nó chỉ là mã PHP phổ biến không cần thực hiện mẫu. Trong trường hợp bạn vẫn cần nó, tôi thậm chí cung cấp mô hình đó trên blog của tôi. – hakre

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