Skenario berikut terjadi pada saya beberapa kali.
Saya memprogram algoritma yang memecahkan masalah tertentu. Ini berfungsi dengan baik dan menemukan solusi yang benar. Sekarang, saya ingin memiliki opsi untuk memberi tahu algoritma "tulis penjelasan lengkap tentang bagaimana Anda mendapatkan solusi". Tujuan saya adalah untuk dapat menggunakan algoritma dalam demonstrasi online, kelas tutorial, dll. Saya masih ingin memiliki opsi untuk menjalankan algoritma secara real time, tanpa penjelasan. Apa pola desain yang baik untuk digunakan?
CONTOH: Misalkan saya menerapkan metode ini untuk menemukan pembagi umum terbesar . Metode yang diterapkan saat ini mengembalikan jawaban yang benar, tetapi tanpa penjelasan. Saya ingin memiliki opsi untuk metode untuk menjelaskan tindakannya, seperti:
Initially, a=6 and b=4. The number of 2-factors, d, is initialized to 0.
a and b are both even, so we divide them by 2 and increment d by 1.
Now, a=3 and b=2.
a is odd but b is even, so we divide b by 2.
Now, a=3 and b=1.
a and b are both odd, so we replace a by (a-b)/2 = 1.
Now, a=1 and b=1.
a=b, so the GCD is a*2^d = 2.
Output harus dikembalikan sehingga dapat dengan mudah ditampilkan baik di konsol maupun di aplikasi berbasis web.
Apa pola yang baik untuk memberikan penjelasan saat dibutuhkan, sementara tidak mengganggu kinerja algoritma waktu nyata ketika penjelasan tidak diperlukan?
sumber
Pola yang baik adalah Pengamat. https://en.wikipedia.org/wiki/Observer_pattern
Dalam algoritme Anda, pada setiap titik di mana Anda ingin menampilkan sesuatu, Anda memberi tahu beberapa pengamat. Mereka kemudian memutuskan apa yang harus dilakukan, apakah akan menampilkan teks Anda di konsol, atau mengirimkannya ke mesin HTML / Apache dll.
Tergantung pada bahasa pemrograman Anda, mungkin ada berbagai cara untuk membuatnya cepat. Misalnya, di Jawa (perlakukan sebagai pseudocode, untuk singkatnya; menjadikannya "benar", dengan getter, setter, diserahkan kepada pembaca):
Ini sedikit bertele-tele, tetapi periksa untuk
==null
harus secepat mungkin.(Perhatikan bahwa dalam kasus umum,
observer
mungkin akan menjadiVector observers
lebih untuk memungkinkan lebih dari satu pengamat; ini tentu saja mungkin juga dan tidak akan menyebabkan lebih banyak overhead; Anda masih dapat memasukkan optimasi yang Anda tetapkanobservers=null
alih-alih memiliki kosongVector
.)Tentu saja, Anda akan menerapkan berbagai jenis pengamat tergantung pada apa yang ingin Anda capai. Anda juga dapat memasukkan statistik waktu dll. Di sana, atau melakukan hal-hal mewah lainnya.
sumber
Sebagai sedikit perbaikan untuk pembuatan log langsung, buat semacam objek yang memodelkan satu eksekusi algoritma. Tambahkan "langkah" ke objek wadah ini setiap kali kode Anda melakukan sesuatu yang menarik. Di akhir algoritma, catat langkah-langkah yang terakumulasi dari wadah.
Ini memiliki beberapa keunggulan:
EDIT: Seperti dikomentari oleh orang lain, lambdas memiliki overhead, jadi Anda harus melakukan benchmark untuk memastikan overhead ini kurang dari evaluasi kode yang tidak diperlukan untuk membangun string log (entri log seringkali bukan literal sederhana, tetapi melibatkan mendapatkan informasi kontekstual dari objek yang berpartisipasi).
sumber
Saya biasanya mencari percabangan, artinya saya mencari jika-pernyataan. Karena ini menunjukkan bahwa saya mengevaluasi nilai, yang akan mengontrol aliran algoritma. Dalam setiap kejadian seperti itu (setiap kondisi) saya kemudian dapat mencatat jalur yang dipilih, dan mengapa itu dipilih.
Jadi pada dasarnya saya akan mencatat nilai entri (keadaan awal), setiap cabang yang dipilih (kondisional) dan nilai-nilai saat memasukkan cabang yang dipilih (keadaan temp).
sumber