Apa yang Anda bicarakan kurang sintaksis daripada struktur . Anda benar-benar hanya dapat memiliki whenpernyataan seperti itu dalam sistem yang mengeksekusi jumlah logika yang terbatas, kemudian mengeksekusi whenpernyataan, kemudian memutar dan mengeksekusi logika lagi, melanjutkan dalam loop yang tak terbatas.
Misalnya pemrograman Windows biasanya "berbasis acara". Berlangganan acara tombol pada Clickdasarnya berarti "lakukan ini saat diklik". Namun, apa yang terjadi di bawah tenda adalah loop pemrosesan pesan. Windows mengirim pesan ke aplikasi ketika pengguna mengklik tombol, dan loop pemrosesan pesan di aplikasi menjalankan pengendali acara yang sesuai.
Jika Anda menggunakan acara di, misalnya, C #, Anda dapat melakukan ini tanpa loop pesan, tetapi batasannya adalah Anda harus mendeklarasikan acara sebelumnya, jadi Anda tidak dapat menulis whenpernyataan artibrary yang mengawasi segala jenis negara. Anda harus menunggu acara tertentu.
Untuk mendapatkan perilaku ini dalam Arsitektur Von Neumann Anda harus menjalankan semacam infinite loop yang memeriksa semua kondisi setiap kali melalui loop menjalankan kode yang sesuai jika sesuai. Internal Anda hanya mendapatkan daftar besar if/ thenatau switchpernyataan. Sebagian besar aplikasi desktop dan pemrogram web akan muntah jika mereka melihat konstruksi seperti itu sehingga benar-benar hanya enak jika Anda membungkusnya dengan semacam gula sintaksis seperti model acara Windows (meskipun itulah yang terjadi di bawah tenda).
Di sisi lain, jika Anda melihat bidang pengembangan firmware tertanam, eksekutif waktu nyata, atau pengontrol industri, model pemrograman ini sangat umum. Misalnya, jika Anda memiliki program waktu nyata, Anda mungkin ingin mengungkapkan:
outputA = input1 && input2
Kode ini mudah dipahami (karena bersifat deklaratif). Namun, untuk membuatnya bekerja, Anda harus menjalankannya dalam lingkaran yang ketat. Anda mengevaluasi kembali outputAsetiap kali melalui loop. Banyak pemrogram desktop atau web tidak akan menyukai ini karena tidak efisien. Bagi mereka, satu-satunya waktu Anda harus mengevaluasi kembali outputAadalah kapan input1atau input2berubah. Mereka lebih suka melihat sesuatu yang lebih seperti Anda gambarkan:
when input1 changes
evaluateOutputA()
when input2 changes
evaluateOutputA()
evaluateOutputA()
outputA = input1 && input2
Sekarang jika ini yang Anda inginkan (dan secara pribadi saya tidak suka ide ini), dan tujuan Anda adalah efisiensi, maka Anda masih harus bertanya pada diri sendiri apa yang sedang dilakukan prosesor di bawah tenda. Jelas masih ada semacam loop berjalan yang membandingkan status input ke status input sebelumnya setiap kali, dan mengeksekusi kode yang sesuai setiap kali ada perubahan. Jadi sebenarnya ini kurang efisien dan lebih sulit untuk dibaca dan lebih sulit untuk dipertahankan.
Di sisi lain, jika pekerjaan yang harus Anda lakukan ketika input1perubahan signifikan, maka whenklausa Anda mungkin masuk akal. Dalam PLC jenis instruksi ini disebut "deteksi tepi naik". Ini menyimpan keadaan input1pada saat terakhir melalui loop, membandingkannya dengan nilai saat ini, dan mengeksekusi logika jika keadaan terakhir salah dan keadaan ini benar.
Jika Anda tidak memiliki Arsitektur Von Neumann, maka gamenya berubah. Misalnya jika Anda memprogram FPGA dalam VHDL , maka saat Anda menulis:
outputA = input1 && input2
(... Atau apa pun sintaks VHDL yang sesuai akan) maka FPGA benar-benar akan ditransfer sedemikian rupa input1dan input2ditransfer ke input gerbang AND, dan output dari gerbang AND ditransfer ke outputA. Jadi, kode ini tidak hanya mudah dimengerti, tetapi juga dijalankan secara paralel dengan semua logika lainnya, dan juga efisien.
Saat Anda berbicara tentang pengontrol industri seperti PLC atau PAC, yang diprogram dalam salah satu dari lima bahasa IEC-61131-3, kasus umumnya adalah pengaturan seperti ini:
- Baca input dan simpan di memori
- Jalankan program utama
- Tulis output dari memori ke output aktual
- Lanjutkan ke langkah 1
Ini dibangun ke dalam arsitektur sistem, jadi diharapkan Anda hanya akan menulis:
outputA = input1 && input2
... dan itu akan dieksekusi dalam satu loop berkelanjutan
Ada juga interupsi rutin di mesin ini. Ini lebih seperti dukungan tingkat perangkat keras untuk whenoperator yang sedang Anda bicarakan. The interrupt hardware merupakan sarana mengeksekusi beberapa kode pada sebuah peristiwa eksternal. Misalnya, ketika kartu jaringan mengatakan bahwa ia memiliki data yang menunggu, prosesor biasanya harus segera membaca data itu atau Anda akan kehabisan ruang buffer. Namun, untuk berapa kali Anda perlu mengaitkan interupsi perangkat keras yang sebenarnya, saya ragu memasukkan kata kunci bahasa untuk itu bermanfaat. Anda akan terbatas pada pin input CPU, dan sepertinya Anda ingin menguji status program internal.
Jadi, dalam bahasa tradisional (tanpa loop ketat yang berjalan tanpa batas) Anda harus mengajukan pertanyaan, "kapan kode evaluasi berjalan"?
Jika Anda menulis:
when A do
launchNukes()
... dan dengan asumsi Aadalah ekspresi boolean yang sewenang-wenang, bagaimana Anda tahu kapan harus mengevaluasi kembali ekspresi itu? Implementasi yang naif berarti Anda harus mengevaluasi kembali setelah setiap memori tunggal ditulis. Anda mungkin berpikir bahwa Anda dapat mempersempitnya, tetapi pertimbangkan ini:
when systemTime > actionTime do
launchNukes()
Perhatikan bahwa systemTimeselalu berubah (setiap kali Anda membacanya, Anda akan mendapatkan nomor yang berbeda). Ini berarti bahwa bagian bersyarat dari semua whenklausa Anda harus dievaluasi ulang secara terus menerus. Itu hampir mustahil (dan pertimbangkan sejenak apa yang terjadi jika ekspresi kondisional Anda memiliki efek samping!)
Kesimpulan
Anda hanya dapat memiliki whenpernyataan (seperti yang Anda gambarkan) dalam arsitektur berbasis di sekitar loop tak terbatas yang menjalankan program utama, lalu jalankan whenpernyataan jika kondisinya berubah dari false menjadi true pada loop ini. Meskipun arsitektur ini umum di perangkat yang disematkan dan industri, itu tidak umum dalam bahasa pemrograman tujuan umum.
select case table1.col1 when 1 then 'Y' else 'N' end as col1_yn from .... Juga: msdn.microsoft.com/en-us/library/dd233249.aspx Pada dasarnya saya akan melakukan pencarian untuk "kapan" menggunakan pencarian kode Google.