SORU
14 Kasım 2008, Cuma


Nasıl ördek yazarak eski farklı 'değişken' tür ve/veya arabirimleri?

"Ördek yazarak" ileri sürülüyor, hatta kaçtılar ya da iki kodu bir örnek üzerinden. ibaresi görüyorum Çok duyuyorumtembelkendi araştırma yapmak için meşgul, birisi bana söyleyebilir, kısaca:

  • bir arasındaki fark 'ördek' yazıp, eski toprak bir 'değişken türü', ve
  • ördek varyant üzerinden yazmayı tercih kalabileceğim bir örnek yazıp sağlamak
  • ben bir şey bir örnek sağlarvarördek yazarak gerçekleştirmek için kullanılır?

duck typing illustration courtesy of The Register

Bilmiyorum demek gibi fowl tarafından şüphe gücünü bu 'yeni' inşa, ve ben değilim ıslanma sorunu reddettiği için yaptığı araştırma, ama ben dırdırları hiç bu akın yutturmaca görüşüyorum bu konuda son zamanlarda. Gibi görünüyorhayırbana yazarak (dinamik yazarak aka), bu yüzden hemen avantajları görmüyorum.

EK: örnekler için Teşekkürler şimdiye kadar. '- ^O . şey gibi geliyor bana (Bla)' eşdeğer mi yapmak bir yansıması arama (muhtemelen ucuz değil), ve/veya ilgili aynı diyerek (O İBlah) hangi derleyici olabilir kontrol için, ama ikincisi avantajı ayırt edici benim İBlah arayüzü sizin İBlah arayüzü ise diğer ikisi yok. Kabul ediyorum, küçük arabirimleri her yöntem için yüzen bir sürü sarpa saracağını, ama sonra yine o yüzden, bireysel yöntemleri bir sürü kontrol

...yani yine anlayamadım. Bir harika zaman tasarrufu, ya da yepyeni bir çuvalın içinde aynı eski şey mi? Nerede örnekgerektirirördek yazarak?

CEVAP
14 Kasım 2008, Cuma


Bazı cevapları burada, insanlar yanlış cevaplar vermek için bir yol vardır şehirlerinde terminoloji, bazı yanlış kullandığını gördüm.

Ben cevap vermeden önce, birkaç tanımları sağlamak için gidiyorum:

  1. Kesinlikle yazılmış

    Bir dili güçlü bir program tipi emniyet zorlar eğer yazılmış. Bu iki şeyi garanti anlamına gelir: bir ilerleme ve başka bir şey olarak adlandırılan koruma " adı veriliyor. İlerleme temelde anlamına tüm "geçerli yazdığınız" programlar olabilir aslında çalıştırılabilir bilgisayar, çökebilir, ya da bir istisna atar, ya da çalıştırmak için bir sonsuz döngü, ama onlar aslında çalıştırılabilir. Koruma anlamına gelir eğer bir programdır "geçerli yazdığınız" her zaman "Geçerli şekilde yazılmış" ve o hiçbir değişken (veya hafıza konumu) içeren bir değer değil uygun kendi atanmış yazın.

    En çok dil "özelliği. ilerleme var Bu "" özellik. muhafaza tatmin etmeyen çok sayıda, ancak vardır İyi bir örnek, C (ve C de). Örneğin, eğer herhangi bir tür olsaydı gibi davranmak için herhangi bir bellek adresi zorlamak için C mümkündür. Bu temelde programcılar tür sistemi istedikleri zaman araçları sağlar. İşte bir örnek:

    struct foo
    {
        int x;
        iny y;
        int z;
    }
    
    
    char * x = new char[100];
    foo * pFoo = (foo *)x;
    foo aRealFoo;
    *pFoo = aRealFoo;
    

    Bu kodu birisi karakter dizisi alır ve bir"". örnek foo yazabilirsiniz Eğer C kesinlikle yazılmış olsaydı bu mümkün olmazdı. Türü güvenli dilleri gibi C#, Java, VB, lisp, ruby, python, ve diğerleri, bir istisna atar eğer çalıştığın için dökme bir dizinin karakterleri için bir "foo" örneği.

  2. Zayıf yazılı

    Bir zayıf varsa kesinlikle yazılmış ise, yazılmadı.

  3. Statik olarak yazılmış

    Dil statik tip sistemi derleme zamanında doğrulanabilir yazılmış. Bir statik olarak yazılan dil de olabilir "zayıf yazılmış" gibi güçlü bir C veya C gibi yazılan#.

  4. Dinamik olarak değişebilir

    Dinamik yazılmış bir dil türleri çalışma zamanında doğrulanır bir dildir. Birçok dilde bir karışımı, bir çeşit, statik ve dinamik yazarak arasında. #, C örneğin, Olası derleme zamanında onları kontrol etmek için değil, çünkü birçok çalışma zamanında dinamik olarak atmalarını doğrular. Diğer örnekler, Java, VB, ve Objective-C gibi diller vardır

    Ayrıca bazı diller vardır "" veya "" dinamik yazılmış,"", "ruby" ve "" . küçük bir konuşma lisp gibi çoğunlukla tamamen

  5. Ördek yazarak

    Ördek yazarak statik, dinamik, zayıf ya da güçlü yazarak tamamen dik bir şeydir. Alttaki yazın kimliğinin bir nesne ne olursa olsun, bu kod yazma uygulamadır. Örneğin, aşağıdaki kod VB.NET :

    function Foo(x as object) as object
        return x.Quack()
    end function
    

    İçine geçirilen, nesne türü ne olursa olsun çalışacak"", sağlanan bir yöntem olarak düşünülebilir "". Vak Foo Bu, nesne ördeğe benziyorsa, ördek gibi yürüyorsa, ördek gibi konuşuyorsa, o zaman bir ördektir. Ördek yazarak çeşitli biçimlerde gelir. Olası ördek yazarak, dinamik ördek yazarak, güçlü ördek yazarak ve hafta ördek yazarak statik. C şablon fonksiyonları iyi bir örnektir "statik ördek yazarak". zayıf Örnek göstermek "JaredPar" post bir örnek gösteriyor "statik ördek yazarak". güçlü Geç bağlama VB (veya kod Ruby veya Python) sağlar "dinamik ördek yazarak". güçlü

  6. Varyant

    Bir değişken önceden tanımlanmış veri türleri, dizeleri, tamsayı türleri, tarih ve com nesneleri de dahil olmak üzere bir dizi tutan dinamik olarak yazdığınız bir veri yapısıdır. Bundan sonra atama, dönüştürme ve veri çeşitleri içinde saklı işlemek için işlemleri bir grup tanımlar. Ya da bir türevi olduğunu kesinlikle yazılmış olup olmadığı, kullanıldığı dile göre değişir. Örneğin, VB 6 program içinde bir değişken türü belirlenmiş. VB çalışma zamanı işlemleri VB dilinde yazılmış ve türevleri için yazım kurallarına uygun olmalarını sağlar. VB değişken türü ile bir IUnknown için bir dize eklemek için ipe bir çalışma zamanı hatası neden olur. C , ancak tüm çeşitleri C tip zayıf yazılı olduğundan zayıf yazılı.

...TAMAM. yoldan tanımları aldık şimdi sorunuza cevap verebilirim:

6, ördek yazarak yapmanın bir form sağlar, VB bir türevi. Daha iyi bir varyant daha ördek yazarak yapmanın yolları (Jared Par örneğini iyi biridir), var, ama ördek çeşitleri ile yazarak yapabilirsiniz. Yani, bir temel tipi kimliğinin bir nesne ne olursa olsun, üzerinde çalışacak kod parçası yazabilirsiniz.

Ancak, türevleri ile yapmak gerçekten doğrulama bir sürü vermez. Statik olarak yazılan ördek türü bir mekanizma, bir JaredPar açıklar gibi derleyici ördek yazarak, artı bazı ekstra doğrulama yararlar sağlar. Bu gerçekten yararlı olabilir.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Khan Academy

    Khan Academy

    17 Kasım 2006
  • Sam Kear

    Sam Kear

    14 Temmuz 2007
  • Trevor Eckhart

    Trevor Eckha

    19 Aralık 2009