Tebrikler! Programlama dili / türü sistem dünyasında yeni dolaştınız, ayrıldığınız yerden dünyanın diğer tarafına geldiniz. Dinamik dil / prototip tabanlı nesne diyarının sınırına geldiniz!
Birçok dinamik dil (ör. JavaScript, PHP, Python) birisinin çalışma zamanında nesne özelliklerini genişletmesine veya değiştirmesine izin verir.
Bunun uç şekli, Self veya JavaScript gibi prototip tabanlı bir dildir . Açıkçası, dersleri yok. Kalıtımla sınıf tabanlı, nesne yönelimli programlama gibi görünen şeyler yapabilirsiniz, ancak kurallar Java ve C # gibi daha keskin tanımlanmış, sınıf tabanlı dillere kıyasla büyük ölçüde rahatlar.
PHP ve Python gibi diller orta yerde yaşıyor. Düzenli, deyimsel sınıf tabanlı sistemleri var. Ancak, nesne öznitelikleri, JavaScript'te bulamadığınız bazı kısıtlamalarla ("yerleşik türler hariç" gibi) olsa da, çalışma zamanında eklenebilir, değiştirilebilir veya silinebilir.
Bu dinamizmin büyük ödünleşimi performanstır. Dilin ne kadar güçlü veya zayıf yazıldığını veya makine koduna göre ne kadar iyi derlenebileceğini unutun. Dinamik nesneler basit yapılar yerine esnek haritalar / sözlükler olarak temsil edilmelidir. Bu, her nesne erişimine ek yük getirir. Bazı programlar bu yükü azaltmak için büyük çaba sarf etmektedir (örneğin, Python'daki hayalet kwarg ataması ve yuva tabanlı sınıflarla), ancak ekstra yük genellikle kurs ve kabul fiyatı için eşittir.
Tasarımınıza geri dönersek, sınıflarınızın bir alt kümesine dinamik özelliklere sahip olma yeteneğini aşılayabilirsiniz. A Product
değişken özniteliklere sahip olabilir; muhtemelen bir Invoice
ya da bir Order
olur ve yapamadı. Gitmek kötü bir yol değil. Sıkı, disiplinli bir dil ve yazım sisteminde kalırken, ihtiyacınız olan yerde değişiklik yapabilme esnekliği sağlar. Aşağı tarafta, bu esnek özellikleri yönetmekten siz sorumlusunuz ve muhtemelen bunu daha yerel özelliklerden biraz farklı görünen mekanizmalar aracılığıyla yapmanız gerekecektir. p.prop('tensile_strength')
ziyade p.tensile_strength
, örneğin, ve p.set_prop('tensile_strength', 104.4)
yerinep.tensile_strength = 104.4
. Ancak standart olmayan özellik türleri için tam olarak bu tür alıcı ayarlayıcı erişimini kullanan Pascal, Ada, C, Java ve hatta dinamik dillerde birçok programla çalıştım ve geliştirdim; yaklaşım açıkça uygulanabilir.
Bununla birlikte, statik tipler ve çok çeşitli bir dünya arasındaki bu gerilim son derece yaygındır. Veritabanı şeması tasarlanırken, özellikle ilişkisel ve ilişkisel veri depoları için benzer bir sorun görülür. Bazen, tüm hayal edilen varyasyonların birleşimini içermek veya tanımlamak için yeterli esneklik içeren "süper-satırlar" oluşturarak ve ardından bu alanlara gelen verileri doldurarak halledilir. WordPress wp_posts
tablo , örneğin, gibi alanlar vardır comment_count
, ping_status
, post_parent
ve post_date_gmt
sadece bazı durumlarda ilginç olduğunu ve pratikte sıklıkla boş gitmek. Başka bir yaklaşım, tıpkı sizin gibi çok yedek, normalleştirilmiş bir tablodur wp_options
.Property
sınıf. Daha açık bir yönetim gerektirse de, içindeki öğeler nadiren boştur. Nesne yönelimli ve belge veritabanları (örneğin, MongoDB) genellikle seçenekleri değiştirmekle uğraşmak için daha kolay bir zamana sahiptir, çünkü özellikleri istedikleri gibi oluşturabilir ve ayarlayabilirler.