SORU
24 HAZİRAN 2009, ÇARŞAMBA


Neden C STL çok ağır şablonları dayanmaktadır. (*değil arayüzleri*)

Kenara yükümlülük yaratan adından (Standart Şablon Kütüphanesi)

C başlangıçta OOP kavramları sunma amaçlı içine C: belirli bir varlık olabilir ve yapamadığını söyle (nasıl olursa olsun) sınıfına bağlı ve sınıf hiyerarşisi. olabilir Bazı besteleri yetenekleri daha zor, tarif bu şekilde nedeniyle problemlerini birden çok devralma, hem de C destekler kavramının arabirimleri biraz sakar bir şekilde (göre java, vb), ama orada (ve geliştirilmiş olabilir).

Ve sonra şablonlar STL ile birlikte oyun haline geldi. STL klasik OOP kavramları alıp çöpe onlardan kurtulmak yerine şablonları kullanarak görünüyordu.

Şablonları türleri themeselves şablonu (kaplar, örnekler) çalışması için konu dışı olduğu tür genelleme için kullanılır durumlar arasında bir ayrım yapılmalıdır. Bir vektör olması çok mantıklı.

Ancak, birçok diğer durumlarda (kullanımına ve algoritmalar), şablon türleri gerekiyordu izleyin bir "kavram" (Giriş Yineleyici, İleriye doğru Yineleyici, vb...) gerçek ayrıntılar kavramı tanımlanmış tamamen tarafından uygulanması şablon fonksiyon/sınıf ve sınıf tarafından kullanıldığını görürsünüz, biraz anti-kullanım OOP.

Örneğin, bu fonksiyonu söyle kullanabilirsiniz:

void MyFunc(ForwardIterator<...> *I);

Güncelleme:Özgün soru belirsiz olduğu gibi, Forwardİterator kendisi herhangi bir Forwardİterator türü izin vermek için şablonu esas alan, sorun olur. Aksine bir kavram olarak Forwardİterator yaşıyor.

sadece İleriye doğru bir Yineleyici ya da uygulama veya belgelere bakmak gerek nereye tanımı, bakarak bekler:

template <typename Type> void MyFunc(Type *I);

Şablonları kullanarak lehine yapabilirim iki iddia: derlenmiş kod daha verimli, terzi-derleme kullanılan her türü için şablon tarafından yapılabilir, bu durumda fonksiyonun parametre değişkeni kullanmak yerine. Ve şablonlar yerli türleri ile kullanılabilir olması.

Ancak, STL için şablon lehine klasik OOP terk neden daha derin bir neden arıyorum? (O kadar okudun varsayarsak :P)

CEVAP
24 HAZİRAN 2009, ÇARŞAMBA


Kısa cevap C değişti çünkü"". Evet, 70'li yıllarda, Stroustrup OOP yetenekleri ile yükseltilmiş bir C oluşturmak için tasarlanmıştır, ama bu çok uzun bir zaman geç önce. Zaman dilini 1998, artık OOP bir dil olduğunu standart oldu. Multi-paradigm bir dil oldu. Kesinlikle OOP kod için bazı destek vardı, ama aynı zamanda kaplanmış turing-tam bir şablon dili vardı, derleme zamanı metaprogramming izin verdi, ve insanlar genel programlama keşfetti. Aniden, OOP sadece bu kadar önemli görünmüyordu. Basit yazabiliriz, daha kısa değilveteknikleri şablonlar ve Soysal programlama aracılığıyla kullanarak daha verimli kod.

OOP Kutsal Kase değil. Hoş bir fikir ve icat edildiğinde 70 usul dilleri geri içinde oldukça iyi bir gelişme oldu. Ama dürüst olmak matah bir şey değil. Birçok durumda, beceriksiz ve ayrıntılı ve gerçekten yeniden kod verme imkanı ya da teşvik etmez.

C topluluk bugün genel programlama çok daha fazla ilgi neden, ve nedenherkessonunda fonksiyonel programlama oldukça zeki de olduğunu fark etmeye başladı. Kendi başına OOP sadece hoş bir görüntü değil.

Deneyin bir çizim varsayımsal bir bağımlılık grafiği "OOP gibi ortada kaldık" STL. Kaç ders birbirimizin hakkında bilmeniz gerekir? Bir olurduçokbağımlılıklar. vector sadece başlık eklemek mümkün, ayrıca iterator hatta iostream çekilmektedir. STL bunu kolaylaştırır. Bir vektör tanımlar yineleyici türünü biliyor, hepsi bu. STL algoritmalarıhiçbir şey. Hatta tüm parametre olarak kullanımına kabul olsa da yineleyici bir başlık gerek yok. O zaman daha modüler.

STL ama elde değil Java tanımlar gibi OOP kurallarını takip edebilirgolOOP? Bu yeniden kullanım, kaplin, modüler ve saklama düşük ulaşmak değil mi?

Ve bu hedeflere ulaşmak değildaha iyiOOP gibi ortada kaldık bir versiyonu daha?

STL diline kabul edilmiştir nedenine gelince, birkaç şey STL neden oldu.

İlk olarak, şablonlar C eklendi . Jenerik eklenen çok aynı nedenle eklendi .NET. "Konteyner bir tür" tür güvenlik atmadan olmadan. T gibi şeyler yazmak iyi bir fikir gibi gelmişti Elbette, üzerinde anlaştılar uygulanması çok daha karmaşık ve güçlü olamadı.

O zaman insanlar ekledi vardı şablon mekanizması beklenenden daha güçlü olduğunu keşfetti. Ve birisi şablonları daha genel bir kütüphane yazmak üzere kullanarak denemeye başladı. Bir fonksiyonel programlama esinlenen ve C tüm yeni yetenekleri kullanılır .

Çok garip ve farklı görünüyordu, ama sonunda fark etti, çünkü buna alışık büyümek için uzunca bir süre aldı C dil Komitesi, bir parçasıdıraksi takdirde dahil etmek zorunda kalırlar geleneksel OOP benzerleri çok daha iyi oldu. Bunun için birkaç ayar yaptılar ve standart kütüphaneye kabul etti.

İdeolojik bir seçim değil, siyasi bir seçim değildi OOP olmak ister biz ya da değil "" ama çok pragmatik bir karar. Kütüphane değerlendirdiklerini ve çok iyi işe yaradığını gördüm.

Her durumda, STL lehine için söz sebep her ikisi de kesinlikle gereklidir.

C standart kütüphanevardırverimli olmak. Eğer, eşdeğer elle sarılmış ki C kodu daha az verimli ise, o zaman insanlar kullanmak olmaz. Bu verimlilik daha düşük olacağını, hataların olasılığını artırır, ve bu sadece kötü bir fikir olabilir, genel olarak.

Ve STLvardırilkel türler C tüm çünkü ilkel türler ile çalışmak, ve her iki dilde önemli bir parçası onlar. Eğer STL yerli diziler ile çalışmak olsaydı, olurduişe yaramaz.

Soru OOP güçlü bir varsayım vardır"". en iyi Neden merak ediyorum. Onlar seni niye soruyorsun "terk edilmiş klasik OOP". Onunla sıkışmış olmalı diye düşünüyorum. Hangi avantajlara sahip olur muydu?

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ampisound

    Ampisound

    12 Kasım 2006
  • Hallucination Land

    Hallucinatio

    14 Ocak 2011
  • WoodysGamertag

    WoodysGamert

    17 Aralık 2009