Là ở lại thực hiện bất khả tri thực sự giá trị nó?


22

Tôi có một dự án mà tôi đang làm việc hiện đang sử dụng Tomcat, Spring 4, Spring Security, MySQL và JPA w / Hibernate.

Tôi đã chọn JPA từ quan điểm rằng nó giả sử làm cho việc hoán đổi việc triển khai cơ bản của các nhà cung cấp ORM trở nên liền mạch, hoặc ít nhất là ít đau đớn hơn. Tôi muốn nói rằng điều này về mặt tinh thần khi sử dụng thông số kỹ thuật trong quá trình triển khai (JAX-RS) là quan điểm mặc định của cộng đồng phát triển Java.

Tôi tò mò nếu đây thực sự là một nhiệm vụ đáng làm. Tôi chắc chắn rằng nếu tôi sử dụng Hibernate trực tiếp, tôi sẽ có được sức mạnh vì tôi có thể sử dụng các tính năng không phải là một phần của đặc tả chính của JPA.

Một phần mối quan tâm của tôi xuất phát từ ý tưởng của YAGNI. Về cơ bản, tôi đang lập trình theo một phong cách và thời trang cụ thể (sử dụng JPA thay vì Hibernate) để đến một lúc nào đó trong tương lai tôi có thể trao đổi việc triển khai ORM của mình. Tôi hoàn toàn nghi ngờ điều đó sẽ xảy ra trong suốt vòng đời của sản phẩm, vì vậy về cơ bản, tôi đang nỗ lực vào một thứ mà có lẽ tôi sẽ không bao giờ gặt hái được lợi ích.

Quan điểm của bạn là gì? "Lập trình cho giao diện" có đáng không khi nói đến những thứ như JPA? Bạn đã bao giờ thực sự hoán đổi toàn bộ triển khai ORM trong một sản phẩm chưa? Bạn đã bao giờ có thể tránh hoàn toàn sự trừu tượng từ một cái gì đó như JPA bị rò rỉ chưa? Cá nhân tôi đã có một lệnh gọi SQL riêng (đã xóa sạch các bảng cơ sở dữ liệu) và đôi khi tôi muốn sử dụng tính năng này được tích hợp vào đặc tả JPA (lấy / đặt tiền tố cho các phương thức của bạn và sự khác biệt giữa MEMBER OF / IN, chỉ ràng buộc bản thân tôi với một triển khai cơ bản sẽ giúp tôi có bất kỳ cơ hội tránh.


Bạn có kiểm tra đơn vị không? Chuyển đổi thực hiện không nhất thiết có nghĩa là thành phẩm.
MrDosu

Câu trả lời:


26

để đến một lúc nào đó trong tương lai tôi có thể trao đổi việc triển khai ORM của mình. Tôi hoàn toàn nghi ngờ điều đó sẽ xảy ra trong suốt vòng đời của sản phẩm, vì vậy về cơ bản, tôi đang nỗ lực vào một thứ mà có lẽ tôi sẽ không bao giờ gặt hái được lợi ích của

Theo kinh nghiệm của tôi, dự án doanh nghiệp điển hình không bao giờ hoán đổi:

  1. Cơ sở dữ liệu
  2. ORM
  3. Ngôn ngữ

Tôi không biết các con số, nhưng tỷ lệ phần trăm của các ứng dụng 2 lớp tôi đã thấy triển khai và sau đó thay đổi một trong những điều đó có thể sẽ ít hơn 10%. Nếu nó xảy ra, nó rất hiếm, và nó thường xảy ra trong vòng 2-3 tháng đầu tiên của dự án khi mọi người vẫn ở chế độ khám phá. Hầu hết các hệ thống tôi biết vẫn đang chạy trên nền tảng ban đầu 8-10 năm sau.

Thường xuyên hơn là trao đổi ORM, bạn có muốn biết những gì tôi đã thấy nhiều hơn không? Loại bỏ hoàn toàn ORM để thả xuống SQL do vấn đề hiệu năng. Vì vậy, không có vấn đề gì, trong trường hợp đó, bạn sẽ viết lại công cụ.

Theo như thuyết bất khả tri, đó là một huyền thoại. Nó thực sự lên đến mức làm giảm nhiệt độ. Vì vậy, cách tiếp cận của tôi là nắm lấy lớp dữ liệu. Làm cho nó trở thành một phần hạng nhất của ngôn ngữ và thiết kế của bạn. Nó làm cho các dự án hạnh phúc hơn, thành công hơn.


3
Đồng ý hoàn toàn, đây cũng là cơ sở của hầu hết các vấn đề tôi gặp phải với Hibernate nói chung - nó thỏa hiệp với SQL mà nó tạo ra để tạo điều kiện cho việc hoán đổi Cơ sở dữ liệu. Nó cũng "thực hiện truy cập" bằng cách giả định rằng đó là nơi tốt nhất để lưu trữ bộ đệm bảng mà hiếm khi xảy ra là IMO. Có một trường hợp để Hibernate bỏ các mô đun điều chỉnh SQL để biến HQL thành Oracle, MySQL, SQL Server, v.v. SQL được tối ưu hóa và ngừng làm những việc ngu ngốc mà RDBMS làm tốt hơn.
đánh dấu

5

Nó có đáng không?
Điều đó sẽ hoàn toàn phụ thuộc vào ứng dụng.
Nếu bạn đang viết một ứng dụng nội bộ cho một công ty, hãy quên nó đi. Cơ sở dữ liệu đó sẽ tồn tại lâu hơn ứng dụng theo năm, có thể hàng thập kỷ.
Tất nhiên trừ khi bạn được ban đầu hiểu rằng cơ sở dữ liệu được lên kế hoạch để thay thế bởi một thứ khác trong tương lai gần.
Nếu bạn đang viết nó để bán cho khách hàng, những người có thể có các công cụ cơ sở dữ liệu khác nhau, VÀ các yêu cầu là nó phải hỗ trợ nhiều công cụ cơ sở dữ liệu, THÌ điều đó có ý nghĩa.

Đối với hầu hết mọi người viết các ứng dụng Java sau đó, điều đó phần lớn không liên quan.


+1 để đề cập đến các ứng dụng có hỗ trợ cho nhiều DBMS. Nếu bạn cung cấp ứng dụng của mình cho "tự lưu trữ" (điều mà nhiều khách hàng doanh nghiệp thấy mong muốn), bạn có thể cần điều này. Tuy nhiên, bạn có thể vẫn có thể dính vào một ORM.
sleske

4

Từ kinh nghiệm của tôi: không, nó không có giá trị trong trường hợp JPA / Hibernate.

"Lập trình cho giao diện" có đáng không khi nói đến những thứ như JPA?

Đó là, nhưng không có gì để làm với JPA cụ thể. Bạn có thể thực hiện "lập trình cho các giao diện" của Hibernate. Đây không phải là về việc che giấu một khuôn khổ theo một tiêu chuẩn, nó là về RẮN .

Bạn đã bao giờ thực sự hoán đổi toàn bộ triển khai ORM trong một sản phẩm chưa?

Có và không. Một trong những sản phẩm của công ty chúng tôi đã di chuyển một phần từ Hibernate sang jOOQ (không liên quan gì đến JPA). Đó không phải là một "dự án doanh nghiệp điển hình" mà @codenheim đã đề cập, vì vậy việc hoán đổi là có thể.

Tôi thấy không có điểm nào hoán đổi Hibernate với một ORM tuân thủ JPA khác.

Bạn đã bao giờ có thể tránh hoàn toàn sự trừu tượng từ một cái gì đó như JPA bị rò rỉ chưa?

Không. Không thể vì cả JPA và Hibernate đều rất phức tạp. Và bạn phải đối phó với các vấn đề về hiệu suất và lỗi thiết kế của Hibernate.


3

Có nguy cơ âm thanh trái ngược ở đây, tôi sẽ nói, rằng có, nó là giá trị nó. Và nó không phải là.

Vấn đề không phải là quá nhiều trong việc chuyển đổi ORM hoặc nhà cung cấp cơ sở dữ liệu của bạn như vậy. Đây là một vấn đề tách biệt mối quan tâm và nhanh nhẹn.

Khi bạn bắt đầu dựa vào một số chi tiết triển khai của thư viện, bạn bắt đầu tạo ra những vướng mắc ngày càng sâu hơn.

Nếu bạn biết mũ triển khai ORM của bạn là Hibernate, kiến ​​thức này bắt đầu thấm xuống toàn bộ kiến ​​trúc của ứng dụng của bạn. Và bất cứ khi nào một công nghệ mới xuất hiện thay thế Hibernate hoặc JPA một cách triệt để như Hibernate đã làm với bất cứ điều gì đến trước nó, bạn sẽ thấy rằng sự phụ thuộc đã trở nên sâu sắc hơn bạn mong đợi.

Sẽ tốt hơn nhiều nếu loại bỏ toàn bộ mối quan tâm về việc duy trì mô hình của bạn ở một nơi nào đó, nơi mà tất cả những rắc rối trong giao dịch với cơ sở dữ liệu và giao dịch và không có gì có thể dễ dàng bị bỏ qua bởi phần còn lại của ứng dụng. Trong góc tối xa xôi đó, bạn có thể tự buộc mình vào các nút thắt trên các chi tiết triển khai cụ thể nếu bạn muốn - nó không thực sự quan trọng nữa.


1

Vấn đề với thuyết bất khả tri là trong thời gian của bạn là một nhà phát triển, bạn sẽ lãng phí thời gian.

Tôi đã viết một số dự án mà chúng tôi đã lãng phí rất nhiều thời gian để viết lên một giao diện, sau đó chúng không bao giờ được sử dụng theo bất kỳ cách mới nào, không bao giờ được chuyển đổi và chỉ được sử dụng "như hiện tại" trong nhiều năm

Tôi cũng đã lãng phí rất nhiều thời gian để chuyển đổi phần mềm mà không ai từng cần phải chuyển đổi.

Quan sát thực sự duy nhất tôi phải thực hiện, đó là trước đây ít đau đớn hơn nhiều.

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.