Bu bir arkadaşımla yapılan bir tartışmada ortaya çıktı ve kendimi iyi bir argüman düşünmek için zorlandım. Zayıf yazmanın yararları nelerdir?
Bu bir arkadaşımla yapılan bir tartışmada ortaya çıktı ve kendimi iyi bir argüman düşünmek için zorlandım. Zayıf yazmanın yararları nelerdir?
Yanıtlar:
Bu tür bir tartışmanın sorunu basitçe "zayıf yazma" ve "güçlü yazma" terimlerinin tanımsız olmasıdır, örneğin "statik yazma", "dinamik yazma", "açık yazma", "açık yazma", " Ördek yazarak "," yapısal yazarak "veya" nominal yazarak ". Heck, hala açık araştırma ve tartışma alanları olan “tezahür yazmaya” ve “gizli yazmaya” terimleri bile daha iyi tanımlanmıştır.
Bu nedenle, arkadaşınız bir tartışmanın temeli olarak hizmet edecek kadar istikrarlı olan "zayıf yazma" teriminin bir tanımını sunana kadar, bu soruyu cevaplamak bile mantıklı gelmiyor.
Maalesef, Nick'in cevabından ayrı olarak, cevap verenlerin hiç kimse tanımlarını sağlamak için zahmet etmedi ve bazı yorumlarda ortaya çıkan karışıklığı görebilirsiniz. Söylemesi zor, çünkü kimse aslında tanımlarını vermedi, ancak sanırım bu sayfada en az üç farklı olanı sayıyorum.
Daha yaygın olarak kullanılan tanımların bazıları (ve evet, bunların neredeyse hiçbirinin bir anlam ifade etmediğini biliyorum , ancak bunlar insanların kullandığı tanımlarıdır):
Bununla birlikte, en yaygın şekilde kullanılan üç tanım ,
Herkes bile neyi "zayıf yazarak" nın tanımı üzerinde kabul etmedikçe olduğunu , hatta duyu avantajları ne olabileceğini düşünmek yapmaz. Neyin avantajları? Hiçbir tanım varsa da kötüsü, hiç , o zaman herkes sadece kendi argümanlarını uyacak şekilde kendi tanımlarını kayabilir ve her tartışma hemen hemen bir flamewar devretmek için garanti edilir.
Ben kendim yıllar geçtikçe kendi tanımımı kişisel olarak değiştirdim ve artık terimleri daha yararlı bulmadığım bir noktaya geldim. Ayrıca, zayıf yazmanın (çeşitli tanımlarında) kabuk komut dosyasında bir yeri olduğunu düşünürdüm, fakat ne zaman Bash ve PowerShell'de aynı problemi çözmek zorunda kalsam, ne kadar hatalı olduğumu acı bir şekilde hatırlattım.
Unutmayın, genellikle karışık olan iki ana kavram vardır:
Bir programlama dilinin, tür kontrolünün çoğunluğu derleme zamanında olduğu gibi çalışma zamanında yapıldığında dinamik olarak yazıldığı söylenir. Dinamik yazımda, değerlerin türleri vardır, ancak değişkenler yoktur; yani, bir değişken herhangi bir türden bir değeri ifade edebilir.
Buradaki avantajlar genellikle "yeni" programcılar için olduğu gibi reddedilir, ancak herhangi bir programcı için de uygun olabilir:
if (!(arr is Array)) arr = [arr]; // is, instanceof, .constructor ==, whatever
Aksi takdirde, yeni bir değer vermeniz veya atamanız gereken durumlarda daha az kod:
if (data is Array)) {
i = data.length; // no i = ((Array)data).length or Array myArr=(Array)data;
}
Zayıf yazma, bir dilin kullanıldığında yazım tiplerini dolaylı olarak dönüştürdüğü (veya çevirdiği) anlamına gelir.
Yararları:
Örtük boole değerlendirmesi . Herhangi bir tür bir boole olarak değerlendirilebilir. Bu ayrıca, ||
boole dönüştürmeden atamada kullanılabilecek bir parçanın bir parçası gibi yan faydalara da sahiptir :
var a = param || defaultValue;
Yine, daha az kod:
var num = 5;
var str = "Hello";
input.innerHTML = input.value = num;
for (var i=0; i < input.value; i++) { ... }
.toString()
Nesneleri a ile birleştirirken Java'nın bile kısmi çağrı yapması gerekiyordu String
; Aksi takdirde, Java programcıları bütün gün boyunca küfredeceklerdi (log ifadeleri kontrolden çıkacaktı).
Her iki tanım da http://en.wikipedia.org/wiki/Type_system ' dendir . Benden daha iyi olduğunu söyledi.
if
bloğun kullanılmasının ya da daha karmaşık (hatta çalışma zamanı ya da dinamik) bir mantığın kullanılmasının bir sonraki satırın hatalara karşı yasal ve güvenli olacağına dinamik yazma ile ilgili olması gerekir.
Ana argümanı için zayıf yazarak performans biridir. (Bu OP'lerin sorusuna belirtildiği gibi cevap vermek içindir). Dinamik ve statik, örtük ve açık hakkında çok iyi tartışmalar var. vb.
C, zayıf yazılmış en ünlü dildir ve değişkenlerin türünde herhangi bir çalışma zamanı denetimi veya derleme zamanı denetimi yapmaz. Özünde bir yayınlayabileceğim char *
bir etmek int *
ve dil umurumda olmaz. Peki neden bunu yaptın?
C programlama, montaj ile işleri yapma biçiminize oldukça yakındır, bu yüzden sadece bir adrese önem verdiğiniz zamanlar vardır. Bu void *
sebeple referans atmak ya da iletmek alışılmadık bir durum değil . Hafızanın nasıl düzenlendiğini biliyorsanız (yine bir C ve montaj endişesi), void *
ihtiyacınız olan bilgiye ulaşmak için adrese dayanarak oldukça havalı hesaplamalar yapabilirsiniz . Bu, örneğin Java'da yapmanız gereken işlemi kısa devre yapmanıza izin verebilir.
Çalışma zamanı türü denetlemesinin olağandışı bir bit yükü olmamasına rağmen, kritik bir bölümün çok yavaş olmasına neden olmak için yeterli olan zamanlar vardır. Bu durumda daha çok gömülü programlama ve gerçek zamanlı sistemler hakkında düşünüyorum.
Bununla birlikte, çoğu durumda, derleme zamanı veya çalışma zamanı denetlenen derleme zamanı güçlü olan bir sisteme sahip olmak, incindiğinden daha sık yardımcı olur.
Zayıf yazma, yeni başlayanlar için örneğin excel, javascript ve vbscript gibi şeyler için genellikle daha kolaydır. Ayrıca olası hatalar için bazı geliştirme hızları takas ediyorsunuz.
Konuyla ilgili iyi yazı: Güçlü yazım vs Güçlü test