Statik yazım daha büyük projelerde nasıl yardımcı olur?


9

Bir komut dosyası programlama dili sitesinin ana sayfasında merak ederken, bu pasajla karşılaştım:

Bir sistem kafanızda kalmayacak kadar büyüdüğünde statik türler ekleyebilirsiniz.

Bu, statik, derlenmiş diller (Java gibi) ve dinamik, yorumlanmış diller (çoğunlukla Python'un daha çok kullanıldığı için, ancak çoğu komut dosyası dili arasında paylaşılan bir "sorun" arasındaki birçok din savaşında, statik olarak şikayetlerden biri olduğunu hatırlattı. yazılan dillerin hayranları, dinamik olarak yazılan dillere göre daha büyük projelere göre iyi ölçeklenmemeleridir, çünkü "bir gün, bir işlevin dönüş türünü unutacaksınız ve statik olarak yazılan dillerle her şeyi aramak zorunda kalacaksınız. msgstr "% s: açıkça bildirildi".

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.

Ek olarak, işlevler bildirildikçe , işlevin çağrıldığı her satırda arama yapmanız gerektiğini type funcname()...bilen type, çünkü funcnamePython ve benzerlerinde sadece aradığınızı def funcnameveya function funcnamesadece bir kez gerçekleştiğini Deklarasyon.

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 bildirilen türü bilmek için her şeyi yeniden derlemeniz gerekir.

Dolayısıyla, statik olarak yazılan dillerin güç noktası olmayan açıkça 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?



2
diğer sorunun cevaplarını okursanız, muhtemelen bunun için ihtiyacınız olan cevapları alacaksınız, temel olarak aynı şeyi farklı bakış açılarından soruyorlar :)
sara

1
Swift ve oyun alanları, statik olarak yazılmış bir dilin REPL'idir.
daven11

2
Diller derlenmemiştir, uygulamalar vardır. "Derlenmiş" bir dil için bir REPL yazmanın yolu, dili yorumlayabilecek bir şey yazmak veya en azından gerekli satırları koruyarak satır satır derlemek ve yürütmektir. Ayrıca, Java 9 bir REPL ile birlikte gönderilir.
Sebastian Redl

2
@ user6245072: Bir tercüman için nasıl REPL yapılacağı aşağıda açıklanmıştır: kodu okuyun, tercümana gönderin, sonucu yazdırın. Bir derleyici için REPL nasıl yapılır: kodu okuyun, derleyiciye gönderin , derlenmiş kodu çalıştırın, sonucu yazdırın. Pasta kadar kolay. FSi (F♯ REPL), GHCi (GHC Haskell'in REPL), Scala REPL ve Cling tam olarak bunu yapar.
Jörg W Mittag

Yanıtlar:


21

Dahası, REPL'lerle, bir işlevi farklı girdilere sahip dönüş türü için test etmek önemsizdir

Önemsiz değil. Bu önemsiz değil hiç . Bunu önemsiz işlevler için yapmak önemsizdir.

Örneğin, dönüş türünün tamamen giriş türüne bağlı olduğu bir işlevi önemsiz bir şekilde tanımlayabilirsiniz.

getAnswer(v) {
 return v.answer
}

Bu durumda, getAnswergerçekten değil sahip tek dönüş türü. Dönüş türünün ne olduğunu öğrenmek için bunu bir örnek girdi ile çağıran bir test yoktur. Her zaman asıl argümana bağlı olacaktır . İşlem esnasında.

Ve bu, örneğin veritabanı aramaları yapan işlevleri bile içermez. Veya kullanıcı girişine göre bir şeyler yapın. Veya elbette dinamik bir tür olan global değişkenlere bakın. Veya rasgele durumlarda dönüş türlerini değiştirin. Her bir bireysel işlevi her seferinde manuel olarak test etme ihtiyacından bahsetmiyoruz bile.

getAnswer(x, y) {
   if (x + y.answer == 13)
       return 1;
   return "1";
}

Temel olarak, genel durumda işlevin dönüş türünü kanıtlamak tam anlamıyla matematiksel olarak imkansızdır (Durma Sorunu). Geri dönüş türünü garanti etmenin tek yolu , girişi kısıtlamaktır, böylece bu soruya cevap vermek, kanıtlanamayan programları devre dışı bırakarak Durdurma Sorunu alanına girmez ve statik yazmanın yaptığı budur.

Ek olarak, işlevler funcname () ... ile bildirildiğinden, türü bilmeksizin, işlevin çağrıldığı her satırda arama yapmanız gerekecektir, çünkü yalnızca funcname'i biliyorsunuz, Python ve benzerlerinde sadece bildirimde yalnızca bir kez gerçekleşen def işlev adını veya işlev işlev adını arayın.

Statik olarak yazılan dillerde "araçlar" adı verilen şeyler vardır. Bunlar, kaynak kodunuzla bir şeyler yapmanıza yardımcı olan programlardır. Bu durumda, Resharper sayesinde basitçe sağ tıklayıp Tanıma Git. Veya klavye kısayolunu kullanın. Ya da sadece fareyle üzerine gelin ve bana bu türlerin ne olduğunu söyleyecek. En ufak tefek dosyaları umursamıyorum. Tek başına bir metin düzenleyici, program kaynak kodunu düzenlemek için acıklı bir araçtır.

Bellekten, def funcnameişlev keyfi olarak yeniden atanabileceğinden, Python'da yeterli olmazdı. Veya birden fazla modülde tekrar tekrar ilan edilebilir. Veya derslerde. Vb.

ve yine de kontrol etmek için metin düzenleyicinizin arama işlevini kullanarak bildirildiği satıra geri dönmeniz gerekecektir.

İşlev adı için dosyaları aramak, asla gerekmemesi gereken korkunç bir ilkel işlemdir. Bu, ortamınızın ve aletlerinizin temel bir başarısızlığını temsil eder. Python'da bir metin aramasına ihtiyaç duymayı düşünmeniz bile Python'a karşı büyük bir nokta.


2
Adil olmak gerekirse, bu "araçlar" dinamik dillerde icat edildi ve dinamik diller, statik dillerden çok önce onları kullanıyordu. Tanıma, Kod Tamamlama, Otomatik Yeniden Düzenleme vb. Grafiksel Lise ve Smalltalk IDE'lerinde, statik dillerin bile grafik IDE'leri bile grafik veya IDE'leri olmadan önce vardı.
Jörg W Mittag

Dönüş işlevlerini bilmek her zaman hangi işlevlerin YAPILDIĞINI söylemez . Tip yazmak yerine, örnek değerlerle yazılı doc testleri yapmış olabilirsiniz. örneğin (kelimeler 'bazı kelimeler oue') => ['bazı', 'kelimeler', 'oeu'] ile (kelime dizesi) -> [dize], (zip {abc} [1..3]) => [(a, 1), (b, 2), (c, 3)] türü ile birlikte.
aoeu256

18

Yıllar içinde değişen birçok programcı ile bir proje düşünün. Bunu korumak zorundasın. Bir işlevi var

getAnswer(v) {
 return v.answer
}

Yeryüzünde ne yapar? Nedir v? Öğe answernereden geliyor?

getAnswer(v : AnswerBot) {
  return v.answer
}

Şimdi biraz daha bilgimiz var; bir tür ihtiyacı var AnswerBot.

Sınıf temelli bir dile gidersek şunu söyleyebiliriz:

class AnswerBot {
  var answer : String
  func getAnswer() -> String {
    return answer
  }
}

Şimdi bir değişken tipine sahip olabiliriz AnswerBotve yöntemi çağırabiliriz getAnswerve herkes ne yaptığını bilir. Herhangi bir değişiklik, herhangi bir çalışma zamanı testi yapılmadan önce derleyici tarafından yakalanır. Başka birçok örnek var ama belki de bu size fikir veriyor?


1
Daha net görünüyor - böyle bir işlevin var olmak için hiçbir nedeni olmadığını belirtmedikçe, bu elbette sadece bir örnek.
user6245072

Büyük bir projede birden fazla programcı olduğunda sorun var, bunun gibi işlevler var (ve daha da kötüsü), kabuslar. ayrıca dinamik dillerdeki işlevlerin genel ad alanında olduğunu düşünün, bu nedenle zamanla birkaç getAnswer işlevine sahip olabilirsiniz - ve ikisi de çalışır ve ikisi de farklıdır, çünkü farklı zamanlarda yüklenirler.
daven11

1
Sanırım buna neden olan fonksiyonel programlamanın yanlış anlaşılması. Ancak, küresel ad alanında olduklarını söyleyerek ne demek istiyorsun?
user6245072

3
"dinamik dillerdeki işlevler varsayılan olarak genel ad alanındadır" bu, dile özgü bir ayrıntıdır ve dinamik yazmanın neden olduğu bir kısıtlama değildir.
sara

2
@ daven11 "Ben burada javascript düşünüyorum", ancak diğer dinamik diller gerçek ad alanları / modülleri / paketleri vardır ve yeniden tanımlamalar konusunda sizi uyarabilir. Biraz fazla genelleme yapıyor olabilirsiniz.
coredump

10

Kararınızı bulanıklaştırabilecek büyük statik projelerle çalışma konusunda birkaç yanlış anlaşmanız var gibi görünüyor. İşte bazı işaretçiler:

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 metin düzenleyicinizin arama işlevini kullanarak bildirildiği satıra geri dönmeniz gerekecektir. kontrol et.

Statik olarak yazılan dillerle çalışan çoğu kişi, dil için bir IDE veya dile özgü araçlarla entegrasyonu olan akıllı bir düzenleyici (vim veya emacs gibi) kullanır. Bu tür araçlarda genellikle bir işlev türünü bulmanın hızlı bir yolu vardır. Örneğin, bir Java projesinde Eclipse ile, genellikle bir yöntem türünü bulmanın iki yolu vardır:

  • 'Bu' dışında başka bir nesne üzerinde bir yöntem kullanmak isterseniz, bir başvuru ve bir nokta (örneğin someVariable.) yazın ve Eclipse türünü arar ve bu türde someVariabletanımlanan tüm yöntemlerin bir açılan listesini sağlar; Listeyi aşağı kaydırdığımda, seçildiklerinde her birinin türü ve belgeleri görüntülenir. Dinamik bir dil ile bunu başarmanın çok zor olduğuna dikkat edin, çünkü editörün türünün ne olduğunu belirlemek zor (veya bazı durumlarda imkansızdır) someVariable, bu yüzden doğru listeyi kolayca oluşturamaz. Bir yöntem kullanmak istersem thisaynı listeyi almak için ctrl + space tuşlarına basabilirim (bu durumda dinamik diller için bu kadar zor değil).
  • Zaten belirli bir yönteme yazılmış bir başvurum varsa, fare imlecini üzerinde hareket ettirebilirim ve yöntemin türü ve belgeleri araç ipucunda görüntülenir.

Gördüğünüz gibi, bu, dinamik diller için mevcut olan tipik araçlardan biraz daha iyidir ( bazılarının IDE işlevselliği olduğu için dinamik dillerde imkansız olduğu anlamına gelmez - smalltalk akla gelen bir şeydir - ancak dinamik bir dil ve bu nedenle kullanılabilir olma olasılığı daha düşüktür).

Ek olarak, işlevler funcname () ... ile bildirildiğinden, türü bilmeksizin, işlevin çağrıldığı her satırda arama yapmanız gerekecektir, çünkü yalnızca funcname'i biliyorsunuz, Python ve benzerlerinde sadece bildirimde yalnızca bir kez gerçekleşen def işlev adını veya işlev işlev adını arayın.

Statik dil araçları genellikle semantik arama yetenekleri sağlar, yani bir metin araması yapmaya gerek kalmadan belirli sembollerin tanımını ve referanslarını tam olarak bulabilirler. Örneğin, bir Java projesi için Eclipse kullanarak, metin düzenleyicisindeki bir sembolü vurgulayabilir ve sağ tıklayabilir ve bu işlemlerden birini gerçekleştirmek için 'tanımlamaya git' veya 'referansları bul'u seçebilirim. Bir işlev tanımının metnini aramanız gerekmez, çünkü düzenleyiciniz tam olarak nerede olduğunu biliyor.

Ancak, bunun tersi, bir yöntem tanımını metne göre aramanın, önerdiğiniz gibi büyük bir dinamik projede gerçekten iyi çalışmadığıdır, çünkü böyle bir projede aynı ada sahip birden çok yöntem kolayca olabilir ve muhtemelen hiç hangisini çağırdığınızı netleştirmek için hazır araçlar (çünkü bu tür araçların en iyi şekilde yazılması zordur veya genel durumda imkansızdır), bu yüzden elle yapmanız gerekir.

Dahası, REPL'lerle, bir işlevi farklı girdilere sahip dönüş türü için test etmek önemsizdir

Statik olarak yazılan bir dil için REPL olması imkansız değildir. Haskell akla gelen bir örnektir, ancak diğer statik olarak yazılmış diller için de REPL'ler vardır. Ancak asıl nokta, statik bir dilde bir işlevin dönüş türünü bulmak için kod yürütmeniz gerekmemesidir - hiçbir şey çalıştırmaya gerek kalmadan muayene ile belirlenebilir.

statik olarak yazılmış dillerle, bazı kod satırları eklemeniz ve beyan edilen türü bilmek için her şeyi yeniden derlemeniz gerekir.

Şansınız, bunu yapmanız gerekse bile, her şeyi yeniden derlemek zorunda kalmayacaksınız . Çoğu modern statik dilde, kodunuzun yalnızca küçük bir bölümünü derleyen artımlı derleyiciler bulunur, böylece tür hataları için neredeyse anında geri bildirim alabilirsiniz. Örneğin Eclipse / Java, siz yazarken yazım hatalarını vurgulayacaktır .


4
You seem to have a few misconceptions about working with large static projects that may be clouding your judgement.Ben sadece 14 yaşındayım ve Android'de yalnızca bir yıldan az bir süredir program yapıyorum, bu yüzden sanırım.
user6245072

1
IDE olmadan bile, Java'daki bir sınıftan bir yöntemi kaldırırsanız ve bu yönteme bağlı olan şeyler varsa, herhangi bir Java derleyicisi size bu yöntemi kullanan her satırın bir listesini verir. Python'da, yürütme kodu eksik yöntemi çağırdığında başarısız olur. Hem Java hem de Python'u düzenli olarak kullanıyorum ve Python'u bir şeyleri ne kadar çabuk çalıştırabileceğiniz ve Java'nın desteklemediği harika şeyler için seviyorum, ancak gerçek şu ki Python programlarında olmayan (düz) Java. Özellikle Python'da yeniden düzenleme çok daha zordur.
JimmyJames

6
  1. Çünkü statik olarak yazılmış diller için statik denetleyiciler daha kolaydır.
    • Çıplak bir minimumda, dinamik dil özelliği olmadan, derlerse, çalışma zamanında çözülmemiş işlevler yoktur. Bu ADA projelerinde ve mikrodenetleyicilerde C yaygındır. (Mikrodenetleyici programları bazen büyür ... yüzlerce kloc gibi.)
  2. Statik derleme referans kontrolleri, statik bir dilde derleme zamanında da kontrol edilebilen işlev değişmezlerinin bir alt kümesidir.
  3. Statik diller genellikle daha fazla referans şeffaflığına sahiptir. Sonuç olarak, yeni bir geliştirici tek bir dosyaya dalabilir ve neler olduğunu anlayabilir ve kod tabanındaki tüm tuhaf şeyleri bilmek zorunda kalmadan bir hatayı düzeltebilir veya küçük bir özellik ekleyebilir.

Geliştiricilerin temel dil işlevlerini çalışma zamanında yeniden tanımladıkları say, javascript, Ruby veya Smalltalk ile karşılaştırın. Bu, büyük projeksiyonu anlamayı zorlaştırır.

Daha büyük projelerin sadece daha fazla insanı değil, daha fazla zamanı vardır. Herkesin unutması veya ilerlemesi için yeterli zaman.

Anekdot olarak, bir tanıdımın Lisp'te güvenli bir "Yaşam İçin İş" programı var. Takım dışında hiç kimse kod tabanını anlayamaz.


Anecdotally, an acquaintance of mine has a secure "Job For Life" programming in Lisp. Nobody except the team can understand the code-base.gerçekten bu kadar kötü mü? Ekledikleri kişiselleştirme, onların daha üretken olmalarına yardımcı değil mi?
user6245072

@ user6245072 Şu anda orada çalışan insanlar için bir avantaj olabilir, ancak yeni kişileri işe almayı zorlaştırır. Yaygın olmayan bir dili zaten bilen birini bulmak veya onlara zaten bilmedikleri bir dili öğretmek daha fazla zaman alır. Bu, projenin başarılı olduğunda ölçeklendirilmesini veya dalgalanmadan kurtulmasını zorlaştırabilir - insanlar uzaklaşır, diğer pozisyonlara terfi eder ... Bir süre sonra uzmanların kendileri için dezavantaj olabilir - sadece on yıl kadar bir süre nich dil yazdıktan sonra, yeni bir şeye geçmek zor olabilir.
Hulk

Çalışan Lisp programından birim testleri oluşturmak için bir izleyici kullanamaz mısınız? Python'da olduğu gibi, bir işlevi alan ve bağımsız değişkenini yazdıran değiştirilmiş bir işlevi döndüren print_args adında bir dekoratör (zarf) oluşturabilirsiniz. Daha sonra sys.modules içindeki tüm programa uygulayabilirsiniz, ancak bunu yapmanın daha kolay bir yolu sys.set_trace kullanmaktır.
aoeu256

@ aoeu256 Lisp çalışma zamanı ortam yeteneklerini bilmiyorum. Ama çok fazla makro kullandılar, bu yüzden normal lisp programcısı kodu okuyamadı; Makroların Lisp ile ilgili her şeyi değiştirmesi nedeniyle çalışma zamanına "basit" şeyler yapmaya çalışmak muhtemelen işe yaramaz.
Tim Williscroft

@TimWilliscroft Bu tür şeyler yapmadan önce tüm makroların genişletilmesini bekleyebilirsiniz. Emacs, satır içi genişletme makrolarını (ve satır içi işlevleri belki de) sağlamanız için birçok kısayol tuşuna sahiptir.
aoeu256

4

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 funcnameveya function funcnameyalnı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.


3

Eski atasözü "çöp içeri, çöp dışarı" hatırlıyorsunuz, iyi, statik yazmayı önlemek için yardımcı olan budur. Bu evrensel bir her derde deva değil, bir rutinin ne tür verileri kabul ettiği ve geri döndüğü konusundaki katılık, onunla doğru çalıştığınıza dair bir güvenceye sahip olduğunuz anlamına gelir.

Bu nedenle, bir tamsayı döndüren bir getAnswer yordamı, dizeye dayalı bir çağrıda kullanmaya çalıştığınızda yararlı olmaz. Statik yazma zaten size dikkat etmenizi söylüyor, muhtemelen bir hata yaptığınızı. (ve emin olun, daha sonra geçersiz kılabilirsiniz, ancak tam olarak ne yaptığınızı bilmeniz ve bir döküm kullanarak kodda belirtmeniz gerekir. Genel olarak, bunu yapmak istemezsiniz - kare bir delik içine yuvarlak peg sonunda asla iyi çalışır)

Şimdi karmaşık türleri kullanarak, cevher işlevselliğine sahip bir sınıf oluşturarak daha ileriye götürebilirsiniz, bunları geçmeye başlayabilirsiniz ve aniden programınızda daha fazla yapı elde edersiniz. Yapılandırılmış programlar, doğru çalışmayı ve sürdürmeyi çok daha kolay olan programlardır.


Statik tip çıkarım (pylint) yapmak zorunda değilsiniz , aynı zamanda PyPy'nin JIT derleyicisi tarafından da yapılan chrislaffra.blogspot.com/2016/12/… dinamik tür çıkarım yapabilirsiniz . Ayrıca, bilgisayarın sahte nesneleri bağımsız değişkenlere rastgele yerleştirdiği ve neyin hataya neden olduğunu gördüğü dinamik tür çıkarımının başka bir sürümü de vardır. Durma problemi vakaların% 99'u için önemli değildir, çok fazla zaman alırsanız algoritmayı durdurun (Python sonsuz özyineleme bu şekilde işliyor, ayarlanabilen bir özyineleme limiti var).
aoeu256
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.