Scala'da Parametresiz ve Boş Paren yöntemleri


10

Şu anda Scala'yı Odersky'nin Programlama Scala'sı (2.) aracılığıyla öğreniyorum. 10. bölüme kadar parametresiz ve boş-paren yöntemlerini tanıtmaya başladı. Sadece kafamı bulamıyorum.

Şimdiye kadar, anladığım kadarıyla bir yöntemin başka yan etkileri ve parametresiz yöntemleri varsa boş parens kullanmalıyım.

Bu sözleşmenin avantajının ne olduğunu bulamıyorum. Stack Exchange'deki yazıları okudum, ancak dürüst olmak gerekirse, mesajlar bu konuyu derinlemesine tartışmaya başladığımda kayboldum.

Bu dil özelliği için tipik kullanım durumları ve onu daha iyi anlamama yardımcı olacak avantajlar hakkında basit bir açıklama arıyorum.

scala 

Yanıtlar:


14

Sorunuzu, ilk etapta kongre ihtiyacını önlemek için neden tasarlamıyorsunuz diye sordum. Diğer bir deyişle, Scala neden programcıların bazen atlamasına izin vermek yerine parantez kullanımını her zaman zorlamıyor?

Cevap referans şeffaflığında bulunur . Esasen, bir fonksiyonun herhangi bir yan etkisi yoksa, bir program çağrısı, programın davranışını değiştirmeden sonucuyla değiştirilebilir.

Bu, parametreleri veya yan etkileri olmayan bir fonksiyonun anlamsal valolarak o fonksiyonun dönüş değerini tutmaya eşdeğer olduğu anlamına gelir . Bu özellik nedeniyle, bir sınıf geliştikçe, programcı valkolaylık veya verimlilik belirlediği için a veya bir işlevi kullanma arasında geçiş yapabilir .

Parantezleri atlayabildiğiniz için, bunun gibi bir kodu çağırmanın kodun bir işlev veya a queue.sizeolup olmadığını bilmesine gerek yoktur . Bu nedenle sınıfın uygulayıcısı , arama kodunu değiştirmek zorunda kalmadan ikisi arasında geçiş yapmakta serbesttir (ancak yeniden derlemeye ihtiyaç duyacağına inanıyorum). Sınıfın kamusal arayüzünü dengeler. Örneğin, altta yatan bir durumu çağırarak işe başlayabilirsiniz , bu da potansiyel olarak daha sonra verimlilik nedenleriyle bir olarak değişir .sizevalQueuequeue.sizesizeListO(n)sizeval

Sözleşme, bu sınıf üyesinin kesinlikle bir işlev çağrısı olduğunu ve bu nedenle potansiyel olarak referans olarak şeffaf olmadığını açıkça belirtmek için yan etkiler olduğunda parantezleri önerir . Yan etkilerin üretilip üretilmediğini bilmek için kod çağırmak önemlidir, böylece tekrar tekrar çağırmaktan kaçınabilirler. Bunun bir işlev olup olmadığını umursamıyorsanız, sanki öyle değilmiş gibi davranabilirsiniz.


6

Bu bir kongre, dil tasarımının bir parçası değil. Daha iyi anlamak için kodu yazdıktan sonra okumak zorunda olan insanlara yardımcı olmak için bir tabela olarak kullanılır.

Gönderen Yöntem Invocation üzerinde Scala'nın Stil Rehberi:

Scala, arity-0 yöntemlerinde parantezin atlanmasına izin verir (bağımsız değişken yok):

reply() 

// is the same as 

reply

Ancak, bu sözdizimi yalnızca söz konusu yöntemin hiçbir yan etkisi olmadığında (tamamen işlevsel) kullanılmalıdır. Başka bir deyişle, arama yaparken parantezleri atlamak kabul edilebilir queue.size, ancak arama sırasında kabul edilmez println().

Bu sözleşmeyi dinsel olarak gözlemlemek , kod okunabilirliğini önemli ölçüde artıracak ve bir bakışta herhangi bir yöntemin en temel çalışmasını anlamayı çok daha kolay hale getirecektir. İki karakteri kaydetmek için parantezleri atlatma dürtüsüne diren!

.NET'te kural, kodun çalıştırılması biraz zaman alabileceği yöntemleri (örneğin, 50ms'den uzun) ve özellikleri (esasen boş-paren yöntemleri) kullanmazsa (yani basit bir aramadır) kullanmaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.