Bạn có thấy việc sử dụng cho lập trình Bảng tính không? [đóng cửa]


11

Cách đây một thời gian, tôi tình cờ thấy khái niệm sử dụng bảng tính (ý tôi là các ô và công thức không phải là mã Macro) như một cách để xác định logic lập trình. Ý tưởng là:

  • tạo một bảng tính với luồng tính toán được xác định rõ ràng (đôi khi phù hợp hơn với mô hình "dataflow" của bảng tính thay vì các kiểu lập trình hướng đối tượng hoặc hướng đối tượng)

  • xác định ô nhập

  • xác định các ô đầu ra

  • biên dịch toàn bộ thành một lớp thực thi độc lập (hoặc hàm, thủ tục, ...)

  • sử dụng nó trong mã bình thường trong một dự án phần mềm rộng hơn

  • sử dụng bảng tính làm mã nguồn được duy trì theo thời gian

Ý tưởng là sử dụng kỹ thuật này cho các vấn đề thực sự phù hợp với mô hình và điều này sẽ dẫn đến mã được tài liệu tốt và dễ bảo trì một cách tự nhiên. Tôi quan tâm đến việc biết liệu bạn đã có kinh nghiệm sử dụng kỹ thuật này và để làm gì. Một ứng dụng ví dụ xuất hiện trong đầu tôi là các máy tính thuế bảo hiểm, thường được soạn thảo, tạo và xác thực bởi các chuyên gia tính toán trên các trang tính Excel và chỉ sau đó được mã hóa (đó là một quá trình đau đớn) trong một số logic lập trình khó bảo trì.


Tôi không vui khi kết thúc câu hỏi này. Ok, không có câu trả lời như "có" hoặc "không" hoặc "str numplace ()", nhưng nó bắt đầu cuộc thảo luận thú vị. Ở đây chúng tôi đi: meta.programmers.stackexchange.com/questions/5652/ trên
ern0

@ ern0 bạn đã kiểm tra trang tour chưa? "Lập trình viên là tất cả về việc nhận câu trả lời . Đây không phải là một diễn đàn thảo luận ..."
gnat

Câu trả lời:


5

Mặc dù nó không chính xác là kiểu "xây dựng bảng tính, biên dịch nó thành mã" mà bạn đã hỏi về, phần mở rộng dataflow của Cells cho CLOS sử dụng một mô hình tương tự: Công thức biểu thị các luồng dữ liệu và biến đổi là "biểu diễn vật liệu nguồn" / " của bản ghi "cho thiết kế đối tượng / lớp. Hãy coi đó là một cách khác để xây dựng những gì bạn đang hỏi về.

Và chỉ để giải trí: macro bảng tính


1
Tôi chắc chắn rằng đây không phải là điều OP nghĩ đến.
zzzzBov

4
@zzzzBov, mặc dù, nó hoàn toàn phù hợp với mô tả của OP.
SK-logic

3

mà đôi khi phù hợp hơn với mô hình "dataflow" của bảng tính thay vì các kiểu lập trình hướng đối tượng hoặc hướng đối tượng

Thành thật mà nói, tôi khó có thể nghĩ ra bất kỳ tính toán trong thế giới thực nào khi áp dụng điều này. Lập trình "Dataflow" có thể dễ dàng thực hiện rất nhiều ngôn ngữ lập trình hiện đại (nhìn vào LINQ trong thế giới .NET hoặc các toán tử xử lý danh sách của Perl và Python), và theo kinh nghiệm của tôi, điều đó dẫn đến mã có thể duy trì nhiều hơn so với một bó của "công thức bảng tính" với các tham chiếu ô khó bảo trì.

Mặt khác, tôi và các đồng nghiệp của mình đã tạo ra rất nhiều ứng dụng dựa trên bảng tính (chính xác là MS-Excel), trong đó Excel được sử dụng như một công cụ thân thiện với người dùng để nhập dữ liệu đầu vào / tạo mặt nạ đầu vào rất nhanh hoặc để tạo đầu ra được định dạng hoặc cả hai. Trong tất cả các trường hợp đó, việc tính toán hoặc xử lý dữ liệu đó không được thực hiện (hoặc chỉ được thực hiện một phần) bởi các công thức Excel, nhưng theo mã chương trình, vì các công thức Excel không đủ mạnh hoặc công cụ hoàn toàn sai (và tin tôi, chúng tôi có một nhiều kiến ​​thức những gì có thể với công thức Excel và những gì không).


2

Kể từ khi tôi đọc bài viết này, tôi đã suy nghĩ nhiều về khái niệm này. Tôi nghĩ rằng chắc chắn có một sử dụng cho nó.

Một điều về tối ưu hóa một điều như vậy, một bảng tính rất giống với không gian bộ nhớ. Nó cũng rất giống với không gian hiển thị và in (như trong x, y). Có rất nhiều lợi ích ở đó.

Khi bạn lưu ý khả năng bảo trì, điều đó đã mở ra rất nhiều ý tưởng cho tôi. Tôi không biết những gì ở ngoài đó để biên dịch với các tính năng thực sự và ngôn ngữ, thư viện, v.v. có thể khá khó khăn. Tuy nhiên, có thể có một tương lai trong đó ở đâu đó.

Tôi thực sự chỉ viết các tập lệnh VB cho bảng tính, sổ điểm và phần mềm "phần mềm" kế toán. Không bao giờ tạo các ứng dụng thực thi từ bất kỳ bảng tính nào ngoại trừ giao diện tệp excel từ ứng dụng C ++.


1

Có, tuy nhiên tôi nghĩ về nó nhiều hơn là "kiểm tra bảng tính" chứ không phải là "lập trình bảng tính". Ví dụ, gần đây tôi đang làm việc trên một tính năng cho dự án của chúng tôi liên quan đến việc thực hiện tính toán trên số lượng lớn các bản ghi cơ sở dữ liệu. Việc tính toán tương đối đơn giản nhưng quan trọng và rất cần sự chú ý kiểm tra cụ thể. Hơn nữa, công thức chúng tôi đang sử dụng đòi hỏi một lượng nhỏ thích ứng để áp dụng cho tình huống của chúng tôi.

Tôi đã thực hiện một số tính toán bằng tay để viết các bài kiểm tra đơn vị của mình, trong khi người kiểm tra mà tôi đang làm việc đã tạo ra một bảng tính như bạn đã mô tả để sử dụng trong các bài kiểm tra đầu cuối của mình. Do sự thích ứng của công thức nguồn, chúng tôi không có bất kỳ dữ liệu kiểm tra độc lập nào để so sánh, do đó bảng tính đã cung cấp một loại kiểm tra kiểu "sổ sách kế toán kép" giúp chúng tôi tự tin rằng mã là chính xác.

Vì vậy, có, tôi thấy kỹ thuật này rất hữu ích như là một nguồn dữ liệu thử nghiệm cho các trường hợp các phép tính liên quan dễ thực hiện trong bảng tính nhưng nếu không thì phải thực hiện theo mã. Tuy nhiên, một bảng tính như vậy không nên được sử dụng để "chỉ định logic lập trình" cho mỗi se, mà chỉ là (các) kết quả cuối cùng được yêu cầu.


1

"Lập trình" bảng tính là một loại lập trình dataflow.

Chúng tôi có một vấn đề ngôn ngữ với nó, chúng tôi không nên gọi nó là "lập trình", bởi vì nó ít hơn nhiều so với chúng tôi gọi là lập trình, nhưng nó chắc chắn nhiều hơn là nhập dữ liệu vào một chương trình.

Lập trình Dataflow là một kiến ​​trúc và kỷ luật, trong đó ứng dụng là một mạng gồm các mô-đun độc lập, chúng gửi các thông điệp (dữ liệu) cho nhau. Mô hình này không áp dụng cho mọi vấn đề, chỉ áp dụng cho những vấn đề, nơi có dữ liệu nguồn hoặc luồng (hoặc có nhiều hơn), đi qua mạng xử lý và tạo ra dữ liệu / luồng đầu ra. Xem danh sách dưới đây.

Lập trình Dataflow có một số loại, hãy xem một số:

  • Bảng tính: số đầu vào được xử lý theo công thức, sau đó kết quả số và biểu đồ. Các đặc điểm đặc biệt: thời gian ngoại lệ là "một lần bắn", khi giá trị đầu vào (thành phần) thay đổi, phần chiếm dụng của biểu đồ xử lý sẽ chạy lại và tạo đầu ra.
  • Unix pipe: shell khởi chạy một số chương trình và liên kết stdout-> stdin. Đặc điểm đặc biệt: chỉ cho phép liên kết kiểu ống, biểu đồ là một hàng đợi duy nhất.
  • Thực hiện đồng bộ hóa: có một đồng hồ, kích hoạt xử lý khung hoặc mẫu theo tần số xác định. Mỗi thành phần chạy một lần một chu kỳ đồng hồ. Các hệ thống xử lý video và âm thanh là các ví dụ, chúng hoạt động với tốc độ khung hình / mẫu được chỉ định.
  • Thực thi không đồng bộ: biểu đồ ở chế độ chờ, cho đến khi xảy ra sự kiện bên ngoài. Sau đó, nó xử lý sự kiện, tạo ra một số đầu ra (hoặc không) và chuyển sang trạng thái không hoạt động.

Quay lại câu hỏi của bạn: Tôi nghĩ là có, nên xuất bản một ứng dụng dataflow dưới dạng một ứng dụng độc lập. Tôi đã thực hiện nó. Hai lần .

Tôi và một người bạn của tôi đã tạo ra một hệ thống DF nguyên mẫu cho tự động hóa nhà. Chúng tôi không có trình chỉnh sửa biểu đồ, do đó người dùng không thể chỉnh sửa ứng dụng, một số tham số được lưu trữ trong tệp cấu hình, nhưng không có gì khác. Chúng tôi có một ngôn ngữ tập lệnh DF, được "biên dịch" thành mã C ++ (một danh sách các định nghĩa thông báo và tạo thành phần), được biên dịch thành một tệp thực thi riêng. Các mô-đun là các lớp C ++ (các lớp khác, chỉ để có được một số thông tin về hệ thống của chúng tôi: Message, Dispathcer, Thành phần (trừu tượng), Cổng (trừu tượng), ConsumerPort, ProducerPort).

Ngoài ra, chúng tôi rất ngạc nhiên về những ưu điểm của hệ thống DF cung cấp: chúng tôi đã tạo ứng dụng sniffer nối tiếp trong vòng 2 phút hoặc chúng tôi đã thực hiện một chương trình thử nghiệm tại chỗ , trong đó nhấp nháy từng cái một (không có tài liệu nào trên ID phần cứng). Chúng tôi đã tạo các thành phần MIDI và joypad chỉ để giải trí, tôi cũng đã tạo ra một cơ quan nhẹ với nó (xem http://homeaut.com/under_con cản / ).

Tôi chỉ có thể thấy một khó khăn trong trường hợp bảng tính: vì mọi số và công thức (có khả năng: mọi ô) là một thành phần, biểu đồ của bạn không phải là cuối cùng. Khi bạn thêm một dòng vào ứng dụng sum () đơn giản của mình, điều đó có nghĩa là biểu đồ dataflow bị thay đổi. Vì vậy, bạn phải "lập trình lại" biểu đồ trong thời gian chạy, hoặc chúng ta nên gọi nó là "siêu lập trình". Trong Excel, một macro sẽ thực hiện công việc, nhưng sau đó chúng ta mất đi độ tinh khiết của dataflow.

Tôi có một giải pháp không quá tệ nhưng không hoàn hảo. Tôi đã tạo một bảng tính, một ứng dụng AJAX với phụ trợ PHP. Trục dọc là thời gian (ngày), các đường là thành phần. Có các thành phần, như đầu vào (dòng có thể được chỉnh sửa bởi người dùng), trung bình dọc, trung bình / tổng ngang và một số tính toán thống kê theo miền cụ thể. Chỉ có một vấn đề với nó: đây là "một chiều". Miễn là tôi muốn chỉ tổng và avg và bất cứ điều gì, tôi có thể thêm các dòng mới và tạo thành phần, tính toán các công cụ. Nhưng có một hạn chế lớn: các cột luôn là ngày (tôi đã thực hiện "lượt xem" trong tuần và tháng, hiển thị dữ liệu hàng ngày dưới dạng tổng / avg, nhưng nó vẫn là một chiều). Tôi không thể hiển thị nó, nó hợp tác và yêu cầu tác vụ phụ trợ PHP để chạy 7/24, nó không được nhà cung cấp máy chủ của tôi hỗ trợ.

Vì vậy, mô hình của tôi (có thể được mô tả tốt nhất là: "ngày theo chiều ngang") không thể xử lý các loại vấn đề khác.

Tôi có một ý tưởng, làm thế nào để giải quyết vấn đề này: các tab .

Khi bạn bị kẹt trong Excel và phải tạo một bảng khác, bạn có thể sử dụng một khu vực riêng biệt trên cùng một tab hoặc mở một tab khác. Ngoài ra, tham chiếu giữa các tab là không thoải mái, tôi thích phương pháp đầu tiên. Tôi nghĩ, các tab nên được hiển thị trên cùng một màn hình, giống như các cửa sổ không chồng chéo.

Mỗi bảng nên có trục phát triển: dọc, ngang hoặc cố định. Các bảng tăng trưởng dọc có các thành phần dòng (như bảng tính dựa trên ngày của tôi), trong đó tất cả các cột có công thức "giống nhau", các thành phần nằm ngang có các thành phần cột, các bảng có kích thước cố định giống như bất kỳ bảng tính nào.

Vì vậy, khi người dùng thêm một dòng / cột mới, dòng / cột mới sẽ có cùng một công thức.

Ngoài ra, trong bảng tính, tôi ghét điều này, rằng tôi cần sao chép các công thức rất giống nhau 1000 lần, nếu tôi có 1000 dòng. Đó là một nguồn lỗi (giữ phiên bản cũ của công thức trong một số dòng), lãng phí bộ nhớ (lưu trữ cùng một công thức 1000x).

Có thể tôi sai, và có lỗi khái niệm trong mô hình này, nhưng tôi hy vọng nó là một cách kích thích tư duy tốt.


Tôi thường tự hỏi liệu bảng tính có cần một câu "Hàng: Địa chỉ cột được coi là có hại" không. Trong đó mọi thứ là một phạm vi được đặt tên và các công thức áp dụng cho các phạm vi và các ô được sử dụng làm đầu vào / hiển thị.
Sherwood Botsford

0

Tôi nghĩ rằng sẽ sử dụng bảng tính để xác định logic cho các tính toán và trong khi thực hiện việc này, hãy cố gắng thiết lập bảng tính theo cách để làm cho ngôn ngữ lập trình trở nên thân thiện. Ý tôi là thân thiện -> sử dụng phạm vi tên / tham chiếu thay vì tọa độ cellXY và chia nhỏ công thức thành các phần nhỏ hơn.

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.