Ai cần singletons trong PHP?
Lưu ý rằng hầu hết tất cả sự phản đối đối với người độc thân đều xuất phát từ quan điểm kỹ thuật - nhưng họ cũng bị RẤT hạn chế trong phạm vi của họ. Đặc biệt là đối với PHP. Đầu tiên, tôi sẽ liệt kê một số lý do cho việc sử dụng singletons, và sau đó tôi sẽ phân tích những phản đối đối với việc sử dụng singletons. Đầu tiên, những người cần chúng:
- Những người đang mã hóa một khung / codebase lớn, sẽ được sử dụng trong nhiều môi trường khác nhau, sẽ phải làm việc với các khung / cơ sở mã khác nhau hiện có trước đây, với sự cần thiết phải thực hiện nhiều yêu cầu khác nhau, thậm chí thay đổi từ khách hàng / ông chủ / quản lý / lãnh đạo đơn vị làm.
Xem, mô hình singleton là bao gồm tự. Khi hoàn thành, một lớp singleton cứng nhắc trên bất kỳ mã nào bạn đưa nó vào và nó hoạt động chính xác như cách bạn tạo các phương thức và biến của nó. Và nó luôn luôn là cùng một đối tượng trong một yêu cầu nhất định. Vì nó không thể được tạo hai lần để trở thành hai đối tượng khác nhau, bạn biết đối tượng singleton là gì tại bất kỳ điểm đã cho nào trong mã - ngay cả khi singleton được chèn vào hai, ba cơ sở mã spaghetti khác nhau, thậm chí cũ. Do đó, nó giúp dễ dàng hơn về các mục đích phát triển - ngay cả khi có nhiều người làm việc trong dự án đó, khi bạn thấy một singleton được khởi tạo ở một điểm trong bất kỳ cơ sở mã nào, bạn sẽ biết nó là gì, nó làm gì, làm thế nào hiện và trạng thái của nó. Nếu đó là lớp truyền thống, bạn sẽ cần theo dõi xem đối tượng đó được tạo ra lần đầu tiên ở đâu, phương thức nào được gọi trong đó cho đến thời điểm đó trong mã và trạng thái cụ thể của nó. Tuy nhiên, hãy thả một singleton ở đó, và nếu bạn bỏ các phương thức gỡ lỗi và thông tin thích hợp và theo dõi vào singleton trong khi mã hóa nó, bạn sẽ biết chính xác nó là gì. Do đó, điều đó giúp những người phải làm việc với các cơ sở mã khác nhau dễ dàng hơn, với sự cần thiết phải tích hợp mã được thực hiện trước đó với các triết lý khác nhau hoặc được thực hiện bởi những người bạn không liên hệ. (nghĩa là, nhà cung cấp-dự án-công ty-bất cứ điều gì không còn nữa, không hỗ trợ gì cả). nó giúp những người phải làm việc với các cơ sở mã khác nhau dễ dàng hơn, với sự cần thiết phải tích hợp mã được thực hiện trước đó với các triết lý khác nhau hoặc được thực hiện bởi những người bạn không liên hệ. (nghĩa là, nhà cung cấp-dự án-công ty-bất cứ điều gì không còn nữa, không hỗ trợ gì cả). nó giúp những người phải làm việc với các cơ sở mã khác nhau dễ dàng hơn, với sự cần thiết phải tích hợp mã được thực hiện trước đó với các triết lý khác nhau hoặc được thực hiện bởi những người bạn không liên hệ. (nghĩa là, nhà cung cấp-dự án-công ty-bất cứ điều gì không còn nữa, không hỗ trợ gì cả).
- Những người cần làm việc với bên thứ ba API , dịch vụ và trang web .
Nếu bạn nhìn kỹ hơn, điều này không quá khác biệt so với trường hợp trước đó - API, dịch vụ, trang web của bên thứ ba, giống như các cơ sở mã hóa bên ngoài, bị cô lập mà bạn KHÔNG có quyền kiểm soát. Chuyện gì cũng có thể xảy ra. Vì vậy, với một phiên người dùng / lớp người dùng, bạn có thể quản lý BẤT K type loại thực hiện phiên / ủy quyền nào từ các nhà cung cấp bên thứ ba như OpenID , Facebook , Twitter và nhiều hơn nữa - và bạn có thể thực hiện TẤT CẢ những điều này cùng một lúc từ đối tượng đơn SAME - có thể truy cập dễ dàng, ở trạng thái đã biết tại bất kỳ điểm nào trong bất kỳ mã nào bạn cắm nó vào. Bạn thậm chí có thể tạo nhiều phiên cho nhiều API / dịch vụ bên thứ ba khác nhau cho người dùng CÙNG trong trang web / ứng dụng của riêng bạn và làm bất cứ điều gì bạn muốn làm với họ.
Tất nhiên, tất cả những điều này cũng có thể đồng điệu với các phương thức truyền thống bằng cách sử dụng các lớp và đối tượng bình thường - điều đáng chú ý ở đây là, singleton gọn gàng hơn, gọn gàng hơn và do đó có thể quản lý / kiểm tra dễ dàng hơn so với việc sử dụng lớp / đối tượng truyền thống trong các tình huống như vậy.
- Những người cần phát triển nhanh
Hành vi giống như toàn cầu của singletons giúp dễ dàng xây dựng bất kỳ loại mã nào với khung có tập hợp các singletons để xây dựng, bởi vì một khi bạn xây dựng tốt các lớp singleton của mình, các phương thức được thiết lập, trưởng thành và thiết lập sẽ dễ dàng có sẵn và có thể sử dụng mọi lúc, mọi nơi, một cách nhất quán. Phải mất một thời gian để trưởng thành các lớp học của bạn, nhưng sau đó, chúng là đá vững chắc và nhất quán, và hữu ích. Bạn có thể có nhiều phương thức trong một singleton làm bất cứ điều gì bạn muốn, và mặc dù điều này có thể làm tăng dung lượng bộ nhớ của đối tượng, nó mang lại sự tiết kiệm nhiều thời gian hơn cần thiết cho sự phát triển nhanh chóng - một phương pháp bạn không sử dụng trong một ví dụ cụ thể một ứng dụng có thể được sử dụng trong một ứng dụng tích hợp khác và bạn có thể sử dụng một tính năng mới mà khách hàng / sếp / người quản lý dự án yêu cầu chỉ bằng một vài sửa đổi.
Bạn có được ý tưởng. Bây giờ chúng ta hãy chuyển sang sự phản đối đối với những người độc thân và cuộc thập tự chinh không lành mạnh chống lại điều gì đó hữu ích :
- Phản đối quan trọng nhất là nó làm cho việc kiểm tra khó khăn hơn.
Và thực sự, nó ở một mức độ nào đó, ngay cả khi nó có thể được giảm nhẹ một cách dễ dàng bằng cách thực hiện các biện pháp phòng ngừa và mã hóa đúng cách vào các singletons của bạn VỚI việc nhận ra rằng bạn sẽ gỡ lỗi một singleton. Nhưng hãy xem, điều này không quá khác biệt so với BẤT K phil triết lý / phương pháp / mô hình mã hóa nào khác ngoài đó - chỉ là, các singletons còn khá mới và không phổ biến, vì vậy các phương pháp thử nghiệm hiện tại cuối cùng không tương thích với chúng. Nhưng điều đó không khác biệt trong bất kỳ khía cạnh nào của ngôn ngữ lập trình - các phong cách khác nhau đòi hỏi các cách tiếp cận khác nhau.
Một điểm của sự phản đối này nằm ở chỗ, nó bỏ qua thực tế là lý do các ứng dụng được phát triển không phải để 'thử nghiệm' và thử nghiệm không phải là giai đoạn / quy trình duy nhất đi vào phát triển ứng dụng. Các ứng dụng được phát triển để sử dụng sản xuất. Và như tôi đã giải thích trong phần 'ai cần người độc thân', người độc thân có thể cắt giảm một thỏa thuận TUYỆT VỜI khỏi sự phức tạp của việc phải làm cho một mã hoạt động VỚI và NỘI BỘ nhiều dịch vụ / ứng dụng / dịch vụ của bên thứ ba khác nhau. Thời gian có thể bị mất trong thử nghiệm, là thời gian đạt được trong quá trình phát triển và triển khai. Điều này đặc biệt hữu ích trong thời đại xác thực / ứng dụng / tích hợp của bên thứ ba - Facebook, Twitter, OpenID, nhiều hơn nữa và những người biết những gì tiếp theo.
Mặc dù đó là điều dễ hiểu - các lập trình viên làm việc trong những hoàn cảnh rất khác nhau tùy thuộc vào nghề nghiệp của họ. Và đối với những người làm việc trong các công ty tương đối lớn với các bộ phận được xác định có xu hướng khác nhau, phần mềm / ứng dụng được xác định một cách thoải mái và không có sự cắt giảm ngân sách sắp xảy ra và cần phải thực hiện RẤT NHIỀU công cụ với nhiều thứ khác nhau một thời trang rẻ / nhanh / đáng tin cậy, singletons có vẻ không cần thiết lắm. Và nó thậm chí có thể gây phiền toái / cản trở cho những gì họ CRENG CÓ.
Nhưng đối với những người cần làm việc trong các rãnh bẩn của sự phát triển 'nhanh nhẹn', phải thực hiện nhiều yêu cầu khác nhau (đôi khi không hợp lý) từ khách hàng / người quản lý / dự án của họ, singletons là một ân huệ tiết kiệm vì lý do đã giải thích trước đó.
- Một phản đối khác là dấu chân bộ nhớ của nó cao hơn
Bởi vì một singleton mới sẽ tồn tại cho mỗi yêu cầu từ mỗi khách hàng, điều này có thể là một sự phản đối đối với PHP. Với các singletons được xây dựng và sử dụng kém, dung lượng bộ nhớ của ứng dụng có thể cao hơn nếu nhiều người dùng được ứng dụng phục vụ tại bất kỳ điểm nào.
Mặc dù, điều này là hợp lệ cho BẤT CỨ cách tiếp cận nào bạn có thể thực hiện trong khi mã hóa mọi thứ. Các câu hỏi nên được đặt ra là, các phương pháp, dữ liệu được giữ và xử lý bởi các singletons này có cần thiết không? Đối với, nếu chúng là cần thiết trên nhiều ứng dụng yêu cầu, thì ngay cả khi bạn không sử dụng singletons, các phương thức và dữ liệu đó SILL hiện diện trong ứng dụng của bạn dưới dạng này hay dạng khác thông qua mã. Vì vậy, tất cả trở thành một câu hỏi về việc bạn sẽ tiết kiệm được bao nhiêu bộ nhớ, khi bạn khởi tạo một đối tượng lớp truyền thống 1/3 vào quá trình xử lý mã và phá hủy 3/4 nó vào nó.
Hãy xem, khi đặt theo cách này, câu hỏi trở nên khá không liên quan - không nên có các phương pháp không cần thiết, dữ liệu được giữ trong các đối tượng trong mã của bạn BẤT K - - bất kể bạn có sử dụng singletons hay không. Vì vậy, sự phản đối này đối với các singletons trở nên thực sự vui nhộn ở chỗ, nó ĐÁNH GIÁ rằng sẽ có các phương thức, dữ liệu không cần thiết trong các đối tượng được tạo từ các lớp bạn sử dụng.
- Một số phản đối không hợp lệ như 'làm cho việc duy trì nhiều kết nối cơ sở dữ liệu là không thể / khó hơn'
Tôi thậm chí không thể bắt đầu hiểu được sự phản đối này, khi tất cả một người cần duy trì nhiều kết nối cơ sở dữ liệu, nhiều lựa chọn cơ sở dữ liệu, nhiều truy vấn cơ sở dữ liệu, nhiều tập kết quả trong một singleton chỉ là giữ chúng trong các biến / mảng trong singleton miễn là chúng là cần thiết Điều này có thể đơn giản như giữ chúng trong mảng, mặc dù bạn có thể phát minh ra bất kỳ phương pháp nào bạn muốn sử dụng để thực hiện điều đó. Nhưng hãy xem xét trường hợp đơn giản nhất, sử dụng các biến và mảng trong một đơn lẻ nhất định:
Hãy tưởng tượng bên dưới là bên trong một cơ sở dữ liệu nhất định:
$ this -> links = mảng (); (cú pháp sai, tôi chỉ gõ nó như thế này để cung cấp cho bạn hình ảnh - khai báo đúng của biến là public $ links = Array (); và cách sử dụng của nó là $ this-> links ['Connectionkey'] một cách tự nhiên)
Bạn có thể thiết lập và giữ nhiều kết nối tại bất kỳ thời điểm nào trong một mảng theo kiểu này. Và tương tự với các truy vấn, tập kết quả và vv.
$ này -> truy vấn (QUERYSTRING, 'tên truy vấn', $ this-> kết nối ['particulrconnection']);
Mà chỉ có thể thực hiện một truy vấn đến cơ sở dữ liệu đã chọn với một kết nối được chọn và chỉ cần lưu trữ trong
$ này -> kết quả
mảng với khóa 'queryname'. Tất nhiên, bạn sẽ cần phải mã hóa phương thức truy vấn của mình cho việc này - điều này không quan trọng để làm.
Điều này cho phép bạn duy trì số lượng gần như vô hạn (bao nhiêu giới hạn tài nguyên cho phép tất nhiên) các kết nối cơ sở dữ liệu khác nhau và các tập kết quả nhiều như bạn cần chúng. Và chúng có sẵn cho MỌI đoạn mã ở bất kỳ điểm đã cho nào trong bất kỳ cơ sở mã đã cho nào mà lớp đơn này đã được khởi tạo.
KHÓA HỌC, đương nhiên bạn sẽ cần giải phóng các tập kết quả và các kết nối khi không cần thiết - nhưng điều đó không cần phải nói, và nó không đặc trưng cho singletons hoặc bất kỳ phương pháp / phong cách / khái niệm mã hóa nào khác.
Tại thời điểm này, bạn có thể thấy cách bạn có thể duy trì nhiều kết nối / trạng thái cho các ứng dụng hoặc dịch vụ của bên thứ ba trong cùng một đơn. Không quá khác biệt.
Câu chuyện dài, cuối cùng, các mẫu đơn lẻ chỉ là một phương pháp / phong cách / triết lý khác để lập trình và chúng cũng hữu ích như BẤT K other khi chúng được sử dụng đúng nơi, đúng cách. Mà không khác gì.
Bạn sẽ nhận thấy rằng trong hầu hết các bài viết trong đó các singletons bị bash, bạn cũng sẽ thấy các tài liệu tham khảo về 'toàn cầu' là 'ác quỷ'.
Hãy đối mặt với nó - Bất cứ điều gì không được sử dụng đúng cách, lạm dụng, lạm dụng, là xấu xa. Điều đó không giới hạn ở bất kỳ ngôn ngữ, bất kỳ khái niệm mã hóa, phương pháp nào. Bất cứ khi nào bạn thấy ai đó đưa ra những tuyên bố về chăn như 'X là xấu xa', hãy chạy khỏi bài báo đó. Rất có thể đó là sản phẩm của một quan điểm hạn chế - ngay cả khi quan điểm đó là kết quả của nhiều năm kinh nghiệm trong một điều gì đó - mà nói chung cuối cùng là kết quả của việc làm việc quá nhiều trong một phong cách / phương pháp nhất định - chủ nghĩa bảo thủ trí tuệ điển hình.
Ví dụ vô tận có thể được đưa ra cho điều đó, từ 'toàn cầu là xấu xa' đến 'iframes là ác'. Quay trở lại khoảng 10 năm trước, thậm chí đề xuất sử dụng iframe trong bất kỳ ứng dụng cụ thể nào là dị giáo. Sau đó, đến Facebook, iframe ở khắp mọi nơi và xem xét những gì đã xảy ra - iframe không còn quá xấu xa nữa.
Vẫn có những người ngoan cố khăng khăng rằng họ là 'ác quỷ' - và đôi khi cũng vì lý do chính đáng - nhưng, như bạn có thể thấy, có một nhu cầu, iframes đáp ứng nhu cầu đó và hoạt động tốt, và do đó toàn bộ thế giới chỉ tiếp tục.
Tài sản quan trọng nhất của một lập trình viên / lập trình viên / kỹ sư phần mềm là một tâm trí tự do, cởi mở và linh hoạt.