Hem switch
ifadeler hem de polimorfizm onların kullanımına sahiptir. Üçüncü bir seçeneğin de mevcut olduğuna dikkat edin (işlev işaretçiler / lambdas ve üst düzey işlevleri destekleyen dillerde): söz konusu tanımlayıcıları işleyici işlevleriyle eşleştirme. Bu, örneğin OO dili olmayan C, Java * da * olan C # ve (henüz) Java'da OO * olarak da bulunur.
Bazı prosedürel dillerde (polimorfizme ve üst düzey fonksiyonlara sahip değil) switch
/ if-else
ifadeler bir problem sınıfını çözmenin tek yoluydu. Bu düşünce tarzına alışmış olan birçok geliştirici, switch
polimorfizmin genellikle daha iyi bir çözüm olduğu OO dillerinde bile kullanılmaya devam etti . Bu nedenle switch
polimorfizm lehinde / refactor ifadelerinden kaçınmak genellikle tavsiye edilir .
Her halükarda, en iyi çözüm her zaman büyük / küçük harfe bağlıdır. Soru şudur: Uzun vadede hangi seçenek size daha temiz, daha özlü ve daha fazla bakım yapılabilir kod veriyor?
Switch deyimleri genellikle düzinelerce büyüyebilir, düzinelerce davaya bakılarak bakımlarını zorlaştırabilir. Onları tek bir işlevde tutmanız gerektiğinden, bu işlev çok büyük olabilir. Bu durumda, harita tabanlı ve / veya polimorfik bir çözüme doğru yeniden yönlendirme yapmayı düşünmelisiniz.
Aynı durum switch
birden fazla yerde açılmaya başlarsa, polimorfizm muhtemelen tüm bu durumları birleştirmek ve kodu basitleştirmek için en iyi seçenektir. Özellikle gelecekte daha fazla vaka eklenmesi bekleniyorsa; Her seferinde güncelleme yapmanız gereken yerler arttıkça, hatalar için olasılıklar artar. Bununla birlikte, çoğu zaman bireysel vaka işleyicileri çok basittir veya çok fazla kişi vardır ya da birbirleriyle ilişkilidirler, onları tam bir polimorfik sınıf hiyerarşisine yeniden yansıtmak, fazladan yazılır veya çoğaltılmış bir kod ve / veya karışıklık ile sonuçlanır. sınıf hiyerarşisini korumak zor. Bu durumda, bunun yerine fonksiyon / lambdas kullanmak daha kolay olabilir (eğer diliniz izin veriyorsa).
Ancak, switch
tek bir yere sahipseniz , sadece birkaç vaka basit bir şey yapıyorsa , olduğu gibi bırakmanız en iyi çözüm olabilir.
* Burada "OO" terimini gevşek kullanıyorum; Neyin “gerçek” veya “saf” OO ile ilgili kavramsal tartışmalarla ilgilenmiyorum.