C ++ 'da ortak bir büyük harf kullanımı sözleşmesi var mı? [kapalı]


13

Python ve Java'da çok çalışıyorum ve her iki dil de tanımlayıcılarda büyük harf kullanımının nasıl kullanılması gerektiğine dair oldukça yaygın (evrensel olmasa da) kurallara sahip: hem PascalCasesınıf adları hem ALL_CAPSde "global" sabitler için, ancak diğer tanımlayıcılar için Java kodu kullanır mixedCase, Python kodu kullanır underscore_delimiters. Hiçbir dilin veya kütüphanenin belirli bir büyük harf kullanımını zorlamadığını biliyorum , ancak kullandığım dilin standart kurallarına sadık kaldığımda kodumun çok daha okunaklı olduğunu gördüm.

Şimdi C ++ 'da bir projeye başlıyorum ve aynı fikri uygulamak istiyorum. Bilmem gereken en büyük kapitalizasyon sözleşmesi var mı?


CamelCase ile ilgili sorun, önişlemci ile iyi oynamıyor olmasıdır. Büyük bir sorun değil, özellikle önişlemciden genellikle kaçınılabileceğinden.
Pubby

Bu kararla birkaç gün önce yüzleşmek zorunda kaldım. Sonunda, hem standart kütüphane hem de boost underscore_lowercase_delimiters kullandığından, beyinsizdi. Bir STL güçlendirici olarak boost kullandığımdan beri kodum hakkında her şey serpilecek. PascalCase (SFML) kullandığım diğer kütüphaneler daha kolay bir şekilde bulunabilir, böylece verilen herhangi bir yöntem oldukça standarttır.
Max

@ Pubby8: meraktan: CamelCase ön işlemciyle nasıl çatışır?
Joachim Sauer

@JoachimSauer camelCase'deki tek tek sözcüklerin durumu farklı olabilir, ancak makrolar büyük / küçük harf değiştiremez. Bir sözcüğün bağımsız değişken olarak yer aldığı bir makro istiyorsanız bu her iki durumda da argüman olarak sağlamanız gerekebilir: macro (x, X). Bu oldukça küçük bir sorundur, ancak önişlemciyi kullanmayı düşünüyorsanız bilmeniz gerekir.
Pubby

Yanıtlar:


27

Bilmem gereken en büyük kapitalizasyon sözleşmesi var mı?

C ++, C ++ icat edildiğinde bir dizi adlandırma kuralı geliştirecek kadar eski C'ye dayanmaktadır. Sonra C ++ birkaç ekledi ve C de yenilerini düşünmekle atılmadı. Diğer bir deyişle ... C ve C ++ üzerinde arka döllenmiş noktaya, daha da mucidin C adlandırma kuralları geliştirilen birçok C'den türetilmiş diller, buna ekleyin: C ++ sahip bir değil birçok tür sözleşmelerin.

Ancak, bir adlandırma kuralını arıyorsanız , standart kütüphanenin adlandırma kuralına da bakabilirsiniz , çünkü bu, tüm C ++ geliştiricilerinin bilmesi ve alışması gereken tek şeydir.

Ancak, en önemli kuralı ne kullanırsanız kullanın: Tutarlı olun!

İlginç bir şekilde, PascalCase ve camelCase'in bir karışımıyla başladım ve çok daha fazla adlandırma kuralına sahip çok sayıda projede yer alırken, yıllar boyunca standard_library_convention ile daha fazla takıldığımı fark ettim. Bana nedenini sorma.


Bilgi için teşekkürler ... yani standart kütüphane alt çizgi, öyleyse? (en azından her şeyden daha fazla mı?) Bu satırlar boyunca düşünüyordum, ancak iostream gibi, yöntem adlarının yarısının ANSI ile aynı tür bir araya getirilmiş kelime parçaları gibi göründüğü için söylemek zor oldu C :-P
David Z

5
@David: iostreams kütüphanesi muhtemelen 25 yaşında ve (C lib veya ders hariç) C ++ std lib'in en eski kısmı olabilir. İnşallah, sağ akıllarında hiç kimse bunu bugün olduğu gibi tasarlamayacak ve umarım sağ akıllarında olmayanlar bile akış kütüphanesinde kullanıldıkları şekilde tanımlayıcıları seçmeyecektir. (Hadi, adlandırılmış işlevleri vardır egptr, sputnve uflowhem de underflow. Bu sadece komik kullanıyoruz) Neyse, evet, std lib günümüzde all_lowercase_with_underscores kullanır.
sbi

@ iostream kitaplığının artık C ++ için standart bir kitaplık olarak değerlendirilmediğini öğrendim. Ve belirttiğiniz gibi, tanımlayıcıları bir programlama kuralı olarak yararlı değildir ;-)
umlcat

2
@umlcat: iostreams kütüphanesi (C ++ 03 için kabul edildiği şekliyle ayarlanmıştır) kesinlikle C ++ standart kütüphanesinin bir parçası olarak kabul edilir.
sbi

Ben de aynı rotaya indim.Bence neden camelCase yazmak biraz daha kolay olduğunu ve orada tembel olmak istedim. Daha sonra kodumu yazmaktan daha fazla okumak ve yeniden düzenlemek için daha fazla zaman harcadığımı öğrendim ve snake_case'i okumak daha kolay. Yani her şey enerji tüketimini en aza indirmektir. Şimdi sınıflar için küçük harfler kullanarak oynuyorum. Bu alışılmadık, ancak etrafında geçiş ve önemli Örnekler ve küçük harf türleri üstte aslında benim kodun okunabilirliğini artırır düşünüyorum. Sanırım belki de bu yol budur. İnsanca önemli olan şeyleri büyük harflerle yazın.
PSkocik

19

Önce TÜM ÜSTÜN bir göze çarpması olduğunu ve minimize edilmesi gerektiğini kabul edelim.

Bu nedenle C ve C ++ 'da makrolar ve makrolar için bir kural olarak kullanılır, çünkü makrolar kötülük demek değil, aynı derecede çirkindir.

Erken C'nin sabiti yoktu, bu nedenle sabitlerin makro olarak ifade edilmesi gerekiyordu. Ayrıca, bu ilk günlerde programlar çok daha kısaydı, bu yüzden bugün ungood olan uygulamalar kullanılabilirdi (örneğin IIRC Brian Kernighan, çok sayıda büyük harf olmayan makro ile kod yazdı). Ayrıca, o günlerde küçük harfleri olmayan klavyeler vardı; Norveç Tandberg EC-10 bilgisayarında, 1980 veya 1979 yıllarında böyle bir şey kullandım.

Java, C başından itibaren sabitler için büyük konvansiyonu aldı. Bu arada, ve belki de ondan önce (burada kronolojiden emin değilim), C sabitleri aldı. Bununla birlikte, elbette bazı / birçok C programcısı, büyük harf makroları olarak sabitlerin daha önceki gerekliliklerine bağlı kalırken, C ++ programcıları daha mantıklıydı.

Günümüzde en büyük sorun, insanlara önce Java veya önce C (orta çağdan kalma sözleşmelerle) öğretildikten sonra C ++ 'a gelip, o büyük büyük konvansiyonu onlarla almaktır.

Yani,

    int const answer = 42;    // Nice, good, OK.
    const int ANSWER = 0x2A;  // Ouch!
    #define COMPANYNAME_ANSWER 052  // Oh kill me, please.

Jestte sadece büyük harfli klavyelerden bahsettiğimi düşünmüş olabilirsiniz. Oh hayır. Çünkü bu sadece adlandırma kurallarını yönlendiren veya en azından ne kadar yanlış / doğru göründüklerini etkileyen en eski, en arkaik teknoloji sınırlamasıdır. Daha sonra, kullanılan karakter kodları (gazete karakter kodlamaları) ile ilgili sorunlara neden olan 7 bit seri iletim sorunu vardı, bu da kendinizi A'dan Z'ye kadar İngiliz alfabesinin harfleriyle sınırlamanız gerektiği anlamına geliyordu.

Aslında bunu hala tavsiye ederim. İşte buradayız! Daha ileri gitmedik.

Şu anda, 2011'den itibaren standart C ++, genel Unicode'u adlarda destekliyor (ve 1998'den beri yapıyor), ancak gerçek C ++ uygulamaları desteklemiyor. Özellikle g ++ derleyicisi ulusal karaktere meydan okuyor. O karanlık çağlardan teknolojik sınırlama kaynaklanıyor.

Yani,

    double blueberryJamViscosity  = 0.0;    // OK
    double blåbærsyltetøyViskositet = 0.0;  // Ouch!

Son olarak, alt çizgi harfleri ve serpiştirilmiş büyük harflerle ilgili olarak,

  • Tür adları için kolayca tanınan bir form ayırın.
  • TÜM ÜSTÜNÜ makrolar için ayırın.
  • Tutarlı olun.

Gerçekten, "genel olarak tek harfli addan kaçının (loop, template param, blah blah)" ve "l ile kolayca karıştırmayın, 1 ile kolayca karıştırın" ve "büyük O harfinden kaçının, kolayca karıştı" gibi kurallar dışında olduğunu düşünüyorum. 0 "ile. Ayrıca, elbette, alt çizgi ile başlayıp ardından büyük harfle, ardışık iki alt çizgi içeren veya alt çizgiyle başlayıp genel ad alanında olmak gibi ayrılmış adları kullanmaktan kaçının.

Şerefe ve hth


Alf, ISTR Stroustrup , C ++ 'dan D&E C kopyalamasından bahsediyor const, bu yüzden bu çok uzun zaman önce ve Java'dan çok önce, muhtemelen C89 için olmalıydı.
sbi

2
Oh, ve +1"Tutarlı olun!" Bunu okurken, cevabımdaki en önemli kuralı, neden öğrencilerime söylemeyi asla unutmadığımdan bahsetmeyi unuttuğumu merak ediyorum. Sanırım şimdi sonradan düşünülen bir cevap olarak eklersem beni affedersin?
sbi

2

Genellikle dil için mevcut kod tabanlarında en çok gördüğüm sözleşmeye bağlı kalıyorum. C ++ durumunda, genellikle camelCase'i görüyorum. Ruby veya PHP durumunda genellikle stuff_like_this'i görüyorum.

Gerçekçi konuşmak gerekirse, en önemli şey, tamamen çılgın olmayan bir stil kuralı seçmeniz (dOnT_dO_tHiS) ve onunla tutarlı olmanızdır. Stili belirli bir proje için kod boyunca değişmeyecek şekilde yapın. Mevcut bir proje üzerinde çalışıyorsanız, zaten orada olan stile gitmek istersiniz.


1

Eh, orada Sistemleri Macar şimdi bile gerçekten yaygın olan ama bunu tavsiye daha doğrusu kendi boğazını kesti ederim. Ek açıklama işaretleri anlambilimin gerçek bir göstergesi olduğu için Uygulamalar Macarca daha iyidir, ancak kısa bir kelimenin yapacağı kısaltmalar için biraz fazla hevesli olduğunu hissediyorum. (Bu Wikipedia sayfasındaki örneği kullanmak rwiçin , neden rowyalnızca bir karakter daha uzunken satır için kullanıyorsunuz ? Küresel bir sesli harf kıtlığı yok gibi değil.)

Gerçekçi olmakla birlikte, en önemli şey birlikte çalıştığınız insanların kurallarına uymaktır . Gerçekten mi. Çoğu sözleşme, özellikle sürekli kullanıldığında, yeterince iyi çalışır. Tutarsızlık en kötüdür (nefret ettiğim Sistem Macarca'dan bile daha fazla). Eğer kendi başınıza iseniz, istediğinizi kullanın.


1

Gördüğüm kadarıyla, projeler arasında değişiyor.

Gömülü alt çizgiler muhtemelen daha geleneksel / Unix'teki C'de daha yaygın olarak kullanılır. Standart kütüphane de bunu takip eder, bu nedenle bu konvansiyonu kesinlikle zorlamak için başka bir konvansiyon kullanan yeterli kod mevcut değilse, kesinlikle kesinlikle varsayılan olarak ele alınmalıdır .

Windows (bir örnek için) çoğu işlevi için deve kasası kullanır, bu nedenle Windows için geliştiren birkaç kişi de aynı şeyi yapar. Bu, diğer dillere gerçekten alışkın olan insanlar arasında da oldukça yaygındır ve C ++ 'ya başka bir şeyin tuhaf bir varyantı gibi davranmaya çalışır.


1

Adlandırma kuralları için referans olarak hem standart kütüphane hem de boost kullandım. Ancak, bu çözümle ilgili bir sorun var.

Standart kütüphane, kodunuzla çakışmaları azaltmak için tasarlanmış bir adlandırma kuralı kullanır. Çözümün bir kısmı tüm küçük harfleri kullanmaktır. Bu nedenle camelCase yerine alt çizgi kullanımı.

Ben camelCase okunabilir buluyorum. PascalCase, sınıf isimlerinde genellikle uygun bir ismin eşdeğerini temsil ettiği için kullanılır. Bununla birlikte, bir fiili daha temsil eden functors için bu kuralı ihlal edeceğim.

Makroları kullanmamaya çalışıyorum. Ancak bunu yaptığımda, makrolar mümkün olduğunda işlevler gibi görünecek şekilde yapılır. Ayrıca, manifest sabitleri yerine const değerlerini veya numaralandırmaları da kullanıyorum, ayrıca tüm büyük harflerden kaçınıyorum. Genellikle sabit olduklarını belirtmek için bu simgelerin önüne "k" eklerim.

// instead of a manifest constant
#define HOURS 24

// use const
const int kHours = 24; 

// or enum
enum {
    kHours   = 24,
    kMinutes = 60
};

0

Bu referans , geçmişte çalıştığım en az üç şirkette başarıyla kullanıldığını gördüğüm bir adlandırma kuralını açıklıyor.

Ben ediyorum önceki bir cevap aksine önlemek , kendi kodunda C ++ Standart Kütüphanesi adlandırma aşağıdaki Standart Kitaplığı ile önlemek adı çarpışmaları etmekten başka bir nedenden dolayı eğer.

İlgili bir konuyla ilgili önceki SO yanıtı da ilgi çekici olabilir: /programming/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier


Umm, aynı adları kullanarak olmadan aynı isimleri kullanabilirsiniz ... ve gerçekten aynı ad istediğinizde, yine de örneğin ad tarafından korunuyorlar std::stringvs gnawme::string.
einpoklum
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.