Tại sao nhiều lập trình viên hoàn toàn ghét các lớp phổ biến đối tượng?


9

Prevalence là một kỹ thuật đơn giản để cung cấp các thuộc tính ACID cho mô hình đối tượng trong bộ nhớ dựa trên tuần tự hóa nhị phân và ghi nhật ký ghi trước. Nó hoạt động như thế này:

  • Bắt đầu với một ảnh chụp nhanh. Nối tiếp mô hình đối tượng và ghi nó vào một tệp.
  • Tạo một tập tin tạp chí. Đối với mỗi cuộc gọi vào mô hình đối tượng, tuần tự hóa cuộc gọi và các đối số của nó.
  • Khi tạp chí trở nên quá lớn, bạn đang tắt hoặc nếu không thuận tiện, hãy thực hiện một điểm kiểm tra: viết một ảnh chụp nhanh mới và cắt bớt tạp chí.
  • Để khôi phục hoặc khôi phục sau sự cố hoặc mất điện, hãy tải ảnh chụp nhanh cuối cùng và thực hiện lại tất cả các cuộc gọi được ghi trong nhật ký.

Các biện pháp phòng ngừa cần thiết để thực hiện công việc này là:

  • Đừng để các tham chiếu đối tượng có thể thay đổi thoát hoặc vào lớp phổ biến. Bạn cần một số loại proxy hoặc lược đồ OID, như thể bạn đang làm RPC. (Đây là một lỗi người mới phổ biến như vậy, nó được đặt biệt danh là ' vấn đề rửa tội '.)
  • Tất cả logic có thể truy cập từ một cuộc gọi phải hoàn toàn xác định và không được thực hiện các cuộc gọi I / O hoặc OS có ý nghĩa logic kinh doanh. Viết vào nhật ký chẩn đoán có thể ổn, nhưng việc lấy thời gian hệ thống hoặc khởi chạy một đại biểu không đồng bộ thường không được. Điều này là để tạp chí phát lại giống hệt ngay cả khi nó được khôi phục trên một máy khác hoặc tại một thời điểm khác. (Hầu hết mã phổ biến cung cấp một cuộc gọi thời gian thay thế để có được dấu thời gian giao dịch.)
  • Nhà văn đồng thời giới thiệu sự mơ hồ trong giải thích tạp chí, vì vậy nó bị cấm.

Có phải vì ...

  • mọi người đã phát triển mùi vị xấu đối với họ sau khi thử sử dụng một dự án không phù hợp * với nó?
  • Sự ủng hộ tầm thường của Klaus Wuestefeld đã khiến mọi người tắt ?
  • những người thích mô hình lập trình mệnh lệnh không thích tách I / O khỏi tính toán , thay vào đó thích xen kẽ tính toán với I / O và các cuộc gọi luồng?
  • Các lớp phổ biến rất đơn giản về mặt khái niệm và liên kết chặt chẽ với các đặc điểm của khung mà họ sinh sống mà họ thường tùy chỉnh cho dự án, điều này khiến chúng trở nên quá xa lạ / không chuẩn / rủi ro?
  • Thật khó để giữ thẳng những gì bạn phải cẩn thận không làm gì?
  • Đầu của người mới dường như nổ tung khi phải đối mặt với một thứ không giống với ứng dụng điều khiển cơ sở dữ liệu hai lớp mà họ đã học để viết ở trường? ;)

* Các toàn bộ phù hợp tập dữ liệu trong RAM , bạn không cần phải nhà văn đồng thời, và bạn không cần phải làm gì ad-hoc truy vấn, báo cáo, hoặc xuất khẩu sang một kho dữ liệu. Với lời xin lỗi tới SQLite, mức độ phổ biến là một cải tiến đối với các tệp lưu, không phải là sự thay thế cho Oracle.


Aha. Tôi tự hỏi nếu nó có một cái tên. Nó luôn có ý nghĩa với tôi, tôi chỉ không bao giờ có tên cho nó.
greyfade

9
Bạn đang nói về cái gì vậy?
TheLQ

Đây là lần đầu tiên tôi nghe về điều này. Nó là gì?
Jonn

Giải thích thêm.
Jeffrey Hantin

1
Ohhh .. Tôi biết khái niệm này nhưng tôi chưa bao giờ làm điều này trước đây. Có vẻ khá tiện lợi với tôi. Tôi khá chắc chắn rằng đó không phải là thứ mà nhiều nhà phát triển "hoàn toàn ghét".
Jonn

Câu trả lời:


6

Tôi nghĩ rằng một số vấn đề là họ có trường hợp sử dụng RẤT cụ thể (lý do không phù hợp của bạn). Tôi đã xây dựng và làm việc trên các hệ thống sử dụng phương pháp này và khi bạn gặp vấn đề thực sự là vấn đề này thì đó có thể là một giải pháp tuyệt vời.

Một phần khác là nó trông rất giống với một số bit đau đớn hơn của việc lưu trữ dữ liệu tùy chỉnh mà bạn đã sử dụng để tìm thấy hơn 10 năm trước và có một số cạm bẫy tương tự (ví dụ như btreive được cập nhật hàng loạt) mang lại cho bạn Điểm "quá tùy chỉnh", nhưng cũng gây khó khăn cho việc tìm ra các bộ phận làm việc lịch sự với nó.

Phần cuối cùng là họ có thể khó truy vấn trong nhiều trường hợp và mọi người nói chung khá quen với việc có thể nhận được câu trả lời của họ ngay bây giờ.


11

Tôi nghĩ rằng trước tiên bạn cần chứng minh rằng rất nhiều nhà phát triển hoàn toàn ghét họ. Tôi không nghĩ đó là trường hợp. Hãy xem xét fowler đó, một thời gian trước, chính thức hóa một mô hình sắp xếp cho việc này ở đây .


Vâng, tôi có một chút bối rối. Chúng trông giống như một công cụ tuyệt vời nếu bạn sử dụng chúng cho đúng lý do.
Matt Olenik

Tôi chỉ nói điều này bởi vì tôi đã nhận được một sự đau buồn tuyệt vời về điều này từ đồng nghiệp.
Jeffrey Hantin

1
@Jeffrey Hantin: Họ có vẻ lười biếng và khép kín.
Steven Evers

1
Ồ, và nền tảng thực tế của mẫu là c2.com/cgi/wiki?TransactionTape
Jeffrey Hantin

4

Câu trả lời cho câu hỏi là trong khi lý thuyết đơn giản thì thực tế lại không như vậy.

Chỉ cần kiểm tra một thiết lập như vậy đòi hỏi hàng tá trường hợp thử nghiệm, thêm quy trình mutli hoặc mã đa luồng và điều này nhảy đến hàng trăm điều kiện có thể cần phải được kiểm tra, cả về sự bền bỉ và phục hồi.

Bất kỳ trình giám sát giao dịch nào như CICS, tuxedo, Weblogic, Websphere, JBOSS hoặc .NET, sẽ cung cấp tất cả các phương tiện này một cách sạch sẽ và được kiểm tra. Và bất kỳ cơ sở dữ liệu nào cũng sẽ cung cấp "đủ" giao dịch / kiên trì cho hầu hết các ứng dụng.

Nó chủ yếu là một trường hợp của bánh xe đó đã được phát minh và hoàn thiện từ lâu.


điều này, và xu hướng của nhiều "kiến trúc sư" có một "hương vị" ưa thích mà họ tìm cách đẩy lên bất cứ điều gì, cho dù thiết kế đó có thể không phù hợp với vấn đề cần giải quyết.
năm11

@jwenting Vậy điều đó có thuộc quan điểm 'vận động chính trực' không?
Jeffrey Hantin

2

Các điều kiện tiên quyết nghe có vẻ hơi khó đối với mã xung quanh, đặc biệt là với hầu hết các hệ thống không cần tuân thủ ACID khi chạy trong bộ nhớ. Trên đầu nghe có vẻ hơi khó chịu - có rất nhiều theo dõi trạng thái liên quan ở đó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.