Tôi thực sự cần phải xem một số cuộc tranh luận trung thực, chu đáo về giá trị của mô hình thiết kế ứng dụng doanh nghiệp hiện đang được chấp nhận .
Tôi không tin rằng các đối tượng thực thể nên tồn tại.
Theo các đối tượng thực thể, ý tôi là những thứ điển hình mà chúng ta có xu hướng xây dựng cho các ứng dụng của mình, như "Người", "Tài khoản", "Đặt hàng", v.v.
Triết lý thiết kế hiện tại của tôi là thế này:
- Tất cả các truy cập cơ sở dữ liệu phải được thực hiện thông qua các thủ tục được lưu trữ.
- Bất cứ khi nào bạn cần dữ liệu, hãy gọi một thủ tục được lưu trữ và lặp lại qua SqlDataReader hoặc các hàng trong DataTable
(Lưu ý: Tôi cũng đã xây dựng các ứng dụng doanh nghiệp với Java EE, mọi người java vui lòng thay thế đẳng thức cho các ví dụ .NET của tôi)
Tôi không chống OO. Tôi viết rất nhiều lớp cho các mục đích khác nhau, không phải là các thực thể. Tôi sẽ thừa nhận rằng một phần lớn các lớp tôi viết là các lớp trợ giúp tĩnh.
Tôi không xây dựng đồ chơi. Tôi đang nói về các ứng dụng giao dịch lớn, khối lượng lớn được triển khai trên nhiều máy. Các ứng dụng web, dịch vụ windows, dịch vụ web, tương tác b2b, bạn đặt tên cho nó.
Tôi đã sử dụng HOẶC Mappers. Tôi đã viết một vài. Tôi đã sử dụng ngăn xếp Java EE, CSLA và một vài tương đương khác. Tôi không chỉ sử dụng chúng mà còn tích cực phát triển và duy trì các ứng dụng này trong môi trường sản xuất.
Tôi đã đi đến kết luận đã được thử nghiệm trong trận chiến rằng các đối tượng thực thể đang cản trở chúng ta và cuộc sống của chúng ta sẽ trở nên dễ dàng hơn rất nhiều nếu không có chúng.
Xem xét ví dụ đơn giản này: bạn nhận được một cuộc gọi hỗ trợ về một trang nhất định trong ứng dụng của bạn không hoạt động chính xác, có thể một trong các trường không được duy trì như vậy. Với mô hình của tôi, nhà phát triển được chỉ định để tìm sự cố sẽ mở chính xác 3 tệp . Một tệp ASPX, một tệp ASPX.CS và tệp SQL có thủ tục được lưu trữ. Vấn đề, có thể là một tham số bị thiếu đối với cuộc gọi thủ tục được lưu trữ, mất vài phút để giải quyết. Nhưng với bất kỳ mô hình thực thể nào, bạn sẽ luôn kích hoạt trình gỡ lỗi, bắt đầu chuyển qua mã và bạn có thể kết thúc với 15-20 tệp được mở trong Visual Studio. Khi bạn bước xuống dưới cùng của ngăn xếp, bạn đã quên nơi bạn bắt đầu. Chúng ta chỉ có thể giữ rất nhiều thứ trong đầu cùng một lúc. Phần mềm cực kỳ phức tạp mà không cần thêm bất kỳ lớp không cần thiết.
Sự phức tạp phát triển và xử lý sự cố chỉ là một mặt của sự kìm kẹp của tôi.
Bây giờ hãy nói về khả năng mở rộng.
Các nhà phát triển có nhận ra rằng mỗi lần họ viết hoặc sửa đổi bất kỳ mã nào tương tác với cơ sở dữ liệu, họ cần thực hiện một phân tích khủng khiếp về tác động chính xác trên cơ sở dữ liệu? Và không chỉ là bản sao phát triển, ý tôi là bắt chước sản xuất, vì vậy bạn có thể thấy rằng cột bổ sung mà bạn yêu cầu cho đối tượng của mình vừa vô hiệu hóa kế hoạch truy vấn hiện tại và một báo cáo đang chạy trong 1 giây sẽ chỉ mất 2 phút bởi vì bạn đã thêm một cột vào danh sách chọn? Và hóa ra chỉ số bạn yêu cầu bây giờ lớn đến mức DBA sẽ phải sửa đổi bố cục vật lý của các tệp của bạn?
Nếu bạn để mọi người ở quá xa kho lưu trữ dữ liệu vật lý với sự trừu tượng hóa, họ sẽ tạo ra sự tàn phá với một ứng dụng cần mở rộng quy mô.
Tôi không phải là một người nhiệt tâm. Tôi có thể bị thuyết phục nếu tôi sai, và có lẽ tôi, vì có sự thúc đẩy mạnh mẽ như vậy đối với Linq đối với Sql, ADO.NET EF, Hibernate, Java EE, v.v. Hãy suy nghĩ qua các phản hồi của bạn, nếu tôi thiếu điều gì đó thực sự muốn biết nó là gì và tại sao tôi nên thay đổi suy nghĩ của mình.
[Biên tập]
Có vẻ như câu hỏi này đột nhiên hoạt động trở lại, vì vậy bây giờ chúng tôi có tính năng bình luận mới, tôi đã nhận xét trực tiếp trên một số câu trả lời. Cảm ơn đã trả lời, tôi nghĩ rằng đây là một cuộc thảo luận lành mạnh.
Tôi có lẽ nên rõ ràng hơn rằng tôi đang nói về các ứng dụng doanh nghiệp. Tôi thực sự không thể nhận xét về một trò chơi đang chạy trên máy tính để bàn của ai đó hoặc ứng dụng dành cho thiết bị di động.
Một điều tôi phải đưa lên đây ở đầu để trả lời cho một số câu trả lời tương tự: tính trực giao và tách biệt các mối quan tâm thường được trích dẫn là lý do để đi thực thể / ORM. Đối với tôi, các thủ tục được lưu trữ là ví dụ tốt nhất về sự tách biệt các mối quan tâm mà tôi có thể nghĩ ra. Nếu bạn không cho phép tất cả các quyền truy cập khác vào cơ sở dữ liệu, ngoài các thủ tục được lưu trữ, về mặt lý thuyết, bạn có thể thiết kế lại toàn bộ mô hình dữ liệu của mình và không phá vỡ bất kỳ mã nào, miễn là bạn duy trì đầu vào và đầu ra của các thủ tục được lưu trữ. Chúng là một ví dụ hoàn hảo về lập trình theo hợp đồng (chỉ cần bạn tránh "chọn *" và ghi lại các tập kết quả).
Hỏi ai đó đã ở trong ngành trong một thời gian dài và đã làm việc với các ứng dụng tồn tại lâu dài: có bao nhiêu lớp ứng dụng và giao diện người dùng đã đến và đi trong khi cơ sở dữ liệu đã tồn tại? Việc điều chỉnh và cấu trúc lại cơ sở dữ liệu khó đến mức nào khi có 4 hoặc 5 lớp kiên trì khác nhau tạo SQL để lấy dữ liệu? Bạn không thể thay đổi bất cứ điều gì! ORM hoặc bất kỳ mã nào tạo SQL khóa cơ sở dữ liệu của bạn trong đá .