Tamam, bu gerçekten de bir şeytan savunucusu sorusu.
Global değişkenler ne zaman iyidir ve asla değilse alternatif olarak ne kullanırsınız?
Bu sorunun ilginç bir yanı, genel bir statik sınıf alanının küreselden nasıl farklı olduğu?
Tamam, bu gerçekten de bir şeytan savunucusu sorusu.
Global değişkenler ne zaman iyidir ve asla değilse alternatif olarak ne kullanırsınız?
Bu sorunun ilginç bir yanı, genel bir statik sınıf alanının küreselden nasıl farklı olduğu?
Yanıtlar:
Bildiğim kadarıyla, genel bir statik alan, ad alanını tıkamadığı durumlar dışında, herhangi bir yerden çağrılabileceği düşünüldüğünde temel olarak küresel bir alandır.
Kişisel olarak kodumda 'global' değişkenleri kullandığım tek zaman, değişmeyen ortak statik alanlar şeklinde. Bu durumda, programın diğer bölümleri tarafından çevrilen değer hakkında endişelenmenize gerek yoktur ve elbette her sınıfta aynı kalıcı değerlere sahip bir düzine değişkene sahip olmaktan çok daha iyidir.
Şahsen, çalışma zamanı yapılandırması için globals kullanıyorum - uygulama başlangıcında bir configuration özelliği yüklenirse ve yalnızca nadiren değişirse (ve yalnızca bir yerden), kullanması gerekebilecek her yönteme aktarmak korkunç ve hataya açıktır bir noktada. Kullanması gereken herhangi bir yerden kapsama alınabilecek bir şeyi kullanmak daha iyi, çünkü yöntem imzalarını ve çağrı sitelerini karıştırmaz ve gizlemez.
CONFIG_
veya CFG_
ön ekli düz küre .
Gerçek zamanlı / gömülü sistemler hariç, gerçekten sabit değerler için globaller kullanmalısınız. Sorununuzu onlarsız çözemeyeceğinizi düşünüyorsanız, muhtemelen yanlış bir şey yapıyorsunuzdur.
Ayrıca, Singleton desenine bakın , soğuk olması, küresel erişim noktasına sahip olmak için bir şeye ihtiyacınız olduğunda, bu durumlarda küreseller için daha iyi bir çözüm sunar.
TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOP
sadece 'bu özel döngünün' göründüğü bir dosya / sınıf / bölüm için geçerlidir.
Global değişkenlerle ilgili sorun, kodunuzun her yerinde bunların farkında olmanız gerektiğidir. Ancak, belirli bir küresel hakkında bilgi sahibi olmanız gerektiğine karar verdikten sonra, onu yoğun bir şekilde kullanırken daha az kaybedilir. Bu nedenle, benim fikrim, çok az sayıda küresel değişkeniniz olması gerektiği, ancak sahip olduğunuz birkaç kişi için maksimum kilometreyi aşmanız gerektiğidir.
Bu şekilde hissettiğim bir şeyin başka bir örneği için, Ruby'deki karışımların kullanımına bakın.
Her şey isim alanlarıyla ilgili.
Bir an için dünyadaki herkesin aynı soyadına sahip olduğunu hayal edin. Ne dağınıklık.
(Hindistan'da, Sihler soyadı aynıdır: Singh - Bir göz atın)
Kısa versiyon: programın nedenini kolaylaştırmak için. Tipik durumlar, yaygın olarak kullanılan bir tür küresel durum veya statik kaynaktır.
Uzun versiyon: Tom Hawtin "uzak mesafeden ürkütücü hareketle" dedi ... tam olarak globalıların sorunu - nerede kullanıldığını ve nasıl kullanıldığını bilmek zorundasın ya da izini sürmek için çok garip ve zor olabilir böcek. Yereller, programcının nedenini anlamak için programcının neyi anlaması gerektiğinin kapsamını azaltmak için bir stratejiden daha fazla veya daha az değildir.
Nerede kullanıldıklarını bilmekle ilgili problemin bir başka tarafı da, tekrarlanan küreler ile sonuçlanabilmenizdir - bu durumda, programların çoğu alıp kullandıkça var2'yi ayarlarken var2 çok şey tutabilir. Aynı bilgi. Özellikle birden fazla kişi aynı kod üzerinde çalışıyorsa. IDE'ler, küresellerin maliyetini düşüren kullanım bulma konusunda yardımcı olabilir, ancak bunlar çiftler için hiçbir şey yapmaz.
Ne kadar güçlü olursanız, onlarla olanları takip etmek o kadar zorlaşır. Çok az uzakta olmalılar.
Globals ve singleton'lu iki yakalama, test edilebilirlik ve konuşlandırılabilirliktir.
Test için, sadece kötü planlanmış küresel ve tekil yaşam süreleriyle başa çıkabilmek için çok fazla karmaşık test koşumları gördüm. Bu tür herhangi bir nesnenin açık ve basit başlatma ve yırtma kurallarına sahip olduğundan emin olun.
Konuşlandırılabilirlik gelince, dikkate alınması gereken iki durum vardır. Öncelikle, küresel nesneniz nasıl yaşayacak? Statik veya dinamik bir kütüphanede mi? Bu global nesne bir eklenti için tekrar kullanılırsa, ekstra kopyalar alır mısınız? İkincisi, bu küresel nesne paralel bir uygulamaya bırakıldığında ne olur? İplik güvenli midir?
Genel olarak, bu nedenlerin küresel ve tekillerin yalnızca istisnai olarak kullanıldığı anlamına geldiğini anlıyorum.
Dünyayı yarın yokmuş gibi kötüye kullanan korkunç bir VB6 kod tabanında, yeni bir tanesini tanıtmaktan suçluyum:
Global CsExt As New TheAppBeingRewrittenInCSharpWhileVb6CodeIsStillBeingMaintained
Küresel bir nesne için birkaç geçerli kullanım durumundan biri olduğunu düşünüyorum.