Programımın kullandığı bir grup sabiti saklamanın en iyi yolu nedir? [kapalı]


98

Programımın kullandığı çeşitli sabitlerim var ... string's, int' s, double's, vb ... Bunları saklamanın en iyi yolu nedir? EnumVeri istediğimi sanmıyorum çünkü verilerin hepsi aynı türde değil ve her bir değeri manuel olarak ayarlamak istiyorum. Hepsini boş bir sınıfta mı saklamalıyım? Yoksa daha iyi bir yol var mı?


18
İstediğin şekilde - ihtiyacın olan bu.
San Jacinto

Yanıtlar:


136

Muhtemelen bunlara statik salt okunur özelliklerle statik bir sınıfta sahip olabilirsiniz.

public static class Routes
{
    public static string SignUp => "signup";
}

23
+1, ancak bunları yerelleştirme için bir kaynak dosyasından çekebilirseniz daha da iyi.
Joel Coehoorn

17
Biraz kelime gibi görünüyor - neden statik salt okunur dizeler olmasın?
emptyset

6
Neden const değil de salt okunur? Değeri çalışma zamanında ayarlamıyorsunuz, bu nedenle onları salt okunur olarak ayarlamanıza gerek yok.
Philip Wallace

93
Const ile ilgili sorun, const'lara karşı derlenen tüm derlemelerin kendileri derlendiklerinde bu sabitlerin yerel kopyalarını almalarıdır; bu nedenle, bir değeri değiştirirseniz, sabitleri tanımlayan derlemenize bağlı olarak tüm derlemeleri yeniden derlemeniz gerekir - bu nedenle salt okunur yola gitmek genellikle daha güvenlidir. Genel statik değerler yerine özellikler, arabirimi sabit değerlerinizle değiştirmeden, gelecekte ihtiyaç duyduğunuzda (yani yerelleştirmeden okuma) bazı programlama mantığı ekleme esnekliği sağlar.
cfeduke

13
Şeytanın avukatı olarak, const'ın avantajının, onu anahtar durumlarda kullanabilmeniz olduğuna işaret etmeliyim.
arviman

27

Sabitlerle dolu bir sınıf kullanan IMO, sabitler için iyidir. Ara sıra değişeceklerse, bunun yerine yapılandırmanızda ve ConfigurationManager sınıfında AppSettings kullanmanızı öneririm.

Aslında AppSettings veya benzerinden alınmış "sabitler" olduğunda, okumayı yapılandırma yöneticisinden saran bir "sabitler" sınıfına sahip olacağım. Söz konusu ayar değerini tüketmek isteyen herhangi bir yere Constants.SomeModule.Settingdoğrudan başvurmak yerine sahip olmak her zaman daha anlamlıdır ConfigurationManager.AppSettings["SomeModule/Setting"].

Bu kurulum için bonus puanlar, SomeModulebüyük olasılıkla Sabitler dosyasında yuvalanmış bir sınıf olacağından, Dependency Injection'ı SomeModuledoğrudan ona bağlı sınıflara enjekte etmek için kolayca kullanabilirsiniz . SomeModuleÜstüne bir arabirim bile çıkarabilir ve ardından ISomeModuleConfigurationtüketen kodunuzda bir bağımlılık yaratabilirsiniz , bu daha sonra Sabitler dosyalarına bağımlılığı ayırmanıza ve hatta özellikle bu ayarlar AppSettings'den geliyorsa testi kolaylaştırmanıza olanak tanır ve ayarlar ortama özel olduğu için bunları yapılandırma dönüşümlerini kullanarak değiştirirsiniz.


1
Sadece buna ek olarak: bunun nedeni, inşa ettiğinizde diğer montajlarda kullanılan sabitlerin güncellenmemesidir. Bu, AssemblyA ve AssemblyB'ye sahipseniz ve B'nin A'dan bir sabit kullanması durumunda, değerin kopyalanacağı, referans alınmayacağı anlamına gelir; bu nedenle, yeniden oluşturma A, B'yi güncellemeyecektir. Bu, garip hatalara yol açabilir.
Camilo Martin

1
@CamiloMartin bunu halletmenin birçok yolu var, "sabitleriniz" bundan kaçınmak için sadece statik salt okunur olabilir veya dediğim gibi bir mavi ayda birden fazla kez ConfigurationManager'ı kullanmak için değiştirirlerse.
Chris Marisic

Evet, ben sadece bunun sadece statik salt okunur kullanmanız gerektiği için değil, aslında bir kafa karışıklığı kaynağı olabileceği için olduğunu söylüyordum. Ayrıca, ConfigurationManager'a bir alternatif kaynak dosyalarıdır - adında bir dil kodu olan başka bir kaynak dosyası eklemeniz yeterlidir ve kodunuz anında yerelleştirilir.
Camilo Martin

sorun şu ki, bu derlemeye diğer derlemelerden başvurduğunuzda, değerleri yapılandırma dosyalarına kopyalamanız gerekecek
symbiont

@symbiont, eğer isterseniz, üçüncü taraf bir bileşen olarak paylaşılabilirlik için, yapılandırma dosyalarını yerleştirebilir ve bunları manifest'ten okuyabilirsiniz
Chris Marisic

19

Yapmaktan hoşlandığım şey şudur (ancak doğru türde sabitleri kullanmak için sonuna kadar okuduğunuzdan emin olun ):

internal static class ColumnKeys
{
    internal const string Date = "Date";
    internal const string Value = "Value";
    ...
}

Neden constistediğiniz gibi olmayabileceğini öğrenmek için bunu okuyun . Olası sabit türleri şunlardır:

  • constalanlar. Arasında derlemeler kullanmayın ( publicveya protected) değeri ise belki değer bu diğer meclislerinde derleme zamanında sabit şekilde çünkü gelecekte değişebilir. Değeri değiştirirseniz, eski değer diğer derlemeler tarafından yeniden derlenene kadar kullanılır.
  • static readonly alanlar
  • static mülkiyet olmadan set

1
Birden çok derlemede kullanılıyorsa neden salt okunur?
Philip Wallace

Neden statik salt okunur birden çok derlemede const'tan daha iyi çalışıyor?
Matthew

15
Const değerleri, kaynak derlemeden derlenen koda kopyalanır. Bu, bir const değerini değiştirmeniz gerekiyorsa, tüm bağımlı derlemelerin yeni sürüme göre yeniden derlenmesi ZORUNLU olduğu anlamına gelir. Statik salt okunurları kullanmak daha güvenli ve daha rahat.
cfeduke


11

IMO'nun en iyi yolu budur. Özelliklere gerek yok veya salt okunur:

public static class Constants
{
   public const string SomeConstant = "Some value";
}

9
Const kullanacaksanız, yalnızca dahili olarak gösterin. Const'ı halka açık hale getirmeyin (toplantılarınızın kuruluşunuzun dışında kullanılmayacağını düşünseniz bile). Ayrıca özellikler, arabiriminizi yeniden tanımlamanıza gerek kalmadan gelecekteki genişletmeler için size programatik esneklik sağlar.
cfeduke

4

Boş bir statik sınıf uygundur. Birkaç sınıf kullanmayı düşünün, böylece tek bir dev Globals.cs dosyası yerine iyi ilgili sabit gruplarına sahip olursunuz.

Ek olarak, bazı int sabitleri için gösterimi göz önünde bulundurun:

[Flags]
enum Foo
{
}

Bu , değerlere bayraklar gibi davranılmasına izin verir .


"Birkaç sınıf kullanmayı düşünün, böylece tek bir dev Globals.cs dosyası değil, iyi ilgili sabit gruplarına sahip olursunuz." Bunun en iyi tavsiye olduğuna inanıyorum, bunun etrafında bazı tasarım modelleri yok mu? Ben ismen bilmiyorum, değil mi?
greg

3

Web.config veya app.config kullanmak için başka bir oy. Yapılandırma dosyaları, bağlantı dizeleri vb. Gibi sabitler için iyi bir yerdir. Bu tür şeyleri görüntülemek veya değiştirmek için kaynağa bakmamayı tercih ederim. Bu sabitleri bir .config dosyasından okuyan bir statik sınıf, uygulamanızın bu kaynaklara kodda tanımlanmış gibi erişmesine izin vereceği, ancak yine de size bunları kolayca görüntülenebilir / düzenlenebilir bir Uzay.


2
Bir bağlantı dizesi sabit değildir, bir ayardır. OP , sabitler yerine gerçekten ayarlar anlamına gelebilir , ancak bunun için herhangi bir kanıt göremiyorum.
Jon Skeet

Naçizane size katılmıyorum. Dize değişmezleri, tanım gereği sabitlerdir. Bir yapılandırma dosyasında dizeyi değiştirmek, kabaca onu kodda değiştirmeye ve yeniden derlemeye eşdeğerdir; Would bir sabit değil yapmak? Ben öyle düşünmüyorum.
3

2
@David - Doğru değil. Bir derleyici, yapılandırma dosyanızda hangi değere sahip olduğunuzla ilgilenmez - bu çalışma zamanında okunur.
Philip Wallace

@PhilipW Bunu anlıyorum. Demek istediğim, (Jon Skeet'in yorumuna yanıt olarak) belirli bir bağlantı dizesinin, tüm dizgi değişmezleri gibi sabit olmasıdır. Yapılandırma dosyasını değiştirerek ve uygulamanızın söz konusu yapılandırma dosyasından yeni değeri çekmesini sağlayarak veya yeniden derleme / dağıtım gerektiren koddaki değişmez değeri değiştirerek "sabit" in değiştirilebilmesi gerçeği - bunu bir "ayar" yapın. Dizenin kendisi, kapsayıcısından bağımsız olarak sabittir. Anlıyorum ve fikrinize katılıyorum - sadece söylediğim şey bu değildi.
3

1
Deneyimlerime göre, öngörülemeyen gelecekte bir noktada, "sabit" değerinizin bir milyon yıl sonra asla olmayacağını düşünseniz bile değişmesi gerekecek. Bunun bir .config dosyasında kaynak kodunu değiştirmekten çok daha kolay olduğunu düşünüyorum. Sonunda her şey bir ortam haline gelir.
NinjaBomb

1

Evet, static classsabitleri depolamak için, belirli türlerle ilgili sabitler dışında, yeterli olacaktır.


Ben de tam olarak bunu yapmaya çalışıyorum. Onların ait oldukları sınıfın üyeleri olarak görünmelerini istiyorum. ama onları sınıflara eklemek istemiyorum çünkü sabitler işi yaptığım şirkete göre değişiyor. uzantı sabitleri veya özellikleri hakkında henüz bir şey bulamadım. ama bu fikirden vazgeçebilirim çünkü bu sınıfları serileştirdiğimde onların üye olarak görünmesini istemiyorum
symbiont

0

Bu Sabitler, uygulama davranışını etkileyen hizmet referansları veya anahtarlarsa, bunları Uygulama kullanıcı ayarları olarak ayarlardım. Bu şekilde, değiştirilmeleri gerekiyorsa, yeniden derlemenize gerek kalmaz ve yine de statik özellikler sınıfı aracılığıyla bunlara başvurabilirsiniz.

Properties.Settings.Default.ServiceRef

0

Statik sınıfı salt okunur olarak öneririm. Lütfen aşağıdaki kod parçasını bulun:

  public static class CachedKeysManager
    {
        public static readonly string DistributorList = "distributorList";
    }
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.