Salah satu yang paling dikhawatirkan oleh penulis Design Patterns adalah pola "Pengunjung".
Ini adalah "kejahatan yang diperlukan" - tetapi sering digunakan secara berlebihan dan kebutuhan untuk itu sering kali mengungkapkan kelemahan yang lebih mendasar dalam desain Anda.
Nama alternatif untuk pola "Pengunjung" adalah "Multi-pengiriman", karena pola Pengunjung adalah tujuan akhir Anda saat Anda ingin menggunakan bahasa OO pengiriman jenis tunggal untuk memilih kode yang akan digunakan berdasarkan jenis dua (atau lebih) objek yang berbeda.
Contoh klasiknya adalah Anda memiliki perpotongan antara dua bentuk, tetapi ada kasus yang lebih sederhana yang sering diabaikan: membandingkan persamaan dua objek heterogen.
Bagaimanapun, seringkali Anda berakhir dengan sesuatu seperti ini:
interface IShape
{
double intersectWith(Triangle t);
double intersectWith(Rectangle r);
double intersectWith(Circle c);
}
Masalahnya adalah Anda telah menggabungkan semua implementasi "IShape" Anda. Anda telah menyiratkan bahwa setiap kali Anda ingin menambahkan bentuk baru ke hierarki, Anda juga perlu mengubah semua implementasi "Bentuk" lainnya.
Terkadang, ini adalah desain minimal yang benar - tetapi pikirkan baik-baik. Apakah desain Anda benar-benar mengamanatkan bahwa Anda perlu mengirimkan dua jenis? Apakah Anda bersedia untuk menulis setiap ledakan kombinatorial multi-metode?
Seringkali, dengan memperkenalkan konsep lain, Anda dapat mengurangi jumlah kombinasi yang sebenarnya harus Anda tulis:
interface IShape
{
Area getArea();
}
class Area
{
public double intersectWith(Area otherArea);
...
}
Tentu saja, itu tergantung - terkadang Anda benar-benar perlu menulis kode untuk menangani semua kasus yang berbeda tersebut - tetapi ada baiknya mengambil jeda dan berpikir sebelum mengambil risiko dan menggunakan Pengunjung. Ini mungkin akan menyelamatkan Anda dari rasa sakit di kemudian hari.