Untuk satu hal, gumpalan besar if/else
balok tidak mudah diuji . Setiap "cabang" baru menambahkan jalur eksekusi lain dan dengan demikian meningkatkan kompleksitas siklomatik . Jika Anda ingin menguji kode Anda secara menyeluruh, Anda harus mencakup semua jalur eksekusi, dan setiap kondisi akan mengharuskan Anda untuk menulis setidaknya satu tes lagi (dengan asumsi Anda menulis tes kecil, fokus). Di sisi lain, kelas yang menerapkan strategi biasanya mengekspos hanya 1 metode publik, yang mudah untuk diuji.
Jadi, dengan bersarang if/else
Anda akan berakhir dengan banyak tes untuk satu bagian dari kode Anda, sementara dengan Strategi Anda akan memiliki beberapa tes untuk masing-masing dari beberapa strategi sederhana. Dengan yang terakhir, mudah untuk memiliki cakupan yang lebih baik, karena lebih sulit untuk kehilangan jalur eksekusi.
Adapun ekstensibilitas , bayangkan Anda sedang menulis kerangka kerja, di mana pengguna seharusnya bisa menyuntikkan perilaku mereka sendiri. Misalnya, Anda ingin membuat semacam kerangka perhitungan pajak, dan ingin mendukung sistem pajak di berbagai negara. Alih-alih menerapkan semuanya, Anda hanya ingin memberikan kesempatan kepada pengguna kerangka untuk memberikan implementasi tentang cara menghitung beberapa pajak tertentu.
Inilah pola strateginya:
- Anda mendefinisikan antarmuka, misalnya
TaxCalculation
, dan kerangka kerja Anda menerima contoh jenis ini untuk menghitung pajak
- Pengguna kerangka kerja membuat kelas yang mengimplementasikan antarmuka ini dan meneruskannya ke kerangka kerja Anda, sehingga memberikan cara untuk melakukan beberapa bagian perhitungan
Anda tidak dapat melakukan hal yang sama dengan if/else
, karena itu akan membutuhkan perubahan kode kerangka kerja, dalam hal ini tidak akan menjadi kerangka kerja lagi. Karena kerangka kerja sering didistribusikan dalam bentuk yang dikompilasi, ini mungkin satu-satunya pilihan.
Namun, bahkan jika Anda hanya menulis beberapa kode biasa, Strategi bermanfaat karena membuat maksud Anda lebih jelas. Ia mengatakan "logika ini pluggable dan bersyarat", yaitu ada beberapa implementasi yang dapat bervariasi tergantung pada tindakan pengguna, konfigurasi, atau bahkan platform.
Menggunakan pola Strategi dapat meningkatkan keterbacaan karena, sementara kelas yang mengimplementasikan beberapa strategi tertentu biasanya harus memiliki nama deskriptif, misalnya USAIncomeTaxCalculator
, if/else
blok "tanpa nama", dalam kasus terbaik hanya berkomentar, dan komentar dapat berbohong. Juga, dari selera pribadi saya, hanya memiliki lebih dari 3 if/else
blok berturut-turut tidak dapat dibaca, dan menjadi sangat buruk dengan blok bersarang.
Prinsip Terbuka / Tertutup juga sangat relevan, karena, seperti yang saya jelaskan dalam contoh di atas, Strategi memungkinkan Anda untuk memperluas logika di beberapa bagian kode Anda ("terbuka untuk ekstensi") tanpa menulis ulang bagian-bagian itu ("ditutup untuk modifikasi" ).