Mô hình dày Vs. Logic kinh doanh, bạn vẽ sự khác biệt ở đâu?


16

Hôm nay tôi đã có một cuộc tranh luận sôi nổi với một nhà phát triển khác trong tổ chức của mình về vị trí và cách thêm các phương thức vào các lớp ánh xạ cơ sở dữ liệu. Chúng tôi sử dụng sqlalchemyvà một phần chính của cơ sở mã hiện có trong các mô hình cơ sở dữ liệu của chúng tôi chỉ hơn một túi các thuộc tính được ánh xạ với tên lớp, một bản dịch gần như cơ học từ các bảng cơ sở dữ liệu sang các đối tượng python.

Trong tranh luận, quan điểm của tôi là giá trị chính của việc sử dụng ORM là bạn có thể đính kèm các hành vi và thuật toán cấp thấp vào các lớp được ánh xạ. Các mô hình là các lớp đầu tiên và liên tục thứ hai (chúng có thể được sử dụng xml liên tục trong một hệ thống tệp, bạn không cần phải quan tâm). Quan điểm của ông là mọi hành vi đều là "logic kinh doanh", và nhất thiết phải thuộc về bất cứ nơi nào ngoài mô hình liên tục, vốn chỉ được sử dụng cho sự kiên trì của cơ sở dữ liệu.

Tôi chắc chắn nghĩ rằng có một sự khác biệt giữa logic kinh doanh gì và nên tách biệt, vì nó có một sự tách biệt với mức độ thấp hơn về cách thức được triển khai và logic miền, mà tôi tin là sự trừu tượng được cung cấp bởi các lớp mô hình đã tranh luận về đoạn trước, nhưng tôi gặp khó khăn khi đặt ngón tay vào đó là gì. Tôi hiểu rõ hơn về những gì có thể là API (trong trường hợp của chúng tôi là HTTP "ReSTful"), trong đó người dùng gọi API với những gì họ muốn làm , khác với những gì họ được phép làm và cách thức Được thực hiện.


tl; dr: Những loại điều nào có thể hoặc nên đi trong một phương thức trong một lớp được ánh xạ khi sử dụng ORM, và những gì nên bỏ đi, để sống trong một lớp trừu tượng khác?


Dường như với tôi, đó là hai vấn đề được thảo luận cùng một lúc, vấn đề về Mô hình kiên trì là các lớp trước tiên và thứ hai là tồn tại (chúng có thể tồn tại dai dẳng khi sử dụng xml trong hệ thống tệp, bạn không cần quan tâm). và lý do của mã. Thông thường mọi thứ sẽ rõ ràng, ít nhất là đối với tôi, khi tôi tự hỏi tại sao mã được viết, yêu cầu gì buộc mã này. Đây có phải là yêu cầu của khách hàng về cách chương trình sẽ hoạt động hay là từ cách chúng tôi chọn để thực hiện nó. Đối với tôi đầu tiên là logic kinh doanh và thứ hai là cái mà bạn gọi là logic miền. Làm thế nào điều này giúp.

Câu trả lời:


10

Tôi chủ yếu là với bạn; đồng nghiệp của bạn dường như đang tranh cãi về mô hình miền thiếu máu hoặc sao chép mô hình trong "mô hình bền bỉ" không có lợi ích rõ ràng (Tôi đang làm việc trên một dự án Java, nơi nó đã được thực hiện và đó là một vấn đề đau đầu về khả năng duy trì lớn, như nó có nghĩa là ba lần công việc bất cứ khi nào bất cứ điều gì thay đổi trong mô hình).

Những loại điều nào có thể hoặc nên đi trong một phương thức trong một lớp được ánh xạ khi sử dụng ORM, và những gì nên bỏ đi, để sống trong một lớp trừu tượng khác?

Nguyên tắc chung: lớp nên chứa logic mô tả các sự kiện cơ bản về dữ liệu là đúng trong mọi trường hợp. Logic dành riêng cho trường hợp sử dụng nên ở một nơi khác. Một ví dụ là xác nhận, có một bài viết thú vị từ Martin Fowler , nơi ông đưa ra quan điểm rằng nó nên được coi là phụ thuộc vào ngữ cảnh.


+1, cho phần thứ hai của câu trả lời của bạn. Đối với phần đầu tiên, tôi chắc chắn lý do tại sao bạn nói rằng mô hình miền thiếu máu đòi hỏi nhiều công việc 'phụ' trong trường hợp thay đổi. Sự hiểu biết của tôi là sự thay đổi sẽ xảy ra theo bất kỳ cách nào, nhưng trong một số lớp khác nhau (đó là loại xấu) nhưng nó gần như là cùng một lượng thay đổi; Tôi đoán?
NoChance

1
@Emmad Kareem: Nhận xét là về việc có sự bền bỉ và mô hình miền. Việc thêm một thuộc tính vào mô hình sau đó yêu cầu thêm nó vào hai lớp mô hình (chứ không phải một) cũng như bất kỳ bản đồ nào giữa chúng (về lý thuyết có thể là tự động, nhưng thường thì kẻ ngu ngốc nghĩ rằng đó là một ý tưởng tốt để tách riêng "mô hình bền bỉ" quyết định biện minh cho sự phân tách đó bằng cách làm cho chúng khác nhau, ví dụ: có các kiểu dữ liệu khớp với mô hình kiểu DB hơn) gấp 2 lần lượng thay đổi, với X thay đổi từ 0 đến giờ năng suất bị mất do che khuất vấn đề bản đồ.
Michael Borgwardt

3

Đây là một cuộc gọi phán xét thực sự phụ thuộc vào quy mô và quy mô dự đoán của bạn về những gì bạn đang phát triển. Cách tiếp cận cứng nhắc nhất là giới hạn các loại ORM thành một thành phần truy cập dữ liệu và sử dụng POCO trong một thư viện chung như các loại được tham chiếu và sử dụng bởi tất cả các lớp. Điều này sẽ cho phép tách vật lý trong tương lai cũng như tách logic. Bạn cũng có thể quyết định rằng một lớp bổ sung sẽ tồn tại giữa UI và lớp logic nghiệp vụ. Điều này thường được gọi là lớp Mặt tiền hoặc Giao diện Doanh nghiệp. Lớp bổ sung này là nơi "mã trường hợp sử dụng" của bạn sống. Mã được ghép lỏng lẻo được gọi bởi lớp Facade / BI (ví dụ: Facade có hàm ProcessOrder () gọi vào logic nghiệp vụ 1: M lần để thực hiện tất cả các bước cần thiết để thực sự xử lý đơn hàng).

Tuy nhiên, tất cả những gì đang được nói: nhiều lần số lượng kiến ​​trúc này chỉ đơn giản là quá mức cần thiết. Ví dụ, mã đặc biệt cho một trang web đơn giản mà bạn không có ý định đóng gói các thành phần của nó để sử dụng lại. Hoàn toàn hợp lệ khi tạo một trang web MVC và sử dụng các đối tượng EF cho loại giải pháp này. Nếu trang web cần mở rộng ra sau này, bạn có thể xem xét phân cụm hoặc một quá trình thường bị mất đi gọi là "tái cấu trúc".


3

Chỉ cần nhắc nhở đồng nghiệp của bạn rằng bạn không cần phải bao quát các mô hình như thể đây là một dự án Java. Ý tôi là, so sánh hai đối tượng kiên trì là hành vi, nhưng nó không được chỉ định bởi lớp kiên trì. Vì vậy, câu hỏi 6 bia là: tại sao có các lớp hoàn toàn không liên quan mô tả một cái gì đó về cùng một điều? Chắc chắn, sự bền bỉ là một khía cạnh đủ lớn của một mô hình được xử lý riêng, nhưng không đủ để đảm bảo nó được đối xử khác biệt với mọi thứ khác. Nếu bạn lái xe của bạn, rửa hoặc phá vỡ nó, bạn thao túng chiếc xe của bạn toàn bộ thời gian.

Vậy tại sao không kết hợp tất cả các khía cạnh khác nhau này vào một lớp mô hình duy nhất? Bạn cần một loạt các phương thức lớp xử lý các đối tượng bền vững - đặt chúng vào một lớp; bạn có một loạt các phương thức cá thể xử lý xác nhận - đặt chúng vào một phương thức khác. Cuối cùng, trộn hai trong và voila! Bạn đã có cho mình một đại diện mô hình thông minh, tự nhận thức và có đầy đủ ngay tại đó.


1

Ngoài các câu trả lời khác, hãy chú ý đến các hang động ẩn khi sử dụng các mô hình miền phong phú với ORM.

Tôi gặp vấn đề khi tiêm dịch vụ đa hình trong các lớp mô hình bền bỉ khi cố gắng đạt được thứ gì đó giống như mã giả sau:

Person john = new Person('John Doe')
Organisation company = organisation_repository.find('some id')
Employee our_collegue_john = company.hire(john)

Trong trường hợp này, một Tổ chức có thể yêu cầu một HRServicephụ thuộc của nhà xây dựng (ví dụ). Bạn thường không thể dễ dàng kiểm soát sự phát sinh của các lớp mô hình của mình khi sử dụng ORM.

Tôi đã sử dụng Doctrine ORM và bộ chứa dịch vụ từ Symfony. Tôi đã phải điều khiển ORM một cách không thanh lịch và không có lựa chọn nào khác ngoài việc tách biệt sự kiên trì và mô hình kinh doanh. Tôi chưa thử với sqlachemy, nghĩ. Python có thể chứng minh linh hoạt hơn PHP cho công cụ này.

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.