The pola desain Strategi sering dianggap sebagai pengganti fungsi kelas dalam bahasa yang kurang mereka.
Jadi misalnya katakan Anda ingin meneruskan fungsionalitas ke objek. Di Jawa Anda harus meneruskan objek objek lain yang merangkum perilaku yang diinginkan. Dalam bahasa seperti Ruby, Anda baru saja melewati fungsi itu sendiri dalam bentuk fungsi anonim.
Namun saya memikirkannya dan memutuskan bahwa mungkin Strategi menawarkan lebih dari sekadar fungsi anonim.
Ini karena suatu objek dapat menahan keadaan yang ada secara independen dari periode ketika metode itu berjalan. Namun fungsi anonim dengan sendirinya hanya dapat menahan keadaan yang tidak ada lagi saat fungsi selesai dieksekusi.
Dalam bahasa berorientasi objek yang mendukung fungsi kelas satu, apakah pola strategi memiliki keunggulan dibandingkan menggunakan fungsi?
sumber
Jawaban:
Ketika bahasa mendukung referensi ke fungsi ( Java tidak sejak versi 8 ), ini sering merupakan alternatif yang baik untuk strategi, karena mereka biasanya mengekspresikan hal yang sama dengan sintaks yang lebih sedikit. Namun, ada beberapa kasus di mana objek nyata dapat bermanfaat.
Antarmuka Strategi dapat memiliki beberapa metode. Mari kita ambil antarmuka
RouteFindingStragegy
sebagai contoh, yang merangkum berbagai algoritma pencarian rute. Itu bisa mendeklarasikan metode sepertiRoute findShortestRoute(Node start, Node destination)
boolean doesRouteExist(Node start, Node destination)
Route[] findAllPossibleRoutes(Node start, Node destination)
Route findShortestRouteToClosestDestination(Node start, Node[] destinations)
Route findTravelingSalesmanRoute(Node[] stations)
yang kemudian semuanya akan diterapkan oleh strategi. Beberapa algoritma pencarian rute mungkin memungkinkan optimasi internal untuk beberapa kasus penggunaan ini dan beberapa lainnya tidak, sehingga implementor dapat memutuskan bagaimana menerapkan masing-masing metode ini.
Kasus lain adalah ketika strategi memiliki kondisi batin. Tentu saja, dalam beberapa bahasa penutupan dapat memiliki kondisi bagian dalam, tetapi ketika kondisi bagian dalam ini menjadi sangat kompleks, seringkali menjadi lebih elegan untuk mempromosikan penutupan ke kelas yang lengkap.
sumber
Tidak benar bahwa fungsi anonim hanya dapat menahan status yang tidak ada lagi ketika fungsi selesai dieksekusi.
Ambil contoh berikut dalam Common Lisp:
Fungsi ini mengambil daftar string dan menambahkan penghitung ke setiap elemen daftar. Jadi, misalnya, memohon
memberi
Fungsinya
number-strings
internal menggunakan fungsi anonim dengan variabelcounter
yang menyimpan status (nilai saat ini dari penghitung) yang digunakan kembali setiap kali fungsi dipanggil.Secara umum, Anda dapat menganggap penutupan sebagai objek dengan hanya satu metode. Atau, objek adalah kumpulan penutupan yang berbagi variabel tertutup yang sama. Jadi saya tidak yakin apakah ada kasus-kasus di mana Anda perlu menggunakan objek alih-alih penutupan: Saya berpendapat bahwa keduanya adalah cara melihat pola yang sama dari perspektif yang berbeda.
Secara khusus, pola strategi memerlukan objek dengan hanya satu metode, jadi penutupan harus melakukan pekerjaan. Tapi, seperti yang diamati oleh Philipp dalam jawabannya, tergantung pada keadaan (keadaan kompleks) dan bahasa pemrograman Anda mungkin mendapatkan solusi yang lebih elegan dengan menggunakan objek.
sumber
let
dan kemudian menentukan penutupan saya di dalamnya. Pada dasarnya, saya akan mendefinisikan objek dengan satu metode dengan cepat. Dalam bahasa lain (misalnya Java), mungkin lebih mudah (secara sintaksis lebih sederhana) untuk mendefinisikan objek yang tepat untuk menahan status. Jadi, saya akan memutuskan dari kasus ke kasus.Hanya karena dua desain dapat menyelesaikan masalah yang sama tidak berarti keduanya merupakan pengganti langsung satu sama lain.
Jika Anda perlu melacak status dalam program fungsional, Anda tidak bermutasi variabel tertutup, bahkan jika bahasa memungkinkan. Anda mengatur untuk memanggil fungsi yang mengambil dalam satu negara sebagai argumen dan mengembalikan negara baru sebagai nilai pengembaliannya.
Arsitektur Anda akan terlihat sangat berbeda, tetapi Anda akan mencapai tujuan yang sama. Jangan mencoba memaksakan pola paradigma satu secara langsung ke yang lain.
sumber
Strategi adalah sebuah konsep , resep yang berguna untuk memecahkan masalah tertentu yang berulang. Ini bukan konstruksi bahasa, juga bukan tentang salah satu bentuk implementasi . Penutupan dapat digunakan untuk menerapkan Strategi satu hari dan Pengamat pada hari berikutnya.
The Istilah Strategi sebagian besar berguna dalam percakapan dengan programmer lain untuk ringkas mengungkapkan maksud Anda. Tidak ada yang ajaib tentang itu.
sumber