2012-03-13 7 views
20

Một cuộc tranh luận gần đây với một đồng nghiệp về các cách tiếp cận khác nhau để thiết kế và mã hóa các mô hình trong ứng dụng Rails đã đưa tôi qua số DCI in the context of Rails.DCI là gì và nó có thể phù hợp với Rails như thế nào?

Tuy nhiên, tôi dường như không thể quấn đầu quanh toàn bộ khái niệm đó, ngay cả sau khi đi qua this example application.

Hiện tại, tôi có xu hướng chỉ sử dụng nhiều hơn hoặc ít hơn "by the book" khi viết ứng dụng Rails.

Vì vậy, có một vài điều tôi muốn hỏi -

  • DCI là gì và lợi thế của mình là gì khi thực hiện song song với MVC trên đồng bằng cũ MVC (và vani ActiveRecord trong Rails)?
  • Và làm thế nào nó có thể được thực hiện trong Rails (hoặc nói cách khác, những gì có tất cả các mô-đun)?

Sửa

tôi muốn mở rộng hơn nữa câu hỏi của tôi trong bối cảnh ROR - được một mức độ trừu tượng giữa các mô hình và các bộ điều khiển trong Rails được đề nghị? Làm thế nào phổ biến rộng rãi là nó trong các ứng dụng quy mô khác nhau?

+0

câu hỏi của bạn là vô cùng rộng lớn và có cho rất khó để trả lời. Có khá nhiều nơi có vẻ như bạn đã không nhận được những gì DCI đang làm cho nó thậm chí còn khó khăn hơn để trả lời một số câu hỏi trong bối cảnh DCI. Tôi có thể giúp bạn với các công cụ DCI nếu đó là mục tiêu nhưng bạn cần phải thu hẹp phạm vi sau đó –

+0

Tôi chủ yếu muốn hiểu những gì * là * DCI. Đối với việc thực hiện Rails, một ví dụ đơn giản hoặc thậm chí là một giải thích hai dòng sẽ là tuyệt vời. – GeReV

+0

Câu hỏi hay. Tôi không biết cho đến khi đọc điều này rằng có một cái tên cho mô hình mà tôi đã khao khát chỉ trong thời gian gần đây.Tôi đã nhìn vào mã tôi duy trì (mà tôi đã không viết) và suy nghĩ "Điều này cần là phân chia theo lớp giữa dữ liệu và hành vi." Tôi đoán đây chính là điều mà DCI đang cố gắng làm. –

Trả lời

18

DCI là một mô hình và do đó nhiều hơn một cách để thiết kế một ứng dụng. Đó là một cách để suy nghĩ về mô hình hóa cũng như cấu trúc mã. Một trong những phần quan trọng của DCI là giữ cho hệ thống là gì (mô hình miền) và những gì hệ thống thực hiện (chức năng). DCI không phải là một cách tiếp cận khác để giải quyết cùng một vấn đề với MVC vì vậy câu hỏi đầu tiên của bạn có thể không thực sự được trả lời. Bạn có thể sử dụng đồng thời MVC và DCI mà không phải ngẫu nhiên vì Trygve Renskaug là cha của cả MVC và DCI. Gần đây, anh ấy đã trả lời một số similar question cho điều này trên nhóm 'đối tượng sáng tác' của nhóm google. Ví dụ bạn đã liên kết để vi phạm một số ý tưởng cơ bản như giữ vai trò riêng tư cho các ngữ cảnh và tôi thực sự không thể tìm thấy một ngữ cảnh đơn lẻ, nhưng đó có thể là do chỉ mất một thời gian ngắn để duyệt mã .

Tôi không biết ROR vì vậy tôi không thể cung cấp cho bạn ví dụ về ROR, nhưng nếu bạn truy cập fullOO, bạn sẽ tìm thấy các ví dụ được viết bằng các ngôn ngữ khác nhau bao gồm cả ngôn ngữ đầu tiên của Ruby và Marvin.

EDIT Không có câu trả lời đơn giản cho câu hỏi "DCI" DCI là một mô hình, giống như OOP là một mô hình. Cả hai đều có cùng một nguồn gốc và trả lời câu hỏi trên là phức tạp như trả lời "Lập trình hướng đối tượng là gì". Mọi thứ thậm chí còn phức tạp hơn bởi thực tế là DCI hướng đối tượng và OOP trong tất cả các ngôn ngữ chính của OO thực sự là định hướng lớp và không hướng đối tượng. DCI nhằm mục đích tạo mã khi tương tác giữa các đối tượng tại thời gian chạy được hiển thị trong mã tại thời gian biên dịch và trong các thuật ngữ tổng quát hơn cố gắng mkae dễ dàng hơn để giải thích về hành vi thời gian chạy từ đọc mã. site Tôi đã liên kết ở trên được dành để giải thích DCI là gì và cũng liệt kê các ví dụ bằng một số ngôn ngữ. Ruby là một trong số họ

EDIT Có một số book trên ruby ​​và DCI theo cách của nó.Tác giả là khá tích cực về thành phần đối tượng và sâu sắc

+0

Tôi phải nói ví dụ về Ruby trên fullOO có vẻ hơi kỳ lạ, ví dụ như sử dụng các biến chủ đề. Có bất kỳ ví dụ DCI nào gần gũi hơn với Ruby thành ngữ, hay chỉ là không thể? –

+0

@MatijsvanZuijlen, ví dụ cụ thể. Một số người trong số họ được viết bằng cách sử dụng một số đá quý được viết bằng Ruby thuần khiết. Đá quý sửa một số vấn đề vì Ruby không hỗ trợ các quy tắc phạm vi của DCI, tuy nhiên trải nghiệm gỡ lỗi phần nào thiếu bằng cách sử dụng đá quý đó. Các ví dụ thuần túy của Ruby sau đó vi phạm các quy tắc phạm vi của DCI vì vậy cả hai đều xấp xỉ DCI trong RUby mà không có DCI thực sự (vì điều đó không thể xảy ra trong Ruby mặc dù bạn có thể khá gần) –

+0

Tôi chỉ tìm thấy một ví dụ: http: //fulloo.info/Examples/RubyExamples/Dijkstra/DijkstraListing.html –

5

Có một cuốn sách (hiện đang được tiến hành) về cách sử dụng DCI trong Ruby/Rails: Clean Ruby. Tôi rất khuyên bạn nên đặt mình vào danh sách thông báo - tôi đã đọc các phần của cuốn sách này và có vẻ như thực sự là tốt.

DCI đang được chấp nhận trong thế giới Rails - đã có một số bài đăng trên blog thú vị về nó trong 3 tháng qua.

8

Ở trung tâm của DCI là công cụ nhận thức mà công cụ cung cấp cho nhà phát triển. Tôi không chắc chắn nếu bạn đã nhìn thấy tất cả các bài giảng tuyệt vời James Coplien/Trygve Reenskaug, nhưng tôi sẽ cố gắng để chưng cất ý chính của nó cho bất cứ ai mới đến các khái niệm. Đó là về việc di chuyển hành vi hệ thống ra khỏi các đối tượng miền tương tác của hệ thống (các thực thể dữ liệu, hoặc hệ thống là gì), và vào các đối tượng hành vi (những gì hệ thống làm) như là các công dân hạng nhất làm trung gian cộng tác giữa các đối tượng bằng cách tiêm chúng với chức năng trong bối cảnh của một trường hợp sử dụng chỉ trong thời gian.

Hãy suy nghĩ BDD. Chúng tôi mã hóa hành vi không phải trên nhiều đối tượng như các hạt của chức năng trải rộng trên tất cả các đối tượng dữ liệu được kết hợp với lớp kiên trì, nhưng trong các đối tượng cố kết chỉ tồn tại cho một trường hợp sử dụng (câu chuyện). tương tác của các đối tượng dữ liệu câm này. Giống như các lớp tuyệt đối của một kiến ​​trúc vật lý, các đối tượng dữ liệu thay đổi từ từ không được tải lên với việc triển khai tính năng thay đổi nhanh chóng mà chúng mang theo mọi lúc. Thay vào đó, Ruby cung cấp cho chúng ta khả năng dễ dàng tiêm các hành vi vào các đối tượng trong thời gian chạy khi/nếu cần thiết chỉ trong ngữ cảnh của một ca sử dụng. Như một ví dụ trong ROR, nếu bạn có một hành động điều khiển liên quan đến một trường hợp sử dụng, trong đó có một ma trận xác suất sự kiện, nơi hầu hết các mục có thể được kích hoạt chỉ trong một tỷ lệ nhỏ yêu cầu, sau đó instantiating một mạng của hành vi cồng kềnh các đối tượng cực kỳ có kiến ​​thức để thực hiện mọi sự kiện cho mọi trường hợp sử dụng có thể có của dữ liệu là không cần thiết. Ngoài ra, không phải đào sâu qua 18 tệp trong trình soạn thảo văn bản của tôi để hiểu cách hoạt động của tương tác đó so với việc tất cả logic được trừu tượng hóa rõ ràng thành các mẫu trong giao diện được cung cấp bởi đối tượng ngữ cảnh là một dấu cộng nhất định.

Về câu hỏi của bạn về lớp trừu tượng 'khác' giữa bộ điều khiển và mô hình trong đường ray, tôi không chắc bạn đang nói đến cái nào khác. Bất kể, Vâng. Bằng mọi cách. Không vấn đề gì. Các nguyên tắc Design patterns và Uncle Bobs 'SOLID thường được chấp nhận là thực tiễn tốt nhất trong thiết kế OO. Cả hai yếu tố này đều khuyến khích mạnh mẽ sự trừu tượng hóa lỏng lẻo giữa chính sách và thực hiện. Cả hai đều giúp tránh các bãi não bị phá hủy của đế chế phá hoại đế chế La Mã, bởi vì chúng cung cấp một khuôn khổ chung mà mọi người đều hiểu. DCI, đối với tôi, cung cấp cùng một loại khung nhận thức, nhưng để làm cho một hệ thống dễ hiểu và đối phó hiệu quả hơn, và đây là chén thánh cho bất kỳ nhà thiết kế theo định hướng đối tượng nào.

11

Đối với những người đang tự hỏi whats DCI là viết tắt của ..

DCI là viết tắt của Data Context Interaction