Sık sık görüyorum m_Öğreticilerde, örneklerde ve çoğunlukla oyun geliştirmeyle ilgili diğer kodlarda değişkenler için ( m_World,, m_Sprites...) kullanılan ön ekleri .
İnsanlar neden m_değişkenlere önek ekler ?
Sık sık görüyorum m_Öğreticilerde, örneklerde ve çoğunlukla oyun geliştirmeyle ilgili diğer kodlarda değişkenler için ( m_World,, m_Sprites...) kullanılan ön ekleri .
İnsanlar neden m_değişkenlere önek ekler ?
m_, ancak buradaki yanıtların yarısı neden herkesin şu anki favorilerinin en iyisi olduğunu düşündüğüne dair bir yorum.
Yanıtlar:
Bu, üye değişkenler olan değişkenleri tanımlamak için tipik bir programlama uygulamasıdır. Bu yüzden, onları daha sonra kullanırken, kapsamlarını bilmek için nerede tanımlandıklarını görmenize gerek yok. Bu, kapsamı zaten biliyorsanız ve intelliSense gibi bir şey kullanıyorsanız , ile başlayabilirsiniz m_ve tüm üye değişkenlerinizin bir listesi gösterilir. Macar notasyonunun bir kısmı, buradaki örneklerde kapsamla ilgili kısma bakın .
m_her ikisinin de önekli üye değişkenleri oluşturmasını gerçekten zorlayamazsınız .
In Temiz Kodu: Çevik Yazılım El Sanatları isimli Elkitabı bu önek kullanımı karşı açık bir öneri yoktur:
Ayrıca
m_artık üye değişkenlerine önek eklemenize de gerek yok. Sınıflarınız ve işlevleriniz, onlara ihtiyacınız olmayacak kadar küçük olmalıdır.
Bunun bir örneği (C # kodu) da vardır:
Kötü uygulama:
public class Part
{
private String m_dsc; // The textual description
void SetName(string name)
{
m_dsc = name;
}
}
İyi pratik:
public class Part
{
private String description;
void SetDescription(string description)
{
this.description = description;
}
}
Biz açıkça belirsizlik (durumunda üye değişkenleri başvurmak için dil yapıları ile saymak yani , descriptionüye ve descriptionparametre): this.
C ++ 'da yaygın bir uygulamadır. Bunun nedeni, C ++ 'da üye işlevi ve üye değişkeni için aynı ada sahip olamamanız ve alıcı işlevlerin genellikle "get" öneki olmadan adlandırılmasıdır.
class Person
{
public:
std::string name() const;
private:
std::string name; // This would lead to a compilation error.
std::string m_name; // OK.
};
main.cpp:9:19: error: duplicate member 'name' std::string name; ^ main.cpp:6:19: note: previous declaration is here std::string name() const; ^ 1 error generated.
"Üye" için "m_" durumu. "_" Öneki de yaygındır.
Farklı kurallar / dilbilgisi kullanarak bu sorunu çözen programlama dillerinde kullanmamalısınız.
m_Önek genellikle üye değişkenler için kullanılır - Ben onun ana avantajı bir kamu mallarının ve özel üye değişkeni destek o arasında kesin bir ayrım oluşturmaya yardımcı olduğunu düşünüyorum:
int m_something
public int Something => this.m_something;
Yedek değişkenler için tutarlı bir adlandırma kuralına sahip olmaya yardımcı olabilir ve m_önek, bunu yapmanın bir yoludur - büyük / küçük harfe duyarlı olmayan dillerde çalışan bir yöntemdir.
Bunun ne kadar yararlı olduğu, kullandığınız dillere ve araçlara bağlıdır. Güçlü yeniden düzenleme araçlarına ve intellisense'e sahip modern IDE'lerin bunun gibi kurallara daha az ihtiyacı vardır ve kesinlikle bunu yapmanın tek yolu bu değildir, ancak her durumda uygulamanın farkında olmaya değer.
this.Kendi dilinizde yazmanız gerekiyorsa, o m_zaman gerçekten işe yaramaz.
m_, onu desteklediği mülkten ayırmaktır - yani this.Somethingmülk this.m_somethingve destekleyici üye için. Bu, kendimi tercih ettiğim bir kongre değil, ancak çoğunlukla büyük / küçük harfe duyarlı olmayan dillerde (VB gibi) kullanıldığını gördüm.
this.Somethingmülk this.somethingiçin ve destek için olmasın ? Veya this._somethingdestek için? this.m_somethinggereksizdir. Kullandığım _somethingben yazmaya gittiğimde kaza onu yazmayın böylece Somethingmembershipness ile ya da değil yapmak, hiçbir şey
_kendi başına bir önek işi halledebilirdi, ama m_kuraldır. Kişisel olarak kullanacağım bir şey değil, ama kodda görürseniz yazarın amacı buydu.
Diğer cevaplarda da belirtildiği gibi m_önek, bir değişkenin sınıf üyesi olduğunu belirtmek için kullanılır. Bu, Macar gösteriminden farklıdır çünkü değişkenin türünü değil, içeriğini gösterir.
m_C ++ 'da kullanıyorum , ancak' bu 'veya' kendinin 'zorunlu olduğu diğer bazı dillerde kullanmıyorum . Kodu karıştırdığı için 'this->' nin C ++ ile kullanıldığını görmekten hoşlanmıyorum.
Başka bir cevap diyor m_dsc da "kötü uygulama" ve "açıklama" dır; "iyi bir uygulama" ama bu bir kırmızı ringa balığı çünkü sorun kısaltmadır.
Başka bir cevap, yazmanın thisIntelliSense'i açtığını söylüyor, ancak herhangi bir iyi IDE'nin mevcut sınıf üyeleri için IntelliSense'i açmak için bir kısayol tuşu olacak.
m_descriptionvs olacaktır description.
Lockheed Martin, özellikle başkalarının kodunu okurken birlikte çalışması harika olan 3 önekli bir adlandırma şeması kullanıyor.
Scope Reference Type(*Case-by-Case) Type
member m pointer p integer n
argument a reference r short n
local l float f
double f
boolean b
Yani...
int A::methodCall(float af_Argument1, int* apn_Arg2)
{
lpn_Temp = apn_Arg2;
mpf_Oops = lpn_Temp; // Here I can see I made a mistake, I should not assign an int* to a float*
}
Değeri ne olursa olsun al.
Diğer birçok yanıtta belirtildiği gibi, m_, üye değişkenleri belirten bir önektir. C ++ dünyasında yaygın olarak kullanılır / kullanıldı ve Java dahil diğer dillere de yayıldı.
Modern bir IDE'de, sözdizimi vurgulaması, hangi değişkenlerin yerel ve hangilerinin üye olduğunu açıkça ortaya koyduğundan, tamamen gereksizdir . Bununla birlikte, sözdizimi vurgulaması 90'ların sonlarında ortaya çıktığında, sözleşme uzun yıllardır ortalıktaydı ve sağlam bir şekilde ayarlandı (en azından C ++ dünyasında).
Hangi öğreticilere atıfta bulunduğunuzu bilmiyorum, ancak iki faktörden biri nedeniyle kuralları kullandıklarını tahmin edeceğim:
Mevcut cevapları tamamlamak için ve soru dile özgü olmadığından, bazı C-projeleri m_, bir dosyaya özgü g_genel değişkenleri ve tanımlandıkları dosyadan daha büyük kapsamı olan genel değişkenleri tanımlamak için öneki kullanır .
Bu durumda önek ile tanımlanan global değişkenler m_ olarak tanımlanmalıdır static.
Bkz EDK2 (UEFI Açık Kaynak uygulaması) kodlama kongre bu kuralını kullanarak projenin bir örnek için.