Những gì bạn đang nói là ít cú pháp hơn cấu trúc . Bạn thực sự chỉ có thể có một when
câu lệnh như thế trong một hệ thống thực thi một lượng logic hữu hạn, sau đó thực thi các when
câu lệnh, sau đó lặp lại và thực hiện lại logic, tiếp tục trong một vòng lặp vô hạn.
Ví dụ, lập trình Windows thường là "dựa trên sự kiện". Đăng ký vào Click
sự kiện của một nút về cơ bản có nghĩa là "làm điều này khi nhấp vào". Tuy nhiên, những gì đang diễn ra dưới mui xe là một vòng xử lý tin nhắn. Windows sẽ gửi tin nhắn đến ứng dụng khi người dùng nhấp vào nút và vòng xử lý tin nhắn trong ứng dụng sẽ chạy trình xử lý sự kiện thích hợp.
Ví dụ: nếu bạn sử dụng các sự kiện trong C #, bạn có thể thực hiện việc này mà không cần vòng lặp thông báo, nhưng hạn chế là bạn phải khai báo sự kiện trước thời hạn, vì vậy bạn không thể viết một when
câu lệnh nghệ thuật theo dõi bất kỳ loại nào tiểu bang. Bạn phải chờ đợi một sự kiện cụ thể.
Để có được hành vi này trong Kiến trúc Von Neumann, bạn phải chạy một số loại vòng lặp vô hạn để kiểm tra tất cả các điều kiện mỗi lần thông qua vòng lặp chạy mã thích hợp nếu thích hợp. Trong nội bộ bạn chỉ cần có một danh sách lớn if
/ then
hoặc switch
báo cáo. Hầu hết các ứng dụng máy tính để bàn và lập trình viên web sẽ nôn mửa nếu họ thấy một cấu trúc như vậy, nó thực sự chỉ ngon miệng nếu bạn bọc nó trong một loại đường cú pháp như mô hình sự kiện Windows (mặc dù đó là những gì đang diễn ra dưới mui xe).
Mặt khác, nếu bạn nhìn vào lĩnh vực phát triển phần mềm nhúng, giám đốc điều hành thời gian thực hoặc bộ điều khiển công nghiệp, mô hình lập trình này rất phổ biến. Ví dụ: nếu bạn có chương trình thời gian thực, bạn có thể muốn thể hiện:
outputA = input1 && input2
Mã này rất dễ hiểu (vì nó là khai báo). Tuy nhiên, để làm cho nó hoạt động, bạn phải thực hiện nó trong một vòng lặp chặt chẽ. Bạn đánh giá lại outputA
mỗi lần qua vòng lặp. Rất nhiều lập trình viên máy tính để bàn hoặc web sẽ không thích điều này vì nó không hiệu quả. Đối với họ, lần duy nhất bạn nên đánh giá lại outputA
là khi nào input1
hoặc input2
thay đổi. Họ thà nhìn thấy một cái gì đó giống như bạn đang mô tả:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Bây giờ nếu đây là những gì bạn muốn (và cá nhân tôi không thích ý tưởng này) và mục tiêu của bạn là hiệu quả, thì bạn vẫn phải tự hỏi bộ xử lý đang làm gì dưới mui xe. Rõ ràng vẫn còn một số loại vòng lặp chạy so sánh trạng thái đầu vào với trạng thái đầu vào trước đó mỗi lần và thực thi mã thích hợp mỗi khi thay đổi. Vì vậy, thực sự nó kém hiệu quả và khó đọc hơn và khó bảo trì hơn.
Mặt khác, nếu công việc mà bạn phải làm khi input1
thay đổi là đáng kể, thì when
mệnh đề của bạn có thể có ý nghĩa. Trong PLC, loại lệnh này được gọi là "phát hiện cạnh tăng". Nó lưu trạng thái của input1
lần cuối cùng qua vòng lặp, so sánh nó với giá trị lần này và thực thi logic nếu trạng thái cuối cùng là sai và trạng thái này là đúng.
Nếu bạn không có Kiến trúc Von Neumann, thì trò chơi sẽ thay đổi. Chẳng hạn, nếu bạn đang lập trình một FPGA trong VHDL , thì khi bạn viết:
outputA = input1 && input2
(... Hoặc bất cứ cú pháp VHDL thích hợp nào) thì thực tế, FPGA thực sự được nối dây như vậy input1
và input2
được nối với đầu vào của cổng AND và đầu ra của cổng AND được nối với outputA
. Vì vậy, không chỉ mã dễ hiểu, nó còn được thực thi song song với tất cả các logic khác và nó hiệu quả.
Khi bạn đang nói về một bộ điều khiển công nghiệp như PLC hoặc PAC, được lập trình bằng một trong năm ngôn ngữ IEC-61131-3, trường hợp điển hình là kiểu sắp xếp này:
- Đọc đầu vào và lưu trữ trong bộ nhớ
- Thực hiện chương trình chính
- Ghi đầu ra từ bộ nhớ vào đầu ra thực tế
- Chuyển đến bước 1
Điều này được tích hợp vào kiến trúc của hệ thống, do đó, bạn sẽ chỉ cần viết:
outputA = input1 && input2
... Và nó sẽ được thực hiện trong một vòng lặp liên tục.
Ngoài ra còn có các thói quen gián đoạn trong các máy này. Chúng giống như hỗ trợ mức phần cứng cho when
toán tử mà bạn đang nói đến. Các ngắt phần cứng là một phương tiện để thực hiện một số mã trên một sự kiện bên ngoài. Chẳng hạn, khi một card mạng nói rằng nó có dữ liệu đang chờ, bộ xử lý thường phải đọc dữ liệu đó ngay lập tức hoặc bạn sẽ hết dung lượng bộ đệm. Tuy nhiên, đối với số lần bạn cần thực hiện ngắt phần cứng thực sự, tôi nghi ngờ bao gồm một từ khóa ngôn ngữ cho nó là đáng giá. Bạn sẽ bị giới hạn ở các chân đầu vào CPU và có vẻ như bạn muốn kiểm tra trạng thái chương trình bên trong.
Vì vậy, trong một ngôn ngữ truyền thống (không có vòng lặp chặt chẽ chạy vô tận), bạn phải đặt câu hỏi, "khi nào mã đánh giá chạy"?
Nếu bạn viết:
when A do
launchNukes()
... và giả sử A
là một biểu thức boolean tùy ý, làm thế nào để bạn biết khi nào nên đánh giá lại biểu thức đó? Một triển khai ngây thơ có nghĩa là bạn phải đánh giá lại nó sau mỗi lần ghi bộ nhớ. Bạn có thể nghĩ rằng bạn có thể thu hẹp nó, nhưng hãy xem xét điều này:
when systemTime > actionTime do
launchNukes()
Lưu ý rằng systemTime
luôn luôn thay đổi (mỗi khi bạn đọc nó, bạn sẽ nhận được một số khác nhau). Điều này có nghĩa là phần điều kiện của tất cả các when
mệnh đề của bạn phải được đánh giá lại liên tục. Điều đó gần như không thể (và chỉ cần xem xét trong giây lát những gì sẽ xảy ra nếu biểu hiện có điều kiện của bạn có tác dụng phụ!)
Phần kết luận
Bạn chỉ có thể có một when
câu lệnh (như bạn đang mô tả) trong một kiến trúc dựa trên một vòng lặp vô hạn chạy chương trình chính, sau đó thực thi các when
câu lệnh nếu các điều kiện chuyển từ false thành true trên vòng lặp này. Mặc dù kiến trúc này là phổ biến trong các thiết bị nhúng và công nghiệp, nhưng nó không phổ biến trong các ngôn ngữ lập trình mục đích chung.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from ...
. Ngoài ra: msdn.microsoft.com/en-us/l Library / dd233249.aspx Về cơ bản tôi sẽ thực hiện tìm kiếm "khi" sử dụng tìm kiếm mã Google.