Global değişken kullanmak ne zaman uygundur?


22

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?


5
Kod Tamamlandı , 2. baskı, §13.3.
Jerry Coffin

1
Çok iş parçacıklı uygulamalar hemen hemen global değişkenler gerektirir .
aqua


4
@aqua Okuyuculu uygulamalar, küresel değişkenlerin en fazla zarar verdiği yerlerdir. Herkes karmaşık kilitleme mantığından nefret eder.
luiscubal

1
@JerryCoffin İlgili bölümden alıntı yapmadan bir bağlantıyı bir cevap olarak göndermek kötü bir uygulama ise, o zaman ilgili bölümden alıntı yapmadan bir kitabın bir bölümünü alıntı yapmaktır. Özellikle öyleyse, kitaplar serbestçe ve kolay olmadığından web sayfaları gibi.
Braden Best

Yanıtlar:


18

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.


2
Değişmez bir alanı sabit olarak adlandırırdım .
aioobe

14

Ş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.


Bunun için saf bir küresel veya genel statik / Singleton kullanır mısın?
ocodo

1
@Slomojo: Kesinlikle bir singleton değil. Duruma bağlı olarak, bir yapılandırma sınıfında statik veya bir CONFIG_veya CFG_ön ekli düz küre .
Anon.

+1 önereceğim değişikliği "... diğer sınıflardaki her bir yönteme aktarmaya meyilli" demek. Aksi taktirde, ona hizmet eden şeyle sınıfa dahil edilebilir - sanırım.
Michael Durrant

8

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.


8
Muhtemelen Singletons'dan kaçınmayı öneririm.
ocodo

Singletonların harika olduğunu öne sürmüyorum, ama hala küresel değişkenleri çok fazla yendiğini düşünüyorum.
Davor Ždralo

Sabit değerlere sadece ilgili oldukları alanda / modülde erişilebilir olması gerekir. Bir sabit TIMES_TO_ITERATE_THROUGH_THIS_PARTICULAR_LOOPsadece 'bu özel döngünün' göründüğü bir dosya / sınıf / bölüm için geçerlidir.
Cthulhu

1
Bir singletonın alanları global değişkenlerdir, bu yüzden nasıl bir fark olduğunu anlamıyorum.
sleske,

1
@Cthulhu kendimden alıntı yapmama izin verdi: "küresel erişim noktasına sahip bir şeye ihtiyacınız olduğunda bu durumlarda".
Davor Ždralo

6

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.


Bu globals kullanımı için hangi örnek kullanım durumlarını önerirdiniz?
ocodo

1
@Slomojo: Aldırmadığım bir örnek, Perl'de @ARGV ve $ _ kullanımı. Aklıma gelen bir örnek, küresel parametrelerin alt yordamlara geçiş için ucuz parametre kullanımıdır.
btilly

5

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)


6
Bu kullanılan ad alanları hakkında tüm olmak, ama şimdi iş parçacığı güvenliği hakkında.
dan04

6
@ dan04 Bu uzaktan ürkütücü eylem ile çirkin bir tasarıma sahip olmadığı hakkında.
Tom Hawtin - tackline

2
@ Tom: Belki bunu "yanak dili", "Kuantum Programlama" olarak adlandırabiliriz
Christopher Mahan

4

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.


Sonuçta değişebilir kürelere sahip olmak oldukça kötü bir fikirdir. Tek iyi istisna, gömülü programlama gibi son derece sıkı donanım ayak izlerinde çalışırken olur. En azından, düzenli programlamada küresel adaylar sınıf veya modüllerin statik üyelerine ayrılmalı, değişken olan herhangi bir şey aynı zamanda çok dişli bir ortamda çalışırken de iki kat özel bir durum olarak düşünülmelidir. Kilitleme / vadeli işlemler / vaatler veya başka bir iş parçacığı / işlem güvenliği yöntemi kullanmak. - Başka hiç kimseden bahsetmediğinden, yemek felsefecilerinin problemini görüyor.
ocodo

1
Hiç şüphe yok ki, değişken globaller çalışmayı zorlaştırabilir, ancak olaylar nedeniyle aynı temel problemi yaşayabilirsiniz. Hem'i statik üye olarak koyma önerisine katılıyorum ve daha da ileri gidip ideal olarak ÖZEL statik üyeler olması gerektiğini söyleyeceğim.
jmoreno

3

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.


2

Kritik gömülü sistemlerin geliştirilmesi genellikle küresel değişkenlerin kullanılmasını içerir.

Yığın boyutları küçüktür, her şey statik olarak tahsis edilir ( malloc()yasaktır), global değişkenler ait oldukları kütüphanenin dışından gizlenir.


0

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.

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.