Küresel bir değişken kullanmanızı istiyorlarsa patronunuza ne söylenir?


13

Şu anda 4 ay staj yapıyorum ve kodumu incelerken, patronum belirli bir nesneyi bir mecliste birkaç ayrı sınıfta birkaç yöntem için yerel olarak tutmamdan hoşlanmadı. Her seferinde yeni bir nesne yaratılmamdan hoşlanmadı ve bunun yerine bana her yerden erişilebilen tek bir nesne oluşturmamı söyledi. Bu nedenle statik bir sınıf içinde statik bir nesne olarak oluşturmak zorunda kaldı ve sadece buradan kullanmak istiyorum referans!

Sadece 4 aydır profesyonel olarak programlama yaptığım için bununla nasıl baş edersin?


4
Patronunuz teknik veya teknik olmayan bir kişi mi? Teknikse, Robert C. Martin'den "Temiz Kod" mu okudu?
George Stocker

5
Patronunuz sizi kod yazması için işe aldı ve şimdi nasıl kod yazacağınızı mı söylüyor?
Jeremy Heiler

8
Aşağıdaki yorumda, "nesnenin çok fazla sabit dışında durumu yok" dediniz. Bu durumda, statik bir sınıf benim için iyi bir çözüm gibi görünüyor.
Justin

5
"Evet patron" akla geliyor ...

2
"Bana her yerden erişilebilen tek bir nesne yaratmamı söyledi. Bu yüzden onu statik bir nesne olarak oluşturmak zorunda kaldım" Bu geçerli bir gerekçe değil. Tüm bir uygulamadan erişilebilen tek bir nesneye sahip olmanız, bir Singleton'a sahip olduğunuzu ima ediyor gibi konuşuyorsunuz - neden sadece toplama kökünde oluşturup referansını bağımlı sınıflara iletmiyorsunuz?
elysium

Yanıtlar:


33

Bir nesne yeterliyse, her seferinde bir nesne oluşturmak boşa gider ve burada patronunuz haklı olabilir.

Sorun o nesneye doğru erişim. Her zaman bu statik nesneyi döndüren uygun görünürlüke sahip fabrika benzeri bir yöntem ilk akla gelen çözümdür. Diğerleri kesinlikle var.


3
+1: Herhangi bir "GoF öyle dedi" cevabını beğenmediğim kadar, doğru.
Javier

1
Singletons hakkında düşünmüştüm, ancak bunu küresel bir değişkenin etrafındaki bir paketleyici olarak gördüm, bu yüzden takip etmedim. Şimdi denemeliyim, çünkü nesnenin herhangi bir durumu olmadığı için, çok fazla sabit dışında, bu yüzden iyi olmalı. Teşekkürler.
Darren Young

9
Bunun olabileceğinden şüphelendim ("nesnenin durumu yok ... çok fazla sabit"). Patronun haklı. Asla değişmeyen değerler için çöp toplayıcısına yapay baskı uygulamanın bir anlamı yok.
Berin Loritsch

3
@ darren-young: bir yan notta, hiçbir durumun olmaması ilginçtir ve bazı güçlü yaklaşımlara izin verir; Henüz yapmadıysanız, 'işlevsel programlama'ya bakın.
9000

8

Ben özel durum açıklama, ancak küresel değişkenler kullanarak edemez ise bazen iyi bir çözümdür. Java'nın System sınıfı statik, global değişkenlerle doludur.

Ama genel olarak, haklı olduğunu ve patronunuzun yanlış olduğunu düşünüyorsanız, neden patronunuzdan neden küresel bir değişkenin daha iyi bir çözüm olduğunu düşündüğünü açıklamasını istemiyorsunuz ? "Sevmiyorum" yalın bir ifadesi "küresel değişkenler kötüdür" kadar belirsizdir. Patronunuzdan daha fazlasını talep etmelisiniz!

Duruşu için nedenler veremezse ve duruşunuza nedenler verebilirseniz (ya da tam tersi), o zaman iyi bir öğrenme fırsatıdır. Her ikiniz de duruşlarınızı haklı çıkarabilirseniz, muhtemelen bir zevk meselesi - ya da deneyim meselesi: Patronunuz profesyonel olarak 4 aydan fazla program yapıyor olmalı, sanırım?


1
Bakın, java.lang.Systemtam olarak üç global değişken içerir ve her biri için doğru şekilde ayarlamak için bir yöntem vardır. Ancak Systemküresel nesneleri döndüren statik yöntemlerle doludur ve bununla ilgili yanlış olan hiçbir şey tartışamaz.
9000

2
Evet; Global değişkenleri, global nesneleri döndüren statik yöntemlerle hemen hemen aynı buluyorum.
Joonas Pulakka

Java bunu yapar. Bunun iyi bir fikir olup olmadığı tamamen farklı bir soru . C'nin standart rasgele sayı üreteci küresel durumu korur. Ancak genellikle bunun korkunç olduğu ve rastgele sayı üretecinin belirli uygulamalarda kullanılamaz olduğu kabul edilir (bakınız örn. Bentley ve diğ., Mühendislik bir sıralama işlevi ). Özellikle Java (kısmen C # üzerinde geliştirilmiş) tasarım sorunları bir dizi vardır, bu yüzden böyle bir argüman olarak kullanmak çok dikkatli değilim .
Konrad Rudolph

@Konrald Rudolph: Sonunda bir tasarım kararı. Her kararın artıları ve eksileri vardır. Örneğin, küresel durumu Systembasitleştirmek, örneğin, kullanım örneklerinin% 99,9'unu, geri kalan% 0,1'de sorun yaratma pahasına basitleştirir. % 0,1'in ekstra karmaşıklığa değip değmeyeceğine dair "doğru" bir cevap yoktur.
Joonas Pulakka

5

Pozisyonunuzdaki biri olarak, yapabileceğiniz en iyi şey öğrenmektir. Nesne esasen sabitse (yani değişemez ve durumu korumazsa), patronunuz haklı olabilir. Statik sabit bir nesneye sahip olmanın hiçbir zararı yoktur. Sonuçta, kaç PI tanımı var?

Bazı insanlar “küresel nesne yok” zihniyetini dini bir geleneğe kadar savunurlar. Bu iki nedenden biri için: küresel değişkenlerin / nesnelerin aşırı kullanımı nedeniyle hataları veya sistem kırılganlığını izlemek biraz zor ya da kötü olduğunu duymuşlar ve kendileri için düşünemiyorlar. Ben şahsen kırılganlık ve izleri zor olan bir grup insanın içine düştüm - ama burada da bir denge öğrendim.

Eğer senin yerinde olsaydım, gidip patronun söylediklerini yapardım - sonuçta onun poposu. Sonra bu seçimin etkilerini zaman içinde izler ve görürdüm. Bu etkili bir öğrenme aracıdır.


Bu bir staj. Öğreniyor olmalısın. Körü körüne patronunuzun söylediklerini yapmak öğrenmek değildir.
David Thornley

5
Ne de körü körüne patronunuza karşı çıkmıyor. Tavsiyem, yazıldığı gibi, patronun seçiminin etkilerini gözlemlemekti. Biz (stackexchange'te) hayati bilgileri kaçırdığımız için durum hakkında bir değer yargılayamayız. Bu biraz bilimsel bir yöntem yapmak için bir durum. OP'nin bir hipotezi var, patron buna meydan okudu. Şimdi deneyi yapmanın zamanı geldi.
Berin Loritsch

2

Spesifik duruma bağlı olarak, global bir değişken en iyi çözüm olabilir. Gömülü programlamada, globaller yığın alanını işgal etmiyor ve bu nedenle iyi bir seçim.

Globaller olsun ya da olmasın, ben küresellere bir önek koymak iyi bir uygulama buldum. Bu, diğer programcıların kodunuzu googling yapması, karışıklık durumunda etkinin farkında olacaktır.


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.