Lập trình hướng dữ liệu là gì?


92

Tôi đã được giao nhiệm vụ viết một kế hoạch kỹ thuật chi tiết cho một ứng dụng hậu cần mà chúng tôi đang viết mã để đề xuất cho khách hàng. Tôi đã được cho biết rằng nó là một ứng dụng hướng dữ liệu. Điều đó có nghĩa là gì đối với một ứng dụng "hướng dữ liệu"? Ngược lại là gì? Tôi dường như không thể nhận được bất kỳ câu trả lời thực sự rõ ràng nào cho điều này mặc dù trong khi tìm kiếm trên web, tôi có thể thấy nhiều người đăng các ví dụ của riêng họ. Mọi sự trợ giúp sẽ rất được trân trọng.


2
Khá nhiều lập trình trong thế giới thực đều dựa trên dữ liệu.
Martin Spamer

16
Cuốn sách kinh điển về Nghệ thuật Lập trình Unix có một cuộc thảo luận tốt về chủ đề này: trang chủ.cs.uri.edu/~thenry/resources/unix_art/ch09s01.html . Trích dẫn chính: "Trong lập trình hướng dữ liệu, dữ liệu không chỉ là trạng thái của một đối tượng nào đó, mà còn thực sự xác định luồng điều khiển của chương trình . Trong đó mối quan tâm chính trong OO là đóng gói, mối quan tâm chính trong lập trình hướng dữ liệu là viết càng ít mã cố định càng tốt . "
FMc

2
Câu trả lời của FMc đối với tôi là lời giải thích thuyết phục nhất, và nên là một câu trả lời, nhưng được chi tiết hóa.
Mads Skjern

Câu trả lời:


94

Kết hợp theo hướng dữ liệu là một mô hình lập trình trong đó dữ liệu tự điều khiển luồng chương trình chứ không phải logic chương trình. Đây là một mô hình mà bạn kiểm soát luồng bằng cách cung cấp các bộ dữ liệu khác nhau cho chương trình trong đó logic chương trình là một số dạng chung của luồng hoặc thay đổi trạng thái.

Ví dụ: nếu bạn có chương trình có bốn trạng thái: LÊN - XUỐNG - DỪNG - BẮT ĐẦU

Bạn có thể kiểm soát chương trình này bằng cách cung cấp đầu vào (dữ liệu) đại diện cho các trạng thái:

  • set1: XUỐNG - DỪNG - BẮT ĐẦU - DỪNG - LÊN - DỪNG
  • set2: LÊN - XUỐNG - LÊN - XUỐNG

Mã chương trình được giữ nguyên nhưng tập dữ liệu (không thuộc kiểu đầu vào động mà được cấp tĩnh cho máy tính) điều khiển luồng.


3
Phần lập trình là viết / xác định "dạng chung của luồng hoặc thay đổi trạng thái", tôi nói đúng không? Nhưng tôi có thể viết một "cái máy" như vậy bằng bất kỳ ngôn ngữ nào, và không có gì bất thường về điều đó, vì vậy tôi thực sự không hiểu gì từ câu trả lời của bạn. Có lẽ lập trình theo hướng dữ liệu là khi chính ngôn ngữ hoặc một thư viện khuyến khích hoặc làm cho việc viết những cỗ máy như vậy trở nên rất dễ dàng. Hoặc có thể định nghĩa là ngôn ngữ / thư viện cho phép người ta định nghĩa các máy theo cách khai báo, tức là không theo thủ tục.
Mads Skjern

2
Trên en.wikipedia.org/wiki/Data-driven_programming , họ sử dụng AWK làm ví dụ. Trong AWK có hai thứ được cung cấp, một biểu thức xác định những việc phải làm với dữ liệu và chính dữ liệu đó. Biểu thức xác định điều gì sẽ xảy ra được coi là: 1) lập trình, hoặc 2) dữ liệu. Nếu nó được coi là dữ liệu, thì chương trình là chính máy của AWK, tất nhiên trong ví dụ về AWK là tĩnh. Nhưng trong các bối cảnh khác, ví dụ nếu viết chính máy theo một số cách thủ tục truyền thống, thì đó chỉ là phần lập trình.
Mads Skjern

Vì vậy, ... giả sử các ví dụ lập trình ổ đĩa dữ liệu mạnh mẽ hơn đã hoàn tất, điều này không chỉ đơn giản trở thành một câu lệnh bao gồm trong một công cụ với một số giả định và công cụ được xây dựng trước?
ZirconCode

54

Mặc dù có nhiều ý kiến ​​về việc lập trình theo hướng dữ liệu là gì, hãy cho phép tôi đưa ra một ví dụ bằng cách sử dụng cấu trúc dữ liệu và một hàm.

Ví dụ không theo hướng dữ liệu:

data_lloyd = {'name': 'Lloyd', 'lives': 'Alcoy }
data_jason = {'name': 'Jason', 'lives': 'London' }
go = function(x) 
    if x.name == 'Lloyd' 
    then 
        print("Alcoy, Spain") 
    else 
        print("London, UK") 
end

Ví dụ theo hướng dữ liệu:

data_lloyd = {'name': 'Lloyd', 'lives': function(){ print("Alcoy, Spain") }
data_jason = {'name': 'Jason', 'lives': function(){ print("London, UK") }
go = function(x)
    x.lives()
end

Trong ví dụ đầu tiên, quyết định hiển thị kết quả này hay kết quả khác nằm trong logic mã. Trong ví dụ cuối cùng, đầu ra được xác định bởi dữ liệu được chuyển đến hàm và vì lý do đó, chúng tôi nói rằng đầu ra được 'điều khiển' bởi dữ liệu.


3
Tôi biết đây là một ví dụ đơn giản, nhưng ví dụ không hướng dữ liệu trông giống như một ví dụ về mã hóa cẩu thả. Có phải theo hướng dữ liệu chỉ có nghĩa là thực hành mã hóa tốt? Nếu vậy, tại sao mọi người lại muốn theo đuổi cách tiếp cận không theo hướng dữ liệu?
Jin

4
Tôi xin lỗi, nhưng ví dụ đầu tiên trông giống như lập trình chức năng (trong đó dữ liệu và hành vi được tách rời) và ví dụ thứ hai giống như hướng đối tượng (nơi dữ liệu và hành vi được kết hợp).
Vakey

47

"Tôi đã được nói rằng nó là một ứng dụng hướng dữ liệu" - bạn cần hỏi ai đã nói với bạn điều đó.

Bạn không muốn đọc một số câu trả lời hợp lý ở đây và sau đó phát hiện ra rằng đó hoàn toàn không phải ý của người phụ trách dự án của bạn. Cụm từ quá mơ hồ để có một ý nghĩa rõ ràng chắc chắn sẽ áp dụng cho dự án của bạn.


8
Tôi hiểu ý bạn là Richie, và đó là một điểm tốt. Tuy nhiên, tôi đã tự hỏi liệu "lập trình theo hướng dữ liệu" có phải là một thuật ngữ nào đó được ngành phát triển phần mềm công nhận hay không. Tôi sẽ không nhận bất kỳ câu trả lời nào từ đây chỉ đơn giản là mệnh giá ở đây mà không kiểm tra lại với sếp của tôi. -Cảm ơn :)
jtbradle

5
Chắc chắn - bạn đã đúng khi hỏi ở đây. Nhưng tôi nghĩ câu trả lời là không có định nghĩa được chấp nhận rộng rãi.
RichieHindle

Nó được gọi là gì khi bạn tạo UX của mình từ siêu dữ liệu? Nó được gọi là gì khi quy trình làm việc của bạn được kiểm soát bởi cấu hình bên ngoài? Đó có phải là Kiến trúc theo hướng dữ liệu và Kiến trúc theo hướng sự kiện không? Liệu Lập trình theo hướng dữ liệu có giống với WSDL và GraphQL hơn trong đó các mô hình của bạn được tạo nhưng bạn vẫn viết mã dựa trên chúng theo cách bạn thấy phù hợp không?
Corey Alix

15

Phát triển theo hướng dữ liệu là thứ mà người ta có thể thay đổi logic của chương trình bằng cách chỉnh sửa không phải mã mà là cấu trúc dữ liệu.

Bạn có thể tìm thêm thông tin về lập trình theo hướng dữ liệu trên http://www.faqs.org/docs/artu/ch09s01.html

Lập trình thủ tục

var data = { 
            {do:'add',arg:{1,2}},
            {do:'subtract',arg:{3,2}},
            {do:'multiply',arg:{5,7}},
            };

foreach(var item in data){  
    switch(item.do){
        case 'add':
            console.log(item.arg[0] + item.arg[1]);
        break;
        case 'subtract':
            console.log(item.arg[0] - item.arg[1]);
        break;
        case 'multiply':
            console.log(item.arg[0] * item.arg[1]);
        break;
    }
}

Lập trình theo hướng dữ liệu

var data = { 
            {do:'+',arg:{1,2}},
            {do:'-',arg:{3,2}},
            {do:'*',arg:{5,7}},
            };

foreach(var item in data){      
    console.log(eval (item.arg[0] + item.do + item.arg[1]);
}

7

Ứng dụng hướng dữ liệu là:

(1) một tập hợp các quy tắc chấp nhận các tập dữ liệu khác nhau để đưa ra quyết định định trước cho từng tập dữ liệu cụ thể và đưa ra kết quả

(2) một số quá trình xác định trước được kích hoạt dựa trên kết quả.

Ví dụ hoàn hảo là ifttt.com

Ứng dụng không có gì ngoài quy tắc. Điều làm cho nó hữu ích là dữ liệu sẽ chảy qua nó.


4

Bài viết này giải thích rõ ràng nhất những gì tôi hiểu thuật ngữ có nghĩa là:

Lập trình theo hướng bảng và theo hướng dữ liệu là gì? http://www.paragoncorporation.com/ArticleDetail.aspx?ArticleID=31

Lập trình theo hướng dữ liệu / theo bảng là kỹ thuật bao gồm các cấu trúc lập trình lặp đi lặp lại thành dữ liệu và một mẫu chuyển đổi. Dữ liệu mới này thường được những người theo chủ nghĩa thuần túy gọi là siêu dữ liệu khi được sử dụng theo cách này.


1

Không có ai tại nơi làm việc có thể giúp bạn với câu hỏi này? Rất khó để hình dung những gì bạn đang làm mà không có một ví dụ cụ thể hơn. Nhưng từ những gì tôi thu thập được, nó sẽ là một chương trình mà họ chủ yếu nhập thông tin vào. Điều đó sẽ có thể truy xuất và chỉnh sửa thông tin mà khách hàng cần quản lý.

May mắn nhất!!


1

Tôi nghĩ rằng lời khuyên đưa ra không phải là tồi, nhưng tôi luôn nghĩ về Thiết kế theo hướng dữ liệu xoay quanh việc sử dụng các cấu trúc dữ liệu hiện có hoặc đã cho làm nền tảng cho các đối tượng miền của bạn.

Ví dụ: chương trình quản lý nhân viên bán hàng cổ điển có thể có kiểu cấu trúc bảng sau:

  • Nhân viên bán hàng
  • Khu vực
  • Khách hàng
  • Các sản phẩm

Vì vậy, ứng dụng của bạn sẽ tập trung vào việc quản lý các cấu trúc dữ liệu này, thay vì sử dụng một API trực tiếp thực hiện những việc như - "bán hàng", v.v.

Chỉ là ý kiến ​​của tôi như các câu trả lời khác gợi ý;)

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.