SORU
9 Temmuz 2009, PERŞEMBE


Yöntem zincirleme - neden iyi bir uygulama mı, yoksa değil mi?

Method chaining nesne yöntemleri başka bir yöntem için çağrılması sonucu için nesnenin kendisi dönen bir uygulamadır. Bu gibi:

participant.addSchedule(events[1]).addSchedule(events[2]).setStatus('attending').save()

Bu okunabilir kod üretir beri iyi bir uygulama olarak kabul edilir gibi görünüyor, ya da "akıcı arayüzü". Ancak, bana yerine çağrılması gösterim nesne yönelim kendisi tarafından açık ara görünüyor sonuç kodu için eylemleri gerçekleştirmek temsil etmiyorsonuçodaklı kod nesne nasıl önceki yöntem, genel olarak çalışması bekleniyor

participant.getSchedule('monday').saveTo('monnday.file')

Bu fark nokta-gösterim için iki farklı anlamlar oluşturmak için yönetir "sonuç çağrılması": zincirleme bağlamında, yukarıda örnek olarak kaydetme okurdukatılımcıbu örnek aslında olsa bile, nesne, zamanlama nesne getSchedule tarafından alınan kaydetmek için tasarlanmıştır.

Fark burada denilen yöntemi beklenmelidir olsun bir şey ya da değil, geri dönmek için hangi durumda zincirleme için kendisini nesne olarak adlandırılan geri dönüş () olduğunu anlıyorum. Ama bu iki olay sadece yöntemleri çağrıldığını semantiği itibaren gösterimde kendisinden ayırt edilebilir değildir. Zincirleme yöntem kullanıldığında, her zaman bir yöntem çağrısı bir şey ile ilgili faaliyet olduğunu bilemiyorumsonuçzincirleme ile önceki arama - bu varsayım sonları, ve ben anlamsal olarak tüm zincir gerçek nesne çağrıldığını gerçekten ne olduğunu anlamak için süreç. Örneğin:

participant.attend(event).setNotifications('silent').getSocialStream('twitter').postStatus('Joining ' event.name).follow(event.getSocialId('twitter'))

Son iki yöntem çağrıları orada katılımcı bakın önce olanlar ise getSocialStream sonucuna bakın. Belki de aslında içeriği değiştiği zincirleri (?), yazmak için kötü bir uygulamadır ama o zaman bile sürekli benzer nokta-zincirleri aslında aynı bağlam içinde tutmak, ya da sonuç üzerinde çalışmak sadece olup olmadığını kontrol etmelisiniz.

Bana yöntem yüzeysel zincirleme okunabilir kod üretmek yok iken, nokta gösterim anlamı aşırı yükleme sadece daha fazla karışıklığa neden olan gibi görünüyor. Kendimi bir programlama gurusu olarak görmüyorum, hepsi benim hatam olduğunu düşünüyorum.Yani: Ne kaçırdım? Bir şekilde yanlış zincirleme yöntemi anlıyor muyum? Zincirleme yöntemi, özellikle bazı durumlarda, ya da özellikle kötü bir yerde var mı?

Not: görüş bildirimi bir soru olarak maskelenmiş gibi oku bu soruyu anlıyorum. Bu, ancak, mi - gerçekten zincirleme olarak iyi bir uygulama olduğunu neden anlamak istiyorum, ve nerede nesne yönelimli doğal gösterim tatili düşünerek yanlış mı değil.

CEVAP
9 Temmuz 2009, PERŞEMBE


Bu öznel olduğunu kabul ediyorsunuz. Çoğunlukla ben önlemek yöntem zincirleme, ama son zamanlarda ben de buldum bir durumda nerede olduğunu sadece doğru olanı - bir metod olarak kabul edilen bir şey gibi 10 parametreleri ve gerekirse daha fazla, ama çoğu zaman sadece vardı belirtmek için bir kaç. Geçersiz kılar, bu çok hantal çok hızlı oldu. Bunun yerine zincirleme yaklaşımı tercih ettim:

MyObject.Start()
    .SpecifySomeParameter(asdasd)
    .SpecifySomeOtherParameter(asdasd)
    .Execute();

Bu fabrika bir desen gibi bir şey. Yöntem zincirleme yaklaşımı isteğe bağlı olduğunu, ancak kod daha kolay (özellikle IntelliSense ile) yazılı yaptı. Bu bir izole durumda, ve benim kod genel bir uygulama değildir unutmamanız gerekir.

Nokta - daha iyi yöntem zincirleme olmadan belki de daha iyi yapabilirsiniz 99% durumlarda ya. Ama bu en iyi yaklaşım bulunduğu 1'i var.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • HTC Tutorials

    HTC Tutorial

    21 EYLÜL 2010
  • ibebrent

    ibebrent

    23 Temmuz 2007
  • TimMinchinLive

    TimMinchinLi

    23 ŞUBAT 2009