Workflow dengan Windows Workflow Foundation
Soeleman 28 Februari 2017
Console
Pada kesempatan ini kita akan menggunakan projek console sebagai host dari Workflow Flowchart.
Reference
Penting kita menambahkan pada references, System.Activities di projek. Terutama karena kita akan bekerja dengan Windows Workflow Foundation (WWF).
< VB.NET >
< C# >
Activity
Kita akan mengunakan 'visual' dari WWF. Dan kita akan membuat/menambahkan Activity dengan pilihan seperti pada gambar dibawah.
< VB.NET >
< C# >
YesNo Activity
Activity yang akan kita buat ini untuk mendukung flowchart yang akan di buat. Fungsi YesNoActivity ini sebagai input validator. Kenapa perlu ada validator? Karena kita hanya mengharapkan user hanya memberikan jawaban Y('Y' atau 'y') atau N('N' atau 'n'). Di luar itu kita akan 'memaksa' user untuk memberikan jawaban seperti yang diharapkan.
Bisa saja ditulis dalam bentuk kode, hanya saja ditulisan ini kita akan buat itu sebagai flowchart. Boleh dibilang ini sebagai sub-flowchart dari flowchart utama. Lagi pula kita akan menggunakan ini beberapa kali, jadi lebih baik kita buat flowchart terpisah.
Sekarang kita Add Activity seperti pada gambar di atas. Kita beri nama YesNoActivity.xaml
.
Flowchart
Saat ini kita akan menggunakan Workflow Flowchart Type. Caranya mudah, cukup di-drag flowchart component ke dalam Activity Page. Tips: Drag-nya sampai ke tulisan di tengah.
Setelah itu kita akan melihat 'box' dalam YesNoActivity.xaml
. Type Flowchart ini memiliki tanda Start sebagai awalan, seperti pada gambar di bawah.
Flowchart Variable
Dalam process yang akan terjadi, kita memerlukan sebuah variable untuk menyimpan informasi. Variable itu ber-type String dengan nama YesNoAnswer.
Menambahkan variable di flowchart cukup klik tulisan Variables yang ada di kiri bawah. Dan jangan lupa agar scope-nya sesuai dengan flowchart-nya, terlihat dengan gambar panah.
Flowchart Argument
Di karenakan ini merupakan Sub-Workflow, maka perlu ada cara untuk memberikan informasi ke Main-Workflow. Salah satu caranya dengan membuat Argument.
Hampir sama dengan variable, bedanya diklik tulisan Arguments yang berada disebelah Variables. Di sini kita buat argument ber-Argument-type String dan Direction In/Out dengan nama TheAnswer.
WriteLine Activity
Kita perlu memberikan informasi ke user. Maka kita drag WriteLine dan kita isi dengan "Enter answer (Y/N):". Dengan begitu kita bisa memberitahukan agar jawabannya hanya Y/N. Dan jangan lupa tarik panah dari Start ke WriteLine ini.
Assign Activity
Assign biasanya di gunakan untuk menulis kedalam sebuah variable yang ada dalam scope dari Workflow. Tapi kita bisa gunakan ini sebagai Input dengan menggunakan Expression sebagai Value. Kita bisa melihat lebih jelas dari Properties Windows, seperti layaknya control pada Winform, WebForm atau Xaml-based.
Sama seperti WriteLine, kita drag kemudian tarik panah dari WriteLine ke Assign. Pada To masukkan flowchart-variable(YesNoAnswer). Dan untuk Value kita isi dengan Expression Console.ReadLine().ToUpper()
.
FlowSwitch
Kalau kita ingin melakukan kondisi untuk multi-value maka kita perlu FlowSwitch activity. Caranya sama seperti lainnya, di-drag ke flowchart kemudian tarik panah dari Assign. Setelah itu akan muncul dialog untuk type, untuk keperluan kita cukup dengan Int32.
Seperti halnya dalam statement switch kita memasukkan state untuk di evaluasi. State di sini adalah Expression-nya, seperti pada gambar dibawah. Tujuan kode ini adalah mendapatkan nilai Int32 dari Char pertama.
< VB.NET >
< C# >
FlowSwitch Default
Sama halnya dengan statement Switch, kita memiliki default. Pengertiannya, bila nilai Int32 tidak ada yang bisa di evaluasi maka switch akan memilih default. Di sini kita tambahkan WriteLine dengan pesan ke user. Dan apabila kita tarik panah dari FlowSwitch ke WriteLine, maka akan muncul default. Kita bisa rubah ini di Property dari panah itu, tapi untuk saat ini biarkan seperti itu.
FlowSwitch Values
Karena hasil evaluasi akan mengarah yang sama, maka kita cukup menambahkan WriteLine.
Saatnya kita membuat 'Case' untuk di evaluasi. Dengan menarik panah dari FlowSwitch ke WriteLine, kita akan mendapati property Case nilainya 0. Nilai Int32 dari karakter N adalah 78, maka kita ganti itu menjadi 78. Perhatikan panah merah pada gambar dibawah. Bila kita mengganti nilai property Case, maka itu akan terlihat garis. Dan nilai itu pula yang akan dievaluasi oleh FlowSwitch.
Ini sama seperti diatas untuk 78. Bedanya ini untuk nilai 89, yang berarti itu karakter Y. Dengan begitu FlowSwitch hanya mengarah kesini apabila hasil evaluasi mendapatkan nilai 78 atau 89, di luar itu akan menuju default.
Assign Argument
Disini kita mengirimkan hasilnya ke flowchart-argument(TheAnswer). Juga yang kita kirim hanya satu karakter dan karakter pertama.
Flowchart Lengkap
Akhirnya selesai juga Flowchart ini. Hasilnya juga menarik dan mudah di baca bukan. Walaupun tidak sepenuhnya Visual Programming, tampaknya ada bibit-bibit ke arah sana. :)
Engineering Activity
Tambahkan activity baru dengan nama EngineeringActivty.xaml
pada solusi kita. Dan kita akan membuat Flowchart Engineering.
_Seperti apa sich Engineering Flowchart?
Tentu ini hanya lelucon, tapi cukup menarik untuk di buatkan Workflow-nya. Masih tertarik? Mari kita mulai!
Flowchart Engineering
Lakukan seperti Flowchart YesNoActivity dan di sini kita perlu hanya sebuah flowchar-variable saja. Variable itu ber-type String dengan nama Answer.
YesNoActivity
Setelah flowchart siap. Kita tambahkan WriteLine dan YesNoActivity. YesNoActivity muncul di Toolbox setelah kita sukses mengkompile solusi. Seperti yang di lihat pada gambar. Namespace Dikoding akan muncul sebagai group-nya.
Masih ingat flowchart-argument yang ada di YesNoActivity. Di sini kita menggunakan dan menghubungkan ke dua flowchart, dengan memasukkan flowchart-variable(Answer) ke property TheAnswer.
FlowDecision
Sekarang kita tambahkan FlowDecision. Activity ini cocok dengan kebutuhan kita yang menghendaki hasilnya Yes atau No. Pada property Condition kita masukkan expression seperti pada gambar. Dan juga untuk label-nya kita buat Yes dan No.
< VB.NET >
< C# >
Dengan menambah WriteLine di kedua sisi, maka kita akan melihat lebih jelas kenapa kita perlu merubah label.
Flowchart yang kita buat adalah dua tingkat, jadi sekarang kita menggunakan YesNoActivity kembali untuk mengambil input. Dan kembali dihubungkan flowchart-variable(Answer ke property TheAnswer untuk ke dua YesNoActivity.
FlowDecision Duct Tape
Kita fokus dulu untuk membuat flow Duct Tape. Lakukan seperti yang kita lakukan untuk FlowDecision diatas.
< VB.NET >
< C# >
Lalu kita tambahkan WriteLine pada kedua sisinya dengan Text yang sesuai.
FlowDecision WD-40
Sama halnya disini ini. Lakukan yang sama seperti pada FlowDecision sebelumnya.
< VB.NET >
< C# >
Setelah itu tentu kita tambahkan WriteLine pada kedua sisinya dengan Text-nya.
Flowchart Final
Ini lah hasil dari Workflow yang kita buat. Dan tampaknya mirip dengan Engineering Flowchart dari kayu seperti gambar diatas.
Test Workflow
Untuk menjalankan Workflow diatas, cukup menggunakan class WorkflowInvoker. Dan di-method Invoke, kita taruh object EngineeringActivity -- Ini merupakan class representative dari EngineeringActivity.xaml
.
< VB.NET >
< C# >
Hasil Test
Karena ada beberapa kondisi yang mungkin terjadi. Oleh karena itu kita akan lihat empat test kombinasi 'kondisi'. Hasilnya akan seperti dibawah.
Dengan kombinasi Yes + Yes
1 Does it move? Y 2 Should It? Y 3 Hasil-nya: No Problem!
Dengan kombinasi Yes + No
1 Does it move? Y 2 Should It? N 3 Hasil-nya: Duct Tape It!
Dengan kombinasi No + Yes
1 Does it move? N 2 Should It? Y 3 Hasil-nya: Spray with WD-40
Dengan kombinasi No + No
1 Does it move? N 2 Should It? N 3 Hasil-nya: No Problem!
Penutup
Visual Programming memang masih jauh dari kenyataan ala IronMan atau si-fi lainnya. Kendala User Interface(UI) yang terbatas untuk mengexpresikan pemikiran dan logic masih menjadi tantangan untuk itu. Walaupun WWF berusaha menjembatani antara user dengan developer tetap jaraknya masih cukup jauh. Tapi setidaknya kita bisa melihat 'logic' secara visual, yang lebih mudah di bandingkan 'list' atau 'kode'.
Referensi
Perhatian! Code yang ditampilkan dalam tulisan ini merupakan ilustrasi dari yang ingin dipaparkan dan bukan production ready code. Sudah banyak kejadian karena asal meng-copy-and-paste tanpa mengerti code yang diambil itu ke dalam production. Selain itu perlu ada tambahan code dan test sebelum siap untuk digunakan secara utuh.