Hangi isimlendirme kalıpları var? [kapalı]


35

Bazı isimler var, bu isimlere ulaşmak için kendinizi bulursanız, zaten bir şeyi batırdığınızı bilirsiniz.

Örneğin:

XxxManager
Bu kötü, çünkü bir sınıf, sınıfın ne yaptığını tanımlamalıdır. Sınıfın ne yaptığıyla ilgili olarak bulabileceğiniz en belirgin kelime "yönetmek" ise, sınıf çok büyüktür.

Başka ne adlandırma karşıtı paternler var?

Açıklığa kavuşturmak için, "hangi adların kötü olduğunu" sormuyorum - bu soru tamamen özneldir ve bunu cevaplamanın bir yolu yoktur. "Hangi isimlerin sistemdeki genel tasarım sorunlarını gösterdiğini" soruyorum. Diğer bir deyişle, kendinizi bir Xyz bileşenini çağırmak istediğinizi görürseniz, bu muhtemelen bileşenin kötü niyetli olduğunu gösterir. Ayrıca burada her kuralın istisnaları olduğunu unutmayın - yalnızca bir tasarımı gerçekten durdurup yeniden düşünmem gerektiğine dair uyarı bayrakları arıyorum.



4
"Yapıcı değil" olarak kapatmak için oy verenlere - nedenini açıklamak ister misiniz? Bu işin
yolunda gitmediği


2
@Aaronaught: Herhangi bir öneriniz var mı? Bu düzenlemede
elimden geldiğince

1
@jhocking - Bu bağlantının bir kısmına katılıyorum - özellikle "Yönetici" ve "İşleyici" nin bırakmayacak kadar değerli olmasıyla ilgili olan o bit. Ve ben en azından pek çok durumda belirsiz görünen tasarım deseni temelli ve diğer alternatiflerde satılan değilim. Bazen, "Kuyruk" veya uygun olanı olabilir, ancak genellikle yöneticinin öğeleri kuyrukta tutması (veya referans vermesi) bu öğeleri yönetmenin yalnızca bir yönüdür. Yararlı bir şeyin “yönetici” tarafından iş unvanı olarak ifade edilmesi gibi, IMO da OOP için geçerlidir.
Steve314

Yanıtlar:


22

Aşağıdaki adlandırma karşıtı kalıplar .NET ve özellikle C # ile ilgilidir:

  • Tutarsızlıklar . Eğer bir lider çizgi ile her alan adını başlatmaya karar verirse, ona sopa .
  • Ambiguos, ünlü harflerin eksik olduğu kısaltmalardır . Alan adlarını ciddiye aldım cxtCtrlMngr. Bunun neye dayanması gerektiğini tahmin bile edemezsiniz.
  • Çok uzun ve ayrıntılı değişken adları . ILoginAttemptRepositoryiyi ve açıklayıcı - ILoginAttemptRepositoryUsingEntityFrameworkForObjectRelationalMappingaçıklayıcı, ama kesinlikle iyi değil.

7
Burada mı Idemek interfaceistiyorsun implementer, yoksa tekil ilk kişi mi? Çoğu sınıf bir arayüz uyguladığı için, bir sermayeyle çok fazla sınıf / etkileşime sahip olmak, rahatsız edicidir Ive okunabilirliği engellemektedir ve kendi başına bir kod kokusu vardır.
kullanıcı bilinmeyen

3
"Eksik sesli harflerle Ambiguos kısaltmaları" için +1, beni deli ediyor!
SinirliFormsDesigner ile

6
@ Billy ONeal: C ++ arayüzleri var; yapay olarak sınıflardan ayrı değiller. ;)
Jon Purdy

4
@ Billy ONeal: Benim açımdan.
Jon Purdy

2
@ MariusSchulz: oh evet, seninle aynı fikirdeyim :) Sadece böyle korkunç bir opak kısaltma olmadığını düşündüm.
amara

9

Sıklıkla karşılaştığım tek şey, basitçe, herhangi bir adlandırma modelini kullanmamaktır. Tipik olarak, geliştirici cehaletinin göstergesidir (isimlendirme modellerinin iyi bir şey olduğunu ) ve ayrıca bu anti-patern, bir sınıfla ilgili her tür metodu o sınıfın içine sokarak, yani bir Müşterinin türünü doldurarak, büyük ölçüde SRP'yi ihlal etme eğilimindedir. sınıfın özellikleri, CRUD yöntemleri, uygulamanın bir kısmının ihtiyaç duyduğu bir Müşteri ile uzaktan ilgili bir şey var.

Ayrıca "Engine" ifadesinin son ek olarak kullanılmasının "Manager" ile aynı olduğunu ekleyeceğim. Çok belirsiz ve denilen bir sınıf XxxEngine, VB tarzı bir Modül için bir miktar yöntem içeren bir şey olma eğilimindedir, bu nedenle nesne yönelimli programlama bilgisi olmadan, kullanımı kolay tek bir noktada bulunur.


7

Peki, basit cevaplar önce: Macarca yazın ( http://mindprod.com/jgloss/unmainnaming.html , ayrıca bazı harika fikirler var. Macarca kötülük olmadığı zaman daha dengeli bir bakış açısı, http://www.joelonsoftware.com /articles/Wrong.html )


7
Macar Notasyonu HER ZAMAN kötüdür :)
Wayne Molina

12
@Wayne: Aslında, her zaman kötülük değil . 70'lerin sonlarında Xerox'ta Charles için çalıştım ve orijinal adlandırma sistemi bir cankurtarandı. 1 tip: tamsayı olan BCPL'de çalışıyorduk. Türle ilgili her şey, kullanım ve adlandırma kuralları kullanılarak iletildi. 7 programcımız + Charles vardı ve herhangi birimiz başkasının koduna girip hemen üretken olabilirdi. Bu, korkunç bir şekilde bükülmediğini / yanlış uygulanamayacağını söylemek değildir (Charles tarafından bile), sadece doğru bağlamda doğru çözümdü.
Peter Rowell

3
@ Marius: Joel'in makalesini oku. Yazım sistemi her zaman değişkenler arasındaki tüm anlamsal farkları uygulayamaz. Intellisense bu gibi durumlarda da yardımcı olmaz.
Billy ONeal

4
Türü kullanmaktan daha kolaydır, esp. Modern editörlerle. Ancak, disiplin gerektirir. Her şeyi öneklemek zorunda değilsin . Java'da çalışıyorum ve çoğu zaman Macarca uygulamaları gerekli değil, ancak koordinat sistemlerinde aynı türden değişkenleri (fromX ve toX gibi) gerektiren bir şey yaptığımda, bu bir cankurtaran.
Michael K

3
Güzel olanı kolayca yeni türler yapmak için genel bir yetenek. "Bu bir int gibidir, ancak satır numaraları için geçerlidir."
David Thornley

6

Bir arabirim adına 'I' veya soyut bir sınıf adına 'Özet' öneki. Bu , soyut sınıflar kavramına sahip olmayan veya arayüzler ile soyut sınıflar arasında ayrım yapmayan dillerde münhasır olabilir - fakat Java'da, örneğin, her zaman kötü bir fikirdir.

Ayrıca, Müdür olayı konusunda seninle aynı fikirde değilim. Bazen bu kalıbı kullanıyorum ve bu sadece başka bir şeyi adlandırmaya kalkıştığımda, adın XxxxxManager'dan daha açıklayıcı olmayacağı anlamına geliyor. Bir veya iki kelimeyle özenle özetlenemeyen bazı görevler (zorunlu olarak karmaşık olanlar değil) vardır.


@Mike: İfadenize tamamen katılmıyorum üzgünüm. Bence XxxxManagerbir sınıfın sahip olabileceği en kötü isim. Elbette bir şeyleri yönetiyor! Bunun için yazılmasının nedeni bu. ManagerBir sınıfa neyin sorumlu olduğunu anlamak için değer katan anlamsız bir kelimedir.
Marius Schulz

1
Peki ya diyelim TabManager? JSP sekme mekanizmasını kontrol eden bir sınıf için daha iyi bir isme sahip misiniz? Veya gasp TabController ... Ön eke kadar Abstract, aşırı kullanıldığını ancak çoğu zaman geçerli olduğunu düşünüyorum (örnekler için Java kütüphanelerine bakın). Sanırım, hiç Ikimsenin orada olmaması gereken bir arayüze karşı programlamaya çalışmadığı herhangi bir yerde arayüzler görmedim diyebilirim . Gibi, sadece bir sınıf arayüzü uygular.
Michael K,

1
@Darien (ve diğerleri): Her iki şekilde de - fark etmez. Bu isimlerden hiçbiri anti-kalıp değildir (ve bu nedenle bu soru için konuyla ilgisi yoktur). Sana kullandıkları olsun veya olmasın bir sistemin tasarımı hakkında bir şey söylemek sanmıyorum IXxxya XxxImpl.
Billy ONeal

2
Bu sadece tamamen, tamamen yanlıştır. Var çok görsel sınıflardan arayüzlerini ayırt edebilmek için iyi nedenler: (a) örneği alınamaz, (b) serbest yiyemeyen getirilemez / yerleştirilmiş, (c), (d) olabilir olmak proksiye / ele geçirilmiş, vb., vb. vb. Kişisel olarak sevmediğiniz bir şeyi (bazı tuhaf ve açıklanamayan bir nedenden dolayı) herhangi bir gerekçe göstermeden bir anti-patern örneği olarak atmıştınız.
Aarona

1
Mümkün olduğunda, argüman tipleri ve dönüş tipleri için arayüzler somut sınıflara tercih edilmelidir. Bu nedenle, arayüzlerin “temiz” isimleri alması ve siğilleri elde etmesi için somut uygulamalar (arayan kişinin bile bilmeyeceği veya umursamadığı türden) anlamlıdır.
Kevin Krumwiede

6

Speeling:

Eğik bir engelim var ve heceleyemiyorum. Yazım denetleyicisiyle, güçsüzüm. Oluşturduğum tüm isimleri, bir kelime işlemciye doğrulama için kopyalamaya çalışıyorum ama her zaman bazılarını özlüyorum. Son projemde api'nin büyük bir bölümünü yazdım ve sanırım ilk önce cevabı kelimesini kullandığımda çekimi hecelemedim ve hiç kimse bana söylemediği için doğru olduğunu varsaydım. Buna cevap veren en az 50 fonksiyonumuz vardı. Ekibe yeni bir kişi geldi ve neden cevap kullandığımızı sordu kendimi aptal hissettim.


2
Parametrelerden birinin affect(etki yerine) olduğu kısaca bir jQuery eklentisi kullandım . Beni çıldırttı ve aynı şeyi yapmak için hemen farklı bir eklenti buldum.
zzzzBov

4
En kötü problem, yanlış yazılmış bir isim gördüğümde, isimlerin ne olduğunu hatırlama yeteneğimi gerçekten incitiyor.
David Thornley

1
Kodun farklı kısımlarında aynı şeyin farklı şekilde yazılması daha da kötüleşiyor. Bir tarla kuvveti olduğunda, Srtength sınıfının getStrenth () yöntemiyle erişildiği bir alan var.
Eva,

5

Korkarım ki görüşlerim biraz tartışmalı. Ama deneyelim ...

Endişelendiğim kadarıyla Mike Baranczak ile aynı fikirdeyim, XxxController, XxxHandler gibi isimler gerçekten sık kullandığımız bir şey. Bizim için bir Denetleyici "kapsüllenmiş" bir şey için bir giriş noktası gibidir, örneğin işlemleri yönetmek, beklenmeyen hatalarla uğraşmak, asıl işi yapmak için XxxHandler'ı çağırmak. Bir XxxManager'ın bir denetleyicinin eş anlamlısı olduğunu söyleyebilirim. Bir durumda Yöneticisi, diğerini Denetleyici olarak kullanmamanın önemli olduğunu düşünüyorum. Bir takımda çalışıyorsanız tutarlı olmak çok önemlidir.

Böyle şeyler için daha iyi isimler bulmak gerçekten zor olurdu, ya da belki bile mümkün olmazdı. Durumun daha net olması için Xxx iyi seçilmiş olmalı.

Şahsen sevmediğim şey, get ... ya da set ... adındaki bir yöntemin basit bir erişimciden daha fazlası olması. Det'i seviyorum ... karar için.

Aklıma gelen başka bir şey var: Bob Amca'ya göre. Bir yöntem adındaki "Ve", çok şey yapmanın işaretidir. Fakat hayat her zaman sadece siyah ve beyaz değildir - tamam olduğunu düşündüğüm durumlar var - örneğin. Performans sorunları nedeniyle (neden onları işlememediğimizi kontrol etmek için verilere sahipseniz) ...

Şahsen ben de sistemlerin Macar gösterimini büyük bir hayranıyım - çoğu zaman bir IDE'de kaynak kod ile uğraşıyorsunuz. Fakat genellikle sadece bir editör kullanıyorsunuz ya da bir tarayıcıdaki repoyu geziyorsunuz. Bir dezavantaj, tip önekleri nedeniyle araç desteği olabilir ...

Bence en önemli şey arı yetiştirme yetkinliği - yetersiz bir kongre - benim için - kongre yapmamasından daha iyidir ...


1
"Kontrolör", "Yönetici" den farklı bir semantikaya sahip Şahsen ben de hoşlanmıyorum, fakat “Kontrolör” bunu kabul ediyor çünkü birçok modelin, özellikle de MVC'nin ortak bir bileşeni. XxxHandler aynı derecede kötü. Eğer sınıf sadece bir şeyi "ele alırsa" - o zaman sınıf ya çok büyüktür, ya da sadece "Xxx" kısmı olarak adlandırılmalıdır.
Billy ONeal

3
"Bu gibi şeyler için daha iyi isimler bulmak gerçekten zor veya belki de mümkün olmayabilir" - tür hiyerarşinizi iyi tanımlanmış bağımlılıklar ve sorumluluklarla düzgün bir şekilde tasarlamamışsanız bile. Elbette, genel bir olay / mesaj işleyicisi için MVC'nin bir parçası olarak "Denetleyici" veya "İşleyici" kullanıyorsanız, o zaman bu farklıdır - bunlar jargon örnekleridir - ancak bunlar sadece hastalara genel isimler olarak kullanılıyorsa tanımlanmış sınıflar o zaman büyük bir kırmızı bayraktır.
Aarona

5

Belki de en kötü adlandırma karşıtı model şudur:

create table stuff(..., foo1 string, bar1 string,
                        foo2 string, bar2 string, 
                        foo3 string, bar3 string, ...)

Üç elementli [foo, bar] çiftler listemiz var. Dördüncü bir ihtiyacımız olursa, tabloya yeni sütunlar eklemek zorunda kalacağız.

Böyle bir koda liderlik:

'SELECT foo' + i + ', bar' + i + ' FROM stuff'

Foo ve bar sütunları ile ayrı bir tablo oluşturulmalı ve malzeme tablosuna bağlanmalıdır:

create table fubar(foo string, bar string, stuff_id long)

İkinci en kötü durum şudur:

class Student {
  ...
  String homeStreet;
  String homeCity;
  String homeState;
  String permStreet;
  String permCity;    
  String permState;
  ...
}

Burada bir Address sınıfının iki örneği yerine altı alanımız var.

Bu anti-patern, iki grubun her bir kombinasyonunu listeleyen bir dizi iki parçalı isim ile işaretlenmiştir, örneğin [foo, bar] x [1,2,3] veya [home, perm] x [sokak, şehir, eyalet]


-1 - Bu isimlendirmeden hiç bahsetmiyor.
Billy ONeal

Bir adlandırma karşıtı kalıp, birden fazla ad içeremez mi?
kevin cline

==Antipattern adında çok fazla argüman nasıl bulunur ? Kafam karıştı.
Billy ONeal

1
Anladığım kadarıyla, kongre asıl ismin alınması gereken sayılara izin veren bir sözleşme. Bu rakamlar ürün listesinde veya dizi çeşit olduğunu, bir yanlış tanınmasına neden
keppla

3
@ Billy ONeal: Evet yaparlar. Tasarım problemi normalleşme eksikliğidir ve sayı sonları ona işaret eden isimlendirme düzenidir.
reinierpost 14:11

3

Bir totoloji olan herhangi bir sınıf veya arayüz isimlendirme, sadece bağlantının bahsettiği Java dilinde değil, herhangi bir dilde kötüdür.

Tautology (retorik), aynı şeyi söylemek için farklı kelimeler kullanarak bile tekrarlama netlik sağlamaz.


2
İlginç. Herhangi bir örnek?
Mike Baranczak

2
Bağlantıyı okudum, "tautology" yazıyor ...;)
Benjol

10
Totoloji kulübünün ilk kuralı totoloji kulübünün ilk kuralıdır.
Cercerilla

Bağlantıyı okudum (tamam, bağlantının içeriği ) ve hiçbir örnek bulamadım
barjak

Tamam, bu bağlantıya göre I <ArayüzAdı> 'yı kullanmayı bırakmalıyız.
Dal

3

Sık sık, Libraryveya gibi genel adlara sahip yazılım kütüphaneleriyle karşılaşırım Common. En düşük tasarımı gösterir: geliştiriciler kod çoğaltmasından kaçınmak için çaba harcarlar, ancak işlevsellik temelinde ayrıştırılmış bir tasarım oluşturma girişiminde bulunmazlar.


+1 - Ben her zaman "Ortak" görüyorum.
Morgan Herlocker 14:11

1

Gönderen Microsoft adlandırma, ben kötü adları için bu listeyi sağlayabilir:

  1. Anlambilimsel değiller; bu, ne yaptığına vurgu yapmak yerine, kullandığı teknolojiye veya temel aldığı kalıba vurgu yapan adlara sahip oldukları anlamına geliyor .
  2. Sözdizimsel tutarlılığı takip etmezler. Örneğin, adların bir kısmı deve kasası, diğer kısmı ise paskal kasalıdır.
  3. Bunlar zor kısaltmalar gibi anlamak vardır ScrollableX yerine CanScrollHorizontally
  4. O ortamın anahtar kelimeleriyle uğraşacak şekilde seçildiler.

2
Aslında "ScrollableX" i en az "CanScrollHorizontally" kadar seviyorum. "X" gerçekten bir kısaltma değildir.
user1172763 5:15
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.