Độc quyền là ma quỷ và những người độc thân với trạng thái không đọc / biến đổi là vấn đề 'thực sự' ...
Sau khi đọc Singletons là những kẻ nói dối bệnh lý như được đề xuất trong câu trả lời của jason, tôi đã xem qua mẩu tin nhỏ này cung cấp ví dụ được trình bày tốt nhất về cách những người độc thân thường bị lạm dụng.
Toàn cầu là xấu vì:
- a. Nó gây ra xung đột không gian tên
- b. Nó phơi bày nhà nước một cách không chính đáng
Khi nói đến Singletons
- a. Cách gọi OO rõ ràng, ngăn chặn các xung đột, vì vậy điểm a. không phải là một vấn đề
- b. Singletons không có nhà nước là (như các nhà máy) không phải là một vấn đề. Singletons với trạng thái một lần nữa có thể thuộc hai loại, những loại không thay đổi hoặc viết một lần và đọc nhiều (tệp cấu hình / thuộc tính). Đây không phải là xấu. Singletons Mutable, loại chủ sở hữu tài liệu tham khảo là những người mà bạn đang nói đến.
Trong tuyên bố cuối cùng, ông đề cập đến khái niệm 'singletons là kẻ nói dối' của blog.
Làm thế nào điều này áp dụng cho Monopoly?
Để bắt đầu một trò chơi độc quyền, đầu tiên:
- chúng tôi thiết lập các quy tắc trước tiên để mọi người ở trên cùng một trang
- mọi người đều được bắt đầu như nhau khi bắt đầu trò chơi
- chỉ có một bộ quy tắc được trình bày để tránh nhầm lẫn
- các quy tắc không được phép thay đổi trong suốt trò chơi
Bây giờ, đối với bất kỳ ai chưa thực sự chơi độc quyền, những tiêu chuẩn này là lý tưởng nhất. Một thất bại trong độc quyền là khó nuốt vì, độc quyền là về tiền, nếu bạn thua bạn phải chăm chỉ theo dõi những người chơi còn lại kết thúc trò chơi, và tổn thất thường nhanh chóng và tan nát. Vì vậy, các quy tắc thường bị xoắn vào một số thời điểm để phục vụ lợi ích cá nhân của một số người chơi với chi phí của những người khác.
Vì vậy, bạn đang chơi độc quyền với bạn bè Bob, Joe và Ed. Bạn đang nhanh chóng xây dựng đế chế của mình và tiêu thụ thị phần với tốc độ theo cấp số nhân. Đối thủ của bạn đang yếu đi và bạn bắt đầu ngửi thấy mùi máu (theo nghĩa bóng). Bob, bạn thân của bạn đã đặt tất cả số tiền của mình vào việc bế tắc càng nhiều tài sản có giá trị thấp càng tốt nhưng anh ta không nhận được lợi tức đầu tư cao như cách anh ta mong đợi. Bob, như một cơn xui xẻo, rơi xuống Boardwalk của bạn và bị loại khỏi trò chơi.
Bây giờ trò chơi đi từ lăn xúc xắc thân thiện đến kinh doanh nghiêm túc. Bob đã được làm ví dụ về sự thất bại và Joe và Ed không muốn kết thúc giống như 'anh chàng đó'. Vì vậy, trở thành người chơi hàng đầu của bạn, bất ngờ, trở thành kẻ thù. Joe và Ed bắt đầu thực hành các giao dịch dưới bàn, tiêm tiền sau, đổi nhà bị đánh giá thấp và nói chung là bất cứ điều gì làm bạn yếu đi như một người chơi cho đến khi một trong số họ vươn lên dẫn đầu.
Sau đó, thay vì một trong số họ chiến thắng, quá trình bắt đầu lại. Thật bất ngờ, một bộ quy tắc hữu hạn trở thành mục tiêu chuyển động và trò chơi biến thành kiểu tương tác xã hội sẽ tạo nên nền tảng của mọi chương trình truyền hình thực tế được đánh giá cao kể từ Survivor. Tại sao, bởi vì các quy tắc đang thay đổi và không có sự đồng thuận về cách thức / lý do / những gì họ được cho là đại diện, và quan trọng hơn, không có ai đưa ra quyết định. Mỗi người chơi trong trò chơi, tại thời điểm đó, đang đưa ra các quy tắc và sự hỗn loạn của riêng mình xảy ra cho đến khi hai trong số những người chơi quá mệt mỏi để theo kịp trò chơi đố chữ và từ từ bỏ cuộc.
Vì vậy, nếu một quy tắc cho một trò chơi đại diện chính xác cho một người độc thân, thì quy tắc độc quyền sẽ là một ví dụ về lạm dụng.
Làm thế nào điều này áp dụng cho lập trình?
Ngoài tất cả các vấn đề về đồng bộ hóa và an toàn luồng rõ ràng mà các singletons có thể thay đổi hiện diện ... Nếu bạn có một bộ dữ liệu, có khả năng được đọc / thao tác bởi nhiều nguồn khác nhau đồng thời và tồn tại trong suốt thời gian thực thi ứng dụng, có lẽ là thời điểm tốt để lùi lại và hỏi "tôi có đang sử dụng đúng loại cấu trúc dữ liệu ở đây không".
Cá nhân, tôi đã thấy một lập trình viên lạm dụng một singleton bằng cách sử dụng nó như một loại lưu trữ cơ sở dữ liệu đa luồng xoắn trong một ứng dụng. Đã làm việc trực tiếp với mã, tôi có thể chứng thực rằng nó chậm (vì tất cả các khóa luồng cần thiết để làm cho nó an toàn cho luồng) và là cơn ác mộng khi làm việc (vì tính chất không thể đoán trước / không liên tục của các lỗi đồng bộ hóa) và gần như không thể kiểm tra trong điều kiện 'sản xuất'. Chắc chắn, một hệ thống có thể đã được phát triển bằng cách sử dụng bỏ phiếu / báo hiệu để khắc phục một số vấn đề về hiệu năng nhưng điều đó sẽ không giải quyết được vấn đề khi thử nghiệm và tại sao phải lo lắng khi cơ sở dữ liệu 'thực' có thể thực hiện chức năng tương tự mạnh mẽ hơn nhiều / cách mở rộng.
Một Singleton chỉ là một lựa chọn nếu bạn cần những gì một singleton cung cấp. Một ví dụ chỉ đọc một của một đối tượng. Quy tắc tương tự cũng sẽ xếp tầng cho các thuộc tính / thành viên của đối tượng.