Neden devletsiz bu kadar çok somut sınıf görüyorum?


18

Herhangi bir durumu olmayan C ++ ve Java dünyasında bir çok somut sınıf görüyorum.

İnsanların neden bunu yaptığını anlayamıyorum, sadece C ++ 'da serbest işlevlere sahip bir ad alanı veya özel bir yapıcıya sahip bir sınıf ve Java'da yalnızca statik yöntemler kullanabilirler.

Aklıma gelen tek fayda, daha sonra belirli durumlarda farklı bir uygulama istediğinize karar verirseniz, kodunuzun çoğunu değiştirmek zorunda kalmamanızdır. Ama bu erken bir tasarım değil mi? Daha sonra uygun olduğunda / uygun olduğunda sınıfa dönüştürülebilir.

Bunu yanlış anlıyor muyum? Eğer herşeyi nesnelere koymazsam OOP değil mi (örneklenmiş sınıflar)? O zaman neden standart C ++ ve Java kütüphanelerinde bu kadar çok yardımcı program isim alanı ve sınıfı var?

Güncelleme: Önceki işlerimde bununla ilgili çok fazla örnek gördüm, ancak açık kaynak örnekleri bulmakta zorlanıyorum, bu yüzden belki de o kadar yaygın değil. Yine de, insanların bunu neden yaptığını ve ne kadar yaygın olduğunu merak ediyorum.


2
"Çok yaygın" olarak nitelendirmeden cevap vermek zor. Bunu çok sık gördüğümü söyleyemem. Q'yu "ivar içermeyen sınıflar nasıl faydalı?"
Caleb

@Caleb Açık kaynaklı projelerde örnek arayacağım. Kesinlikle çok çalıştığım bir Java dükkanlarında gördüm.
futlib


Sadece örn. EntityManager durum içermiyor mu?
user470365

Yanıtlar:


22

Herhangi bir durumu olmayan C ++ ve Java dünyasında bir çok somut sınıf görüyorum.

Kendi ivarları olmadan sınıflar yaratmanın bazı olası nedenleri:

  • Devlet bir üst sınıfa dahil edilebilir veya bu sınıf içinde bulunabilir.

  • Sınıf, bazı arabirimleri uygular ve örneklerin başka nesnelere aktarılabilmesi için somutlaştırılması gerekir.

  • Sınıfın alt sınıflara ayrılması amaçlanmıştır.

  • İlgili fonksiyonları gruplamanın kullanışlı yolu. (Evet, aynısını yapmanın daha iyi veya farklı yolları olabilir.)

Bunu yanlış anlıyor muyum? Eğer herşeyi nesnelere koymazsam OOP değil mi (örneklenmiş sınıflar)?

OOP bir doğa kanunu değil, bir paradigmadır. Her şeyin bir nesne olduğu bazı diller var , bu yüzden gerçekten bir seçeneğiniz yok. Diğer diller (örn. C) OOP için hiç destek sağlamaz, ancak yine de nesne yönelimli bir tarzda programlayabilirsiniz. Sınıflarda her şeyi yapmazsanız OOP yapabileceğinizi söyleyebilirim ... bu durumda daha az OOP'niz olduğunu söyleyebilirsiniz .


4

Caleb ve Robert Harvey zaten faydalı sınıfların ne olduğunu ve "veri içermeyen" sınıflara sahip olmanın bazı meşru nedenlerini belirtmişlerdir. Bu açıklamalar yerinde ancak olumlu yönleri ele alıyor.

Sadece fayda sınıflarının kötüye kullanılmasının kesinlikle bir OO anti-paterni olabileceğini belirtmek isterim ( c2wiki'nin açıklamasına bakın ). Bu alıntı güzelce özetliyor:

Bu tür sınıfların çok sayıda (özellikle sadece tek bir yöntemi olanlar) tasarımcıların baş aşağı düşündüklerini gösterir. nesne tarafından yapılabilecek olandan ziyade bir nesneye yapılabilecek olanın düşünülmesi.

Nesneye yönelik tasarım uyguladığınızı iddia ediyorsanız, ancak kod tabanınız neredeyse tamamen yardımcı sınıflardan oluşuyorsa, kesinlikle yanlış bir şey yaptığınızı söyleyebilirim. Bunu söyledikten sonra, fonksiyonel bir yaklaşımın değeri kadar çoktur ve çalışmak da mükemmel olabilir. Sadece içtenlikle diğerini uygularken birini takip ettiğini iddia etmeyin.


2

Java ve C ++ 'daki yardımcı program sınıfları, bir veya daha fazla giriş parametresi alan ve bir sonuç döndüren yöntem kitaplığını korumak için kullanılır. Sadece bir değer döndürürlerse devlet tutmaya gerek yoktur. Bu bağlamda, bu yöntemler, tüm avantajları ile birlikte (bir şey için eşzamanlılık ile ilgili sorun yok) işlevsel bir programlamanın kaba bir biçimi olarak kabul edilebilir.

Her durumda, bu sınıflar sadece ilgili yöntemleri tek bir kapta gruplandırmaya hizmet eder, bir nesnenin düzgün çalışması için örneklenmesini gerektirmeyen yöntemler. Böyle bir sınıfa örnek olarak SINE ve COSINE (ve diğer matematik) işlevlerini içeren bir Math sınıfı verilebilir.


2

Bu sınıfların birçoğu, açıkça içermeseler bile verilerle etkileşime girer ve bunu aynı anda birden çok eşgörünümün etkin olmasını gerektiren şekillerde yapmaları gerekir. Örneğin, bir veri depolanmış yordam ile etkileşime giren, bazı verileri bir PL / SQL paketine geçiren ve sonuçları çağıran uygulamaya geri aktaran durum bilgisi olmayan bir oturum çekirdeği. Bu şeyin birden fazla örnekte bulunması gerekir, ancak kendisi herhangi bir veri alanı içermez.


0

Sınıfların nesne olmadığı nesne yönelimli dillerde, bir nesneyle bir sınıftan çok daha fazlasını yapabilirsiniz.

Bir nesneyi parametre olarak iletebilirsiniz, tür uyumlu bir nesneyi değiştirebilirsiniz, bir arabirim uygulayabilirsiniz (sınıfların nesne olduğu diller olduğunu hayal ediyorum, ancak bunlardan bazılarını yapabilirsiniz, ancak her durumda ...) . Bunların hepsi oldukça önemlidir, bu yüzden varsayılan karar genellikle bir sınıfı somutlaştırmaktır.

Bazı sınıflar için, örneklemenin sağladığı yeteneklere ihtiyaç duyulması olası görünmemektedir. Örneğin, bir kosinüs uygulamasını bir başkasıyla değiştirmenize gerek yoktur. Bu yeteneklere ihtiyaç duymayan çoğunlukla yardımcı işlevler olduğu ortaya çıkıyor, bu yüzden çoğunlukla somut olmayan sınıflara sahip yardımcı işlevler.

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.