Scala'nın eşlik eden nesnelerinin statik yöntemlere göre avantajları nelerdir?


50

Scala'nın statik bir sözcüğü yoktur , ancak bunun yerine eşlik eden nesneler yoluyla benzer işlevleri vardır. Sahnelerin arkasında eşlik eden nesneler statik metotlara sahip sınıflara göre derlenir, bu yüzden bunların hepsi sözdizimsel şekerdir. Bu tasarım seçiminin avantajları nelerdir? Dezavantajları? Başka dillerin de benzer yapıları var mı?


Yanıtlar:


49

Kendi tercihlerinize bağlı olarak, sizin için daha fazla veya daha az ilgi çekici olabilecek birkaç neden:

  1. "Sözdizimsel Şeker" olduğu için sadece indirim yapmayın. Bir şeylerin sadece sözdizimsel bir şeker olduğunu söylese de, hayatını tatlandıran tüm şekerden sonra - bir programcı olarak bir kahve veya çay içicisi gibi.

  2. Singletons - Her Scala objectdoğası gereği bir singletondur. Java dünyasında, insanların tekilleri farklı şekillerde uyguladıklarını ve uygulamalarında bir hata yapmadıklarından daha sık olduklarını göz önüne alarak, Scala'da olduğu kadar basit bir hata yapamazsınız. Yazma objectyerine classbir tekil yapar ve bitirdiniz.

  3. Statik yöntemlere erişim: Java'daki statik yöntemlere nesnelerden erişilebilir. Örneğin, bir sınıf olduğunu varsayalım Cstatik yöntemle fve bir nesnenin cÇeşidi C. Öyleyse aramanız gerekirC.f , fakat Java ( c.fScala arka planından geldiğinizde hiçbir anlam ifade etmiyor) kullanmanıza izin vermez (bir uyarı ile de olsa) , çünkü nesnelerin fgerçekten bir yöntemi yoktur .

  4. Ayrımı temizle: Java'da statik ve statik olmayan nitelikleri ve yöntemleri bir sınıfta karıştırabilirsiniz. Disiplinli çalışırsanız, bu bir sorun olmaz, ancak siz (veya bu konuda başka biri için) yapmazsanız, sonunda statik ve statik olmayan parçaları bir araya getirmiş olursunuz ve hızlı bir şekilde anlatmak zordur. statik olan ve olmayan olan. Scala'da, eşlikçi nesnesinin içinde bulunan her şey, karşılık gelen sınıfın çalışma zamanı nesnelerinin bir parçası değildir, ancak statik bir bağlamda bulunur. Tam tersi, eğer bir sınıfın içine yazılırsa, o sınıfın örnekleri için kullanılabilir, ancak statik bir bağlamdan değil. Bu, sınıfınıza statik ve statik olmayan başlatıcı blokları eklemeye başladığınızda, özellikle Java'da ağırlaşır. Bunun dinamik yürütme sırası açısından anlaşılması çok zor olabilir.

  5. Daha az kod: statik kelimesini her bir özniteliğe veya yönteme bir eklemenize gerek kalmaz object, bu nedenle kodu daha kısa tutar (gerçekten de belirgin bir avantaj değil).

Dezavantajları bulmak çok zordur. Biri, statik ve statik olmayan kısımların birbirine ait olması gerektiği, ancak eşlik eden nesnelerin Scala kavramıyla ayrılması gerektiğini iddia edebilir. Örneğin, bir sınıf diyagramına sahip olmak garip görünebilir, ancak daha sonra kodda iki şey oluşturmak zorunda kalır ve hangi özniteliğin nereye gittiğini incelemek zorunda kalırsınız.


1
Ayrıca, statiklerin saf bir OOP yazılımına ait olmadığını da okudum. Örneğin, statik davranışa ihtiyacınız olduğunda, kendi sınıfınızı kullanın ve başka bir sınıfın nesnelerinin (potansiyel olarak) statik davranışını yöneten bir (singleton) nesnesi oluşturun.
K ..

1
"Sınıf yerine nesne yazmak onu bir singleton yapar ve işiniz biter." Singletons'a kendimi pek umursamıyorum, ama bu belirli "sözdizimsel şekerin" direncinin kesin bir cazibesi olduğunu itiraf etmeliyim.
Ed Hastings

3
1'den 5'e kadar olan noktaların hiçbiri (hatta hepsi bir arada) çalışma zamanında gerçek bir eşzamanlı nesneye ihtiyaç duymaz. Hepsi kolayca sıfır çalışma zamanı etkisi ile, saf sözdizimi şekeri haline getirilebilir. Çalışma zamanı arkadaşı nesnesine sahip olmanın tek gerçek nedeni Alexey Romanov'un cevabında verilmiştir.
mas.morozov

"Dezavantajları bulmak çok daha zor." Verim? Bir nesne metoduna erişmek ifnonnull, basitçe karşılaştırıldığında, bytecode üretir invokeStatic.
Eduardo Pareja Tobes

33

Bir başka avantaj, objectstatik yöntemlerin aksine, arayüzleri / özellikleri uygulayabilmesidir.


8
Bunun, bir eşlikçi nesne ile bir sınıf arasındaki statik yöntemlerin arasındaki en büyük fark olduğunu düşünüyorum . Bir eşlik eden nesne polimorfiktir ve bir arayüz / özellik bekleyen metotların argümanı olarak aktarılabilir.
dcastro

4

Tamamlayıcı nesneler, örtükler için aranan ilk yerdir, bundan sonra scala Predef'e ve daha sonra söz konusu kaynak dosyadaki açık "içe aktarma" ifadelerine bakar.

Java dilinin veya kütüphanelerinin karşılaştırılabilir bir mekanizma sağlayıp sağlamadığını bilmek için bir java dev yeterli değil.

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.