Hepsi iyi yapılmış öneklerden yanayım .
Bence (Sistem) Macar notasyonu, öneklerin aldığı "kötü rap" in çoğundan sorumludur.
Bu gösterim, büyük ölçüde yazılan dillerde (örneğin C ++ "lpsz"), dizenizin boş bir sonlandırılmış dizeye uzun bir işaretçi olduğunu söylemek için büyük ölçüde anlamsızdır: char dizileri ve "customerName" bir dize olduğunu bilmek o kadar da zor değil!
Ancak, Sistem Macarca ile kötü ve haksız bir ilişkisi olması nedeniyle Macarca terimden kaçınmayı tercih etsem de , bir değişkenin (esas olarak "Apps Macarca" kullanımını belirtmek için önekleri kullanıyorum ve bu çok kullanışlı bir zaman tasarrufu ve hata azaltıcı yaklaşım.
Kullanırım:
- üyeler için m
- Sabitler / readonly'ler için c
- işaretçi için p (ve işaretçi-işaretçi için pp)
- uçucu için v
- statik için s
- dizinler ve yineleyiciler için i
- e olaylar için
Türü açık hale getirmek istediğimde , standart ekler kullanıyorum (örneğin, List, ComboBox, vb.).
Bu, programcı değişkeni her gördüğünde / kullandığında kullanımından haberdar eder. Muhtemelen en önemli durum işaretçi için "p" dir (çünkü kullanım var. 'Dan var->' a değişir ve işaretçiler - NULL, işaretçi aritmetiği vb. İle çok daha dikkatli olmanız gerekir), ancak diğerleri çok kullanışlıdır.
Örneğin, aynı değişken adını tek bir işlevde birden çok şekilde kullanabilirsiniz: (burada bir C ++ örneği, ancak birçok dile eşit olarak uygulanır)
MyClass::MyClass(int numItems)
{
mNumItems = numItems;
for (int iItem = 0; iItem < mNumItems; iItem++)
{
Item *pItem = new Item();
itemList[iItem] = pItem;
}
}
Burada görebilirsiniz:
- Üye ve parametre arasında karışıklık yok
- Dizin / yineleyici ve öğeler arasında karışıklık yok
- "Count", "index" gibi genel (belirsiz) adların birçok tuzağından kaçınan, açıkça ilişkili değişkenlerin (öğe listesi, işaretçi ve dizin) kullanılması.
- Ön ekler "itemIndex" ve "itemPtr" gibi alternatiflere göre yazmayı azaltır (daha kısa ve otomatik tamamlama ile daha iyi çalışır)
"İName" yineleyiciler başka bir büyük nokta ben asla yanlış dizine sahip bir dizini dizin ve başka bir döngü içinde bir döngü kopyalarsanız döngü dizin değişkenlerinden birini yeniden düzenlemek zorunda değilsiniz.
Bu gerçekçi olmayan basit örneği karşılaştırın:
for (int i = 0; i < 100; i++)
for (int j = 0; j < 5; j++)
list[i].score += other[j].score;
(bu okunması zordur ve genellikle "j" nin amaçlandığı yerde "i" nin kullanılmasına yol açar)
ile:
for (int iCompany = 0; iCompany < numCompanies; iCompany++)
for (int iUser = 0; iUser < numUsers; iUser++)
companyList[iCompany].score += userList[iUser].score;
(çok daha okunabilir ve indeksleme konusundaki tüm karışıklıkları ortadan kaldırır. Modern IDE'lerde otomatik tamamlama ile bu da hızlı ve kolay bir şekilde yazılır)
Bir sonraki avantaj, kod snippet'lerinin herhangi bir bağlam gerektirmemesidir anlaşılması . Bir e-postaya veya belgeye iki satır kod kopyalayabilirim ve bu parçacığı okuyan herkes tüm üyeler, sabitler, işaretçiler, dizinler vb. Arasındaki farkı söyleyebilir. Eklemek zorunda değilim "oh, ve dikkatli ol çünkü 'data' bir işaretçiye işaretçi "dir, çünkü buna 'ppData' denir.
Aynı nedenden dolayı, anlamak için gözlerimi bir kod satırının dışına taşımak zorunda değilim. 'Veri' yerel, parametre, üye veya sabit olup olmadığını bulmak için kod aramak zorunda değilsiniz. İşaretçiyi 'veri' üzerine getirip sonra bir araç ipucunun (bazen hiçbir zaman görünmez) görünmesini beklemek için elimi fareye taşımak zorunda değilim. Böylece programcılar kodu önemli ölçüde daha hızlı okuyabilir ve anlayabilirler , çünkü yukarı ve aşağı arama ya da beklemek için zaman kaybetmezler.
(İşleri yapmak için yukarı aşağı arama yaptığınızı düşünmüyorsanız, bir yıl önce yazdığınız ve o zamandan beri bakmadığınız bazı kodları bulun. Dosyayı açın ve okumadan yaklaşık yarım adım atlayın. Bir şeyin üye, parametre veya yerel olup olmadığını bilmeden önce bu noktadan okuyabilirsiniz.Şimdi başka bir rastgele yere atlayın ... Bu, başka bir kişinin kodundan tek adım attığımızda gün boyu yaptığımız şeydir. veya işlevlerini nasıl arayacağınızı anlamaya çalışmak)
'M' öneki ayrıca (IMHO) çirkin ve garip "this->" gösterimini ve garanti ettiği tutarsızlığı da önler (dikkatli olsanız bile, genellikle 'this-> data' karışımı ile sonuçlanır ve 'data' aynı sınıfta, çünkü hiçbir şey adın tutarlı bir şekilde yazılmasını zorunlu kılmaz).
'Bu' gösterimin belirsizliği gidermesi amaçlanmıştır - ancak neden birisi kasıtlı olarak belirsiz olabilecek kod yazsın? Belirsizlik olacak er ya da geç bir hata neden olur. Ve bazı dillerde 'bu' statik üyeler için kullanılamaz, bu nedenle kodlama stilinizde 'özel durumlar' tanıtmanız gerekir. Her yerde geçerli olan açık, açık ve tutarlı tek bir basit kodlama kuralına sahip olmayı tercih ederim.
Son büyük fayda Intellisense ve otomatik tamamlama. Bir olay bulmak için Windows Formunda Intellisense'i kullanmayı deneyin - olayları bulmak için asla çağırmanız gerekmeyen yüzlerce gizemli temel sınıf yönteminde gezinmeniz gerekir. Ancak her etkinliğin "e" öneki olsaydı, otomatik olarak "e" altındaki bir grupta listelenirdi. Böylece ön ek, intellisense listesindeki üyeleri, constsları, olayları vb. Gruplamak için çalışır ve böylece istediğiniz adları bulmayı çok daha hızlı ve kolay hale getirir. (Genellikle, bir yöntemin kapsamı içinde erişilebilir olan yaklaşık 20-50 değeri (yerel halk, params, üyeler, consts, olaylar) olabilir. Ama öneki yazdıktan sonra (şimdi bir dizin kullanmak istiyorum, bu yüzden 'i yazıyorum. .. '), yalnızca 2-5 otomatik tamamlama seçeneği sunulur.
Tembel bir programcıyım ve yukarıdaki sözleşme bana çok fazla iş kazandırıyor. Daha hızlı kod yazabilirim ve çok daha az hata yaparım çünkü her değişkenin nasıl kullanılması gerektiğini biliyorum.
Karşı argümanlar
Peki, eksileri nelerdir? Öneklere karşı tipik argümanlar şunlardır:
"Önek şemaları kötü / kötü" . Kabul ediyorum "m_lpsz" ve ilk kötü düşünülmüş ve tamamen işe yaramaz. Bu nedenle, bağlamınız için uygun olmayan bir şeyi kopyalamak yerine, gereksinimlerinizi desteklemek için tasarlanmış iyi tasarlanmış bir gösterim kullanmanızı öneririm. (İş için doğru aracı kullanın).
"Bir şeyin kullanımını değiştirirsem yeniden adlandırmam gerekir" . Evet, elbette öyle yapıyorsunuz, yeniden düzenleme her şeyle ilgili ve IDE'lerin bu işi hızlı ve acısız bir şekilde yapmak için neden yeniden düzenleme araçlarına sahip oldukları. Ön ekler olmadan bile, bir değişkenin kullanımının değiştirilmesi neredeyse kesinlikle isminin değiştirilmesi gerektiği anlamına gelir .
"Önekler beni karıştırıyor" . Nasıl kullanılacağını öğrenene kadar her araçta olduğu gibi. Beyniniz adlandırma modellerine alıştıktan sonra, bilgileri otomatik olarak filtreleyecek ve öneklerin artık orada olduğunu aklınızdan çıkarmayacaksınız. Ama gerçekten "akıcı" hale gelmeden önce bir veya iki hafta boyunca böyle bir şema kullanmalısınız. Ve o zaman birçok insan eski koda bakar ve iyi bir önek şeması olmadan nasıl başardıklarını merak etmeye başlar .
"Ben sadece bu şeyleri çözmek için koda bakabilirsiniz" . Evet, ancak kodun başka bir yerine bakarken ya da cevabın gözünüze odaklandığı noktada doğru olduğunda her küçük detayını hatırlayarak zaman kaybetmenize gerek yoktur.
Bu bilgilerin bir kısmı değişkenime bir araç ipucu gelmesini bekleyerek bulunabilir . Evet. Desteklendiğinde, bazı önek türleri için, kodunuz temiz bir şekilde derlendiğinde, bir beklemeden sonra, bir açıklamayı okuyabilir ve önekin anında ileteceği bilgileri bulabilirsiniz. Ön ekin daha basit, daha güvenilir ve daha verimli bir yaklaşım olduğunu hissediyorum.
"Daha çok yazıyor" . Gerçekten mi? Bir karakter daha mı? Yoksa - IDE otomatik tamamlama araçlarıyla, her önek karakteri arama alanını önemli ölçüde daralttığı için genellikle yazmayı azaltır. "E" tuşuna bastığınızda sınıfınızdaki üç olay akıllıca açılır. "C" ye bastığınızda beş sabit listelenir.
"Bunun this->
yerine kullanabilirim m
" . Evet, yapabilirsin. Ama bu sadece daha çirkin ve daha ayrıntılı bir önek! Sadece çok daha büyük bir risk taşır (özellikle ekiplerde) çünkü derleyici için isteğe bağlıdır ve bu nedenle kullanımı genellikle tutarsızdır. m
Öte yandan kısa, net, açık ve isteğe bağlı değildir, bu yüzden onu kullanarak hata yapmak çok daha zordur.