Sınıflar aracılığıyla tüm kodları yapılandırmanın ve sınıflara derlemenin (Java gibi) avantajları ve dezavantajları


13

Düzenleme: benim dilim Java aksine, birden fazla miras sağlar.

Eğitim, eğlence ve potansiyel olarak faydalı amaçlar için kendi programlama dilimi tasarlamaya ve geliştirmeye başladım.

İlk başta, Java'yı temel almaya karar verdim.

Bu, tüm kodun sınıflar şeklinde yazılacağını ve kodun VM tarafından yüklenen sınıflara derlendiğini ima eder.

Ancak, arayüzler ve soyut sınıflar gibi özellikleri hariç tuttum, çünkü bunlara hiç ihtiyaç duymadım. Bir paradigmayı güçlendiriyor gibiydiler ve dilimin bunu yapmamasını istiyorum. Sınıfları derleme birimi olarak tutmak istedim, çünkü uygulanması kolay, tanıdık geldi ve sadece fikri beğendim.

Daha sonra temelde sınıfların "ad alanları" olarak kullanılabileceği, staticyönergeyi kullanarak sabitler ve işlevler sağlayabileceği veya örneklerin ("gerçek" sınıf amacı) şablonlar olarak kullanılabileceği bir modül sistemi ile kaldığımı fark ettim. diğer dillerde).

Şimdi merak ediyorum: derleme birimleri olarak sınıflara sahip olmanın olumsuz ve olumsuz yanları nelerdir?

Ayrıca, tasarımımla ilgili herhangi bir genel yorum çok takdir edilecektir. Dilim hakkında bilgilendirici bir yazı burada bulunabilir: http://www.yannbane.com/2012/12/kava.html .


1
Sınıflar ayrıca sınıftaki tüm tanımlayıcıları belirsizleştiren ad alanları içeriyorsa, tamamen bağımsız bir derleme biriminiz olur. Derleme veya derlemede derlenmiş bir sınıfa gönderme ile diğer sınıflara tüm bağımlılıkların karşılanması koşuluyla bu sınıf başarılı bir şekilde derlenebilir. Bu tür atomisitenin belirgin avantajları olmalıdır.
Robert Harvey

Yan not: soyut sınıflar ve arayüzler kaldırırsanız, konum zorlayarak alt tiplerinin belirlenmesi ve polimorfizmi için kullanılması miras insanları. Bu korkunç bir kod üretmek zorunda. Ayrıca, birden fazla miras eklemediğiniz (ve ilişkili sorunları ele almadığınız sürece) inanılmaz derecede kısıtlanmıştır.

1
@delnan: Aslında, işlevselliği geliştirmek için kompozisyonu kullanmaya devam edebilirsiniz.
Robert Harvey

2
@RobertHarvey Birden fazla miras eksikliğinden kısıtlamalar hakkında konuştuğunuzu varsayıyorum. Evet, kişi yeterli kompozisyonla taklit edilebilir, ancak kabul edilebilir olduğunu düşünmüyorum. Örneğin, genellikle iki arabirim uygulayacak bir nesnenin, farklı temel sınıfların alt sınıflarında iki kez uygulanması gerekir (ve her iki uygulama da ortak bir sınıfa devredilebilse de, bu hala ekstra bir kod yüküdür ve kolayca dönemezsiniz. birinin örneği diğerinin örneğine).

@delnan: Alt tipleme ve polimorfizm için kalıtım kullanmanın yanlışlığı nedir? Bu kalıtım bunun için ...
Mason Wheeler

Yanıtlar:


6

derleme birimi olarak sınıf sahibi olmanın faydaları nelerdir?

Dilin karmaşıklığını azaltabilir. Farklı yapılara gerek yok, her şey aynı muamele görüyor. Bazı tasarımlarda (sizinki olmasa da), statik ve karşılaşma eğiliminde oldukları tasarım sorunlarından (başlatma sırası sorunları, eşzamanlılık sınırlamaları, jenerikler / tip sınıflarıyla gariplik) sahip olmamanızdan faydalanırsınız. Ayrıca, korumalı alan oluşturma veya paralelleştirme için yalıtılmış modül örnekleri gibi modül kavramının bazı faydalarına da izin verir; ve bağımlılıkların bazı arayüzlere uyduğu ve uygulamaya değer modülün tamamının örneklendirilip bırakılabileceği modül tiplendirmesi.

Bununla birlikte, kavramın olmamasından daha fazla meseleye sahip olma eğilimindedir. Gerçekçi olarak, her şeyi aynı şekilde tedavi edemezsiniz , çünkü 'üst düzey' sınıflar varsayılan bir kurucuya sahip olmak gibi özel kurallara ihtiyaç duyarlar (ya da onları döndüren garip sorunlarla karşılaşırsınız). Derleme birimlerinin modülerliği de gerçekten garip olma eğilimindedir. Bir sınıf, sadece sınıf olduklarında başkalarına nasıl atıfta bulunur? Bu bağımlılıklar nasıl ele alınır ve sınıfları hızlandırmak için doğru sıralamayı nasıl belirliyorsunuz? Yinelenen sınıf referanslarının uygulamanın farklı bölümleri tarafından yeniden kullanıldığından nasıl emin olabilirsiniz (veya istediğiniz semantik buysa yinelenen örneklerle nasıl başa çıkabilirsiniz)?

Buna baktığımda, bağımlılıklar, işleri doğru bir şekilde kapsamlandırma ve başlatma endişeleri ile ilgili birçok sorunla karşılaştım. 'Üst düzey sınıfları' özel kılan sorunlara ve onları basit ad alanlarına dönüştürmek için onları çalıştırmak için birçok sınırlama ile karşılaşırsınız.


Sadece tek bir üst düzey sınıf olmasını planlıyorum Object. Muhtemelen bunun için özel bir davranışa ihtiyacım olacağını anlıyorum, ancak yalıtılmış bir durum olduğu sürece, bununla iyiyim. Yine de bağımlılık sorunlarım olacağına inanmıyorum. VM başladığında yüklenen bir grup sınıf vardır, bazıları yerel olarak uygulanır (System sınıfı), ancak hepsi Object'den miras alır. Her şey yüklendikten sonra KVM, yüklenmesi talimatı verilen sınıfı yükler ve bağımlılıkları çözer. Ancak, ilgileniyorum, statik hangi sorunları getiriyor?
jcora

@yannbane - Demek istediğim object, derleme birimleri dışında mutlaka kamuya açık olmayan iç sınıflar yerine modül gibi davranan sınıfları kastediyorum. Herhangi bir DLL tarzı davranış istiyorsanız, ayrıntılarda dev bir eşekarısı yuvasına dönüşür 'bağımlılıkları dışarı çalışır; YMMV. Statik gelince .
Telastyn

Bu modül benzeri davranış, statik yöntemlerin / değişkenlerin kullanılmasıyla elde edilir, değil mi? Örneklendirilebilecek bir sınıf oluşturmak yerine, yalnızca statik üyeleri ve yöntemleri olan bir sınıf oluşturmak kötü mü? Bu makaleyi gördüm, ancak sabit statik üyeler veya statik yöntemler için geçerli olduğunu düşünmüyorum . Örneğin, bir Mathsınıf oluştururken yanlış bir şey görmüyorum , aslında statik yöntemler içeren bir modül ve sabit bir statik çift üye denir Pi.
jcora

@yannbane - Hayır, pek değil. Modüller modüllerdir çünkü anında ulaşılabilirler. Aksi takdirde sadece C ++ tarzı ad alanlarınız vardır. Üst düzey sınıflarınızı C ++ stili ad alanları olarak sınırladığınızda, artık gerçekte sınıflar değildir.
Aralık'ta Telastyn

Hm, hala iyiyim ve sınıflarla modüller oluşturmadaki sorunu gerçekten görmüyorum. Ve evet, modüller özellikle Python modülleri olmak üzere ad alanları olarak işlev görür.
jcora

4

Bu soruyu cevaplamak yerine, bir seviye yukarı çıkacağım ve MIT OpenCourseWare'i , özellikle 6.035'i (Bilgisayar Dili Mühendisliği) incelemeyi önereceğim . Bu, tüm problematiği açıklayacaktır, böylece tekrar böyle sorular sormaya cazip olmayacaksınız.

Bilgisayar Dili Mühendisliği

Tek ön koşul Java'dır.

http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-035-computer-language-engineering-spring-2010/lecture-notes/

Ders Tanımı

Bu ders, üst düzey programlama dillerinin uygulanmasıyla ilgili sorunları analiz eder. Kapsanan konular şunlardır: derleyicilerin temel kavramları, işlevleri ve yapıları, teori ve pratiğin etkileşimi ve yazılım geliştirme araçlarını kullanma. Derleyici derleyici tasarımı ve uygulaması üzerine çok kişili bir proje içerir.

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.