Yanıtlar:
Bunun Python ile ilgisi yoktur; genel değişkenler herhangi bir programlama dilinde kötüdür.
Ancak, genel sabitler kavramsal olarak küresel değişkenlerle aynı değildir ; küresel sabitler tamamen zararsızdır. Python'da ikisi arasındaki ayrım tamamen gelenekseldir: CONSTANTS_ARE_CAPITALIZED
ve globals_are_not
.
Küresel değişkenlerin kötü olmasının nedeni, işlevlerin gizli (açık olmayan, şaşırtıcı, tespit edilmesi zor, teşhis edilmesi zor) yan etkilere sahip olmasını sağlayarak karmaşıklıkta bir artışa yol açması ve potansiyel olarak Spagetti koduna yol açmasıdır .
Bununla birlikte, küresel durumun mantıklı kullanımı (yerel durum ve değişkenlik gibi), ya algoritma optimizasyonu, azaltılmış karmaşıklık, önbelleğe alma ve hafızaya alma ya da ağırlıklı olarak zorunlu bir kod tabanından kaynaklanan taşıma yapılarının pratikliği için işlevsel programlamada bile kabul edilebilir.
Sonuç olarak, sorunuz birçok şekilde yanıtlanabilir, bu nedenle yapabileceğiniz en iyi şey, "global değişkenler neden kötüdür" diye google'da bulunmaktır. Bazı örnekler:
Daha derine inmek ve neden yan etkilerin ve diğer birçok aydınlatıcı şeyin neden olduğunu öğrenmek istiyorsanız, İşlevsel Programlamayı öğrenmelisiniz:
Evet, teoride , küreseller (ve genel olarak "devlet") kötüdür. Pratikte, python'un paketler dizinine bakarsanız, oradaki modüllerin çoğunun bir grup genel bildirimle başladığını göreceksiniz. Açıkçası, insanların onlarla bir sorunu yok.
Özellikle python ile ilgili olarak, küresellerin görünürlüğü bir modülle sınırlıdır, bu nedenle tüm programı etkileyen "gerçek" küreseller yoktur - bu da onları daha az zararlı yapar. Başka bir nokta: yok const
, bu yüzden bir sabite ihtiyacınız olduğunda bir global kullanmanız gerekir.
Uygulamamda, bir fonksiyondaki bir globali değiştirirsem global
, teknik olarak buna gerek olmasa bile, aşağıdaki gibi her zaman ile beyan ederim :
cache = {}
def foo(args):
global cache
cache[args] = ...
Bu, küresellerin manipülasyonlarının izini sürmeyi kolaylaştırır.
Konuyla ilgili kişisel bir görüş, bir işlev mantığında kullanılan global değişkenlere sahip olmanın, başka bir kodun bu işlevin mantığını ve beklenen çıktısını değiştirebileceği anlamına geldiği ve bu da hata ayıklamayı çok zorlaştıracağı (özellikle büyük projelerde) ve testi zorlaştıracağıdır. yanı sıra.
Ayrıca, kodunuzu okuyan diğer insanları (açık kaynak topluluğu, meslektaşları vb.) Düşünürseniz, küresel değişkenin nerede ayarlandığını, nerede değiştirildiğini ve bunun tersine bu küresel değişkenden ne bekleyeceklerini anlamakta zorlanacaklardır. izole edilmiş bir işleve, işlevselliğinin işlev tanımının kendisini okuyarak belirlenebileceği.
Temiz ve (neredeyse) hatasız bir kodun olabildiğince saf işlevlere sahip olması gerektiğine inanıyorum (bkz. Saf işlevler ). Saf işlev, aşağıdaki koşullara sahip olandır:
Global değişkenlere sahip olmak yukarıdakilerden en az birini ihlal ediyor değilse de, harici bir kod muhtemelen beklenmedik sonuçlara neden olabilir.
Saf işlevlerin başka bir net tanımı: "Saf işlev, tüm girdilerini açık bağımsız değişkenler olarak alan ve tüm çıktılarını açık sonuçlar olarak üreten bir işlevdir ." [1] . Global değişkenlere sahip olmak, bir girdi ve belki de çıktılardan biri (global değişken) açıkça verilmediği veya verilemediği için saf fonksiyon fikrini ihlal eder.
Eğer birim test ve İLK prensibini göz önüne alırsak Dahası bu konuda, ( F ast testleri, ben ndependent testler, R epeatable, S elf Sınamayan ve T imely) Bağımsız (ilke testleri ihlal muhtemelen hangi testler bağımlı olmayan araçlar her birine).
Küresel bir değişkene sahip olmak (her zaman değil), ancak çoğu durumda (en azından şimdiye kadar gördüklerimin) sonuçları hazırlamak ve diğer işlevlere aktarmaktır. Bu da bu prensibi ihlal ediyor. Global değişken bu şekilde kullanılmışsa (yani, X fonksiyonunda kullanılan global değişken önce bir Y fonksiyonunda ayarlanmalıdır), bu, X fonksiyonunu test etmek için önce test / çalıştır fonksiyonunu çalıştırmanız gerektiği anlamına gelir.
Öte yandan ve diğer insanların daha önce de bahsettiği gibi, global değişken "sabit" bir değişken olarak kullanılırsa, dil sabitleri desteklemediği için biraz daha iyi olabilir. Bununla birlikte, ben her zaman sınıflarla çalışmayı ve "sabitleri" sınıf üyesi olarak kullanmayı ve global bir değişken kullanmamayı tercih ederim. İki farklı sınıfın global bir değişkeni paylaşmak için gerektirdiği bir kodunuz varsa, muhtemelen çözümünüzü yeniden düzenlemeniz ve sınıflarınızı bağımsız hale getirmeniz gerekir.
Küresellerin kullanılmaması gerektiğine inanmıyorum. Ancak kullanılırlarsa, yazarlar daha temiz ve neredeyse hatasız bir kod için bazı ilkeleri (yukarıda belirtilenler ve diğer yazılım mühendisliği ilkeleri ve iyi uygulamalar) dikkate almalıdır.
Bunlar çok önemlidir, ekran iyi bir örnektir. Bununla birlikte, çok iş parçacıklı bir ortamda veya birçok geliştiricinin dahil olduğu uygulamada sıklıkla şu soru ortaya çıkar: bunu kim (yanlış bir şekilde) ayarladı veya temizledi? Mimariye bağlı olarak, analiz maliyetli olabilir ve sıklıkla gerekli olabilir. Global değişkeni okurken uygun olabilir, ona yazma, örneğin tek bir iş parçacığı veya iş parçacığı güvenli bir sınıf tarafından kontrol edilmelidir. Bu nedenle, küresel çapta, kendileri için kötü olarak değerlendirilen sonuçların olası yüksek geliştirme maliyetleri korkusu ortaya çıkar. Bu nedenle, genel olarak, küresel değişkenlerin sayısını düşük tutmak iyi bir uygulamadır.
eval
,import *
, dize birleştirme , değişkenid
, özellik gölgeler )