Çoğunlukla büyük uygulamalarımızda, genellikle "sabitler" için yalnızca birkaç yerimiz vardır:
- GUI ve iç kalıcılar için bir sınıf (Sekme Sayfa başlıkları, Grup Kutusu başlıkları, hesaplama faktörleri, numaralandırmalar)
- Veritabanı tabloları ve sütunları için bir sınıf (bu bölüm kod oluşturulur) artı bunlar için okunabilir adlar (el ile atanır)
- Uygulama mesajları için bir sınıf (günlüğe kaydetme, mesaj kutuları vb.)
Sabitler genellikle bu sınıflarda farklı yapılara ayrılır. C ++ uygulamalarımızda, sabitler yalnızca .h dosyasında tanımlanır ve değerler .cpp dosyasına atanır.
Avantajlarından biri, tüm dizgilerin vb. Tek bir merkezi yerde olması ve herkes bir şeyin değiştirilmesi gerektiğinde onları nerede bulacağını bilmesidir.
Bu, özellikle proje yöneticilerinin insanlar gelir ve gider gibi göründüğü bir şeydir ve bu şekilde herkes bu önemsiz şeyleri uygulamanın yapısına girmeden değiştirebilir.
Ayrıca, benzer Grup Kutuları / Sekme Sayfaları vb. Unvanını bir kerede kolayca değiştirebilirsiniz. Diğer bir husus, sadece bu sınıfı yazdırabilir ve başlıkları sezgisel olup olmadığını ve kullanıcıya gönderilen iletilerin çok ayrıntılı veya kafa karıştırıcı vb. Olup olmadığını kontrol edebilecek bir programcıya veremezsiniz.
Ancak bazı dezavantajları görüyorum:
- Her bir sınıf, sabit sınıflara sıkıca bağlıdır
- Bir sabit ekleme / çıkarma / yeniden adlandırma / taşıma, uygulamanın en az% 90'ının yeniden derlenmesini gerektirir (Not: Değerin değiştirilmesi, en azından C ++ için değildir). 1500 sınıflı C ++ projelerimizden birinde bu, yaklaşık 7 dakika derleme süresi (önceden derlenmiş başlıkları kullanarak; onlarsız yaklaşık 50 dakika) artı belirli statik kütüphanelere karşı yaklaşık 10 dakika bağlantı anlamına gelir.
- Visual Studio Compiler ile hıza göre optimize edilmiş bir sürüm oluşturmak 3 saate kadar sürebilir. Sınıf ilişkilerinin büyük miktarda kaynak olup olmadığını bilmiyorum ama olabilir.
- Geçici olarak kodlama yapan dizgilere doğrudan koda girersiniz, çünkü bir şeyi çok hızlı bir şekilde test etmek ve sadece bu test için (ve muhtemelen her biri için) 15 dakika beklemek istemezsiniz. "Bunu daha sonra düzelteceğim" deyince herkes bilir.
- Bir sınıfın başka bir projede tekrar kullanılması her zaman bu kadar kolay değildir (özellikle diğer sıkı bağlantılardan dolayı, ancak sabit kullanım kolay değildir.)
Böyle sabitleri nerede saklardın? Ayrıca, proje yöneticinizi yukarıda sıralanan avantajlara da uyan daha iyi kavramlar olduğuna ikna etmek için hangi argümanları getirdiniz?
C ++ 'a özgü veya bağımsız bir cevap vermekten çekinmeyin.
Not: Bu sorunun öznel olduğunu biliyorum ama dürüst olmak gerekirse, bu tür bir soru için bu siteden daha iyi bir yer bilmiyorum.
Bu projede güncelleme
Derleme zamanı
olayıyla ilgili haberlerim var: Caleb ve gbjbaanb'ın gönderilerinin ardından, zamanım olduğunda sabit dosyamı diğer birkaç dosyaya böldüm. Sonunda projemi, artık çok daha kolay olan birkaç kütüphaneye böldüm. Serbest bırakma modunda derlemek, veritabanı tanımlarını içeren otomatik olarak oluşturulan dosyanın (tablo, sütun adları ve daha fazlası - 8000'den fazla simge) ve serbest bırakma modunda devasa derleme sürelerine neden olan belirli karmaları oluşturduğunu gösterdi.
MSVC'nin DB sabitlerini içeren kütüphane için optimize edicisini devre dışı bırakmak artık Projenizin toplam derleme süresini (birkaç uygulama) sürüm modunda 8 saate bir saate düşürmemizi sağladı!
MSVC'nin neden bu dosyaları optimize etmek için bu kadar zor zamana sahip olduğunu henüz bulamadık, ancak şimdilik bu değişiklik artık yalnızca gecelik yapılara dayanmak zorunda olmadığımız için büyük bir baskı oluşturuyor.
Bu gerçek - ve daha az sıkı eşleşme, daha iyi tekrar kullanılabilirlik vb. Gibi diğer faydalar - "sabitleri" bölmek için harcanan zamanın sonuçta kötü bir fikir olmadığını gösterdi ;-)
Update2
Bu soruya hala dikkat çekildiğinden:
Son birkaç yıldır yaptığım şey:
Her değişkeni, değişkeni, vb. Bununla tamamen ilgili olan kapsamı içine koyun: Bir sabiti yalnızca tek bir yöntemde kullanırsanız, onu bu yöntemde tanımlamanız uygundur. Tek bir sınıf ilgileniyorsa, o sınıfı özel bir uygulama detayı olarak bırakın. Aynısı isim alanı, modül, proje ve şirket kapsamı için de geçerlidir. Aynı işlevi yardımcı fonksiyonlar ve benzerleri için de kullanıyorum. (Genel bir çerçeve geliştirirseniz, bu% 100 uygulanmaz.)
Bunu yaparak yeniden kullanılabilirliği, test edilebilirliği ve bakımını yalnızca derlemeye daha az zaman harcayamayacağınız bir dereceye kadar (en azından C ++) değil, aynı zamanda hata ayıklama konusunda daha az zaman vererek, aslında yeni özellikler geliştirmek için daha fazla zaman harcarsınız. Aynı zamanda, bu özellikleri geliştirmek daha hızlı çalışacaktır çünkü daha fazla kodu daha kolay kullanabilirsiniz. Bu, merkezi sabitlerin büyük bir olasılıkla sahip olabileceği herhangi bir avantajdan daha ağır basar.
Daha fazla bilgi için özellikle Arayüz Ayrıştırma İlkesine ve Tek Sorumluluk İlkesine bir göz atın .
Kabul ederseniz, Caleb'in cevabını oylayın, çünkü bu güncelleme temel olarak söylediklerinin daha genel bir parçası.