Bunun gibi ifadeleri hiç anlamadım. Dürüst olmak gerekirse, bir işlevin dönüş türünü bildirseniz bile, birçok kod satırı yazdıktan sonra bunu unutabilir ve unutabilirsiniz ve yine de, arama işlevini kullanarak bildirildiği satıra geri dönmeniz gerekecektir. kontrol etmek için metin düzenleyiciniz.
Geri dönüş türünü unutmakla ilgili değil - bu her zaman olacak. Bu, aracın dönüş türünü unuttuğunuzu size bildirebilmesiyle ilgilidir.
Ek olarak, işlevler funcname()...
türle bildirildiğinden, türü bilerek, işlevin çağrıldığı her satırda arama yapmanız gerekecektir, çünkü yalnızca biliyorsunuz funcname
, Python ve benzerlerinde yalnızca arayabileceğiniz def funcname
veya function funcname
yalnızca bir kez gerçekleşen , deklarasyonda.
Bu, statik yazımla tamamen ilgisiz bir sözdizimi meselesidir.
C ailesi sözdizimi, elinizde özel araçlar olmadan bir bildiri aramak istediğinizde gerçekten düşmancadır. Diğer dillerde bu sorun yoktur. Rust'un bildirim sözdizimine bakın:
fn funcname(a: i32) -> i32
Dahası, REPL'lerle, bir işlevi farklı girişlerle dönüş türü için test etmek önemsizdir, statik olarak yazılan dillerle bazı kod satırları eklemeniz ve beyan edilen türü bilmek için her şeyi yeniden derlemeniz gerekir.
Herhangi bir dil yorumlanabilir ve herhangi bir dilde REPL olabilir.
Dolayısıyla, statik olarak yazılan dillerin güçlü bir noktası olmayan bir işlevin dönüş türünü bilmek dışında, statik yazım daha büyük projelerde gerçekten nasıl yardımcı olur?
Soyut bir şekilde cevaplayacağım.
Bir program çeşitli işlemlerden oluşur ve geliştiricinin yaptığı bazı varsayımlar nedeniyle bu işlemler oldukları gibi düzenlenir.
Bazı varsayımlar üstü kapalı, bazıları açıktır. Bazı varsayımlar yanlarındaki bir operasyonla, bazıları da onlardan uzak bir operasyonla ilgilidir. Bir varsayım, gerçeğe uygun değerinin önemli olduğu yerlere açıkça ve mümkün olduğunca yakın olarak ifade edildiğinde tanımlanması daha kolaydır.
Bir hata, programda var olan ancak bazı durumlar için geçerli olmayan bir varsayımın tezahürüdür. Bir hatayı takip etmek için hatalı varsayımı tanımlamamız gerekir. Hatayı kaldırmak için ya bu varsayımı programdan kaldırmamız ya da varsayımın gerçekten geçerli olması için bir şeyi değiştirmemiz gerekir.
Varsayımları iki türe ayırmak istiyorum.
Birinci tür, programın girdilerine bağlı olarak, tutabilecek ya da tutamayacak varsayımlardır. Bu tür hatalı bir varsayımı tanımlamak için, programın tüm olası girişleri alanında arama yapmamız gerekir. Eğitimli tahminler ve rasyonel düşünme kullanarak sorunu daraltabilir ve daha küçük bir alanda arama yapabiliriz. Ama yine de, bir program biraz büyüdükçe, başlangıç girdi alanı muazzam bir oranda büyüyor - tüm pratik amaçlar için sonsuz olarak kabul edilebileceği noktaya kadar.
İkinci tür, tüm girdiler için kesinlikle geçerli olan veya tüm girdiler için kesinlikle hatalı olan varsayımlardır. Bu tür bir varsayımı hatalı olarak tespit ettiğimizde, programı çalıştırmamız veya herhangi bir girişi test etmemiz bile gerekmez. Bu tür bir varsayımı doğru olarak tespit ettiğimizde, bir hatayı ( herhangi bir hatayı) izlerken ne kadar dikkatli olacağımızdan daha az şüpheleniriz . Bu nedenle, bu türden olabildiğince fazla varsayımlara sahip olmanın değeri vardır.
İkinci kategoriye (her zaman doğru veya her zaman yanlış, girdilerden bağımsız) bir varsayım koymak için, varsayımın yapıldığı yerde minimum miktarda bilgiye ihtiyacımız vardır. Bir programın kaynak kodunda, bilgi oldukça hızlı bir şekilde eski hale gelir (örneğin, birçok derleyici süreçler arası analiz yapmaz, bu da herhangi bir çağrıyı çoğu bilgi için zor bir sınır haline getirir). Gerekli bilgileri taze (geçerli ve yakın) tutmak için bir yola ihtiyacımız var.
Bunun bir yolu, bu bilgilerin kaynağının tüketileceği yere olabildiğince yakın olmasını sağlamaktır, ancak bu çoğu kullanım durumunda pratik olmayabilir. Başka bir yol da bilgileri sık sık tekrarlamak ve kaynak koddaki ilgisini yenilemektir.
Tahmin edebileceğiniz gibi, statik türler tam olarak budur - kaynak koduna dağılmış tip bilgisi işaretleri. Bu bilgi, ikinci kategoride tür doğruluğu ile ilgili varsayımların çoğunu koymak için kullanılabilir, yani hemen hemen her işlem tür uyumluluğuna göre her zaman doğru veya her zaman yanlış olarak sınıflandırılabilir.
Türlerimiz yanlış olduğunda, analiz, hatayı geç değil erken dikkatimize getirerek zaman kazandırır. Türlerimiz doğru olduğunda, analiz, bir hata oluştuğunda, tür hatalarını hemen dışlayabilmemizi sağlayarak bize zaman kazandırır.