Sınıflarınız ile yerel sınıflar arasındaki ad benzerliklerini nasıl önlersiniz? [kapalı]


9

Ben sadece senin hakkında görüş istiyorum istiyorum "ilginç bir sorun" ile karşılaştım:

Bir sistem geliştiriyorum ve birçok nedenden dolayı (yani soyutlama, teknoloji bağımsızlığı vb.) Bilgi alışverişi için kendi türlerimizi yaratıyoruz.

Örneğin: SendEmail adı verilen ve iş mantığı tarafından çağrılan bir yöntem varsa, tamamen teknolojiden bağımsız ve yalnızca "işle ilgili veriler" içeren bir nesne olan OurCompany.EMailMessage türünde bir parametre vardır ( örneğin, kafa kodlamasında hiçbir bilgi yoktur).

SendEmail işlevinin içinde, bu bilgileri EMailMEssage nesnemizden alıyoruz ve ağ üzerinden gönderilebilmesi için bir MailMessage (bu teknolojiye özgü) bir nesne oluşturuyoruz.

Zaten fark edebileceğiniz gibi, sınıfımızın "yerel" dil sınıfına çok benzer bir adı vardır. Sorun şu ki, tam olarak bu oldukları şey, e-posta mesajları, bu yüzden onlar için başka bir anlamlı isim bulmak zor.

Sık sık bu sorunun mu var? Nasıl yönetiyorsunuz?

Düzenleme: @mgkrebbs az önce tam isimleri kullanma hakkında yorum yaptı. Bu bizim mevcut yaklaşımımız, ama biraz fazla ayrıntılı, IMHO. Mümkünse daha temiz bir şey istiyorum.


2
Her zaman yeterlilik kullanmak, biraz ayrıntılı ise uygulanabilir bir çözüm gibi görünüyor. Bir tür için OurCompany.EMailMessage, diğeri için SendEmailClass.EMailMessage (veya her neyse) kullanın. Bu yaklaşımı benimsemede bir sorun mu var?
mgkrebbs

Evet, düşündüm, ama ayrıntılı olur. "Daha temiz" bir şey rica ediyorum, ama önerdiğiniz çözüm benim şimdiki çözüm. Bunu açıklamaya ekleyeceğim
JSBach

3
İsimler bir bağlam içinde gelir. Genellikle bir ad alanı veya bunun gibi bir şey. Bu yüzden sorun olmamalı.
deadalnix

+1, bu soruyu beğendim. Bir keresinde bu soruyu yaklaşık 7 yıl önce bir eğitmene sordum ve tam bir "...." olduğumu düşündüm :)
NoChance

Hangi dili kullanıyorsun Cevap dile özgüdür. Genel olarak cevap 'bir ad alanı kullan'. Tek bir Java uygulamasında yarım düzine kitaplık tarafından kullanılan aynı sınıf adına sahip olmak oldukça yaygındır.
kevin cline

Yanıtlar:


3

Bu, projeniz için kullanacağınız ad alanı ile ilgili bir sorundur.

Temel olarak bir ad alanı, tüm sınıflarınız ve / veya projenizde kullanmak istediğiniz tüm sınıflar tarafından sağlanan anahtar kelimelerin toplanmasıdır (genellikle dil / derleyici / IDE ile sağlanan standart sınıflar dahil).

Bir ad alanı bir koleksiyon olduğu için, temelde kurallar, herhangi bir ilgili davranış olmadan terimlerin karışıklığını önlemek için uygulanır ve C # gibi bazı diller de kendi ad alanınızı genellikle olduğu gibi tanımlamanıza ve diğer sınıflarda da kullanmanıza izin verir.

Ad alanını dilin temel anahtar kelimesiyle karıştırmayın, her ikisi de bir anahtar kelime koleksiyonudur, ancak ikisi arasında büyük bir fark vardır: bir ad alanını değiştirebilirsiniz, ancak genellikle bir dilin temel anahtar kelimelerini değiştiremezsiniz. Projenizde kullandığınız ad alanı ile kullandığınız dilin temel anahtar kelimeleri arasındaki toplam, toplam anahtar kelime miktarını verir.

Konu net olarak tartışılır, ben "isim alanı [dil]" terimleri ile temel bir arama önerebilir o böyle bir şey. Sorunuzu doğrudan cevaplamıyorum çünkü farklı diller için farklı yaklaşımlara sahip olabilirsiniz.


3

Eski geliştirme ekibim, her özelleştirilmiş sınıfta uygulamanın kısaltmasını eklemek için kullanıyor. Örneğin ABCEmail sınıfımız vardı .

Sanırım isim alanına güvenmekten daha basit ama isim alanının kullanımına tamamlayıcı bir çözüm olabilir.

Son olarak, yeni bir nesne oluşturduğunuz için, yerel nesnenin ihtiyaçlarınızı karşılamadığı, bu nedenle E-posta Dosyanızın adının ÖzelleştirilebilirE -posta , GelişmişE -posta ... vb.


1
Son noktanıza katıldınız, ama neden bundan OAEmaildaha iyi OurApplication.Email? OAEMailüzerinde etkisi vardır her dönüşüm oluşur ve her iki sınıfları aynı kaynak dosyada kullanılan yerlerde ad notasyonu sadece bir etkisi var sahipken, yazılımın bir parçası.
Steven Jeuris

1
Diliniz ad alanlarını desteklemediğinde önek iyi bir fikir olduğunu düşünüyorum. Ancak dil ad alanı üzerinde bazı formları destekliyorsa kullanın (bu, ad alanlarının çözmek için tasarlandığı sorun!). ``
Martin York

@Steven Jeuris: Sınıfın oluşturulduktan sonra adı seçilmelidir. Daha sonra, tüm gereksiz etkilerden dolayı onu değiştirmenin kötü bir uygulama olduğunu düşünüyorum.
Amine

@Loki Astari: Hangi IDE'yi kullandığınızı bilmiyorum, ancak belirli bir sınıfı ararken veya açarken farklı bir sınıf adının işlenmesinin daha kolay olduğunu düşünüyorum. Özelleştirilmiş bir "e-posta" sürümüne sahip projeler gördüm ve dosyayı her açmak istediğimde birkaç isim alanına göz atmak zorunda kaldım. Demek istediğin hala geçerli Sanırım kaç adet özelleştirilmiş sınıfın oluşturulacağını paket organizasyonu sübjektiftir.
Amine

1
@Amine: Aslında ad alanlarına karşı çıktığını fark etmedim . Bunları kullanmanın tüm avantajlarını görmek için ad alanlarını biraz daha okumanızı öneriyorum: kapsülleme, belirsizliği ortadan kaldırma, daha az yedeklilik, ... Ps: Çoğu modern IDE, göz atmak zorunda kalmadan hızlı bir şekilde bir kaynak dosya bulmanıza izin veren arama özelliklerine sahiptir hiyerarşi. Bana yorum olarak: sürekli yeniden düzenleme yazılım geliştirmenin bir parçasıdır. Daha uygun bir isim, büyük bir etki ile gelip gelemediğinizde, yeniden adlandırmayı düşünmelisiniz. Ancak bunu önce meslektaşlarınızla tartışmak en iyisidir.
Steven Jeuris

3

Hangi dili kullanıyorsun Cevap dile özgüdür. Genel olarak cevap 'ad alanlarını kullan'. Bazı harici ad alanlarıyla çakışmayı önlemek için neredeyse hiçbir zaman tür adını değiştirmem.

Tek bir Java uygulamasında yarım düzine ad alanında aynı sınıf adına (ör. "Tarih") sahip olmak oldukça yaygındır. Bir sınıfın iki ayrı Date sınıfı kullanması gerekiyorsa, Java tür takma adlarını desteklemediğinden, Date sınıflarından birinin göründüğü her yerde tam olarak nitelendirilmesi gerekir. C ++ 'da hayat daha kolaydır; bunlardan birini typedef ile yeniden adlandırabilirsiniz.


Benzer bir cevap göndermek üzereydim, ancak C ++ takma adı yerine C # 'ın takma ad yönergesini kullanarak bahsetmek istedim .
Steven Jeuris

@Steven: C ++ yerine C #'dan bahsedecektim, ancak C #'da programladığımdan beri birkaç yıl geçti ve emin değildim.
kevin cline

2

Sık sık bu sorunun mu var? Nasıl yönetiyorsunuz?

Bu gerçekten kullandığınız dile bağlıdır. C ++ ve java'da bu sorun ad alanları kullanılarak çözülmüştür. C ++ kullanıyorum ve aynı adı taşıyan farklı sınıflar var. Farklı isim alanlarında oldukları için bu bir problem değil.

Diğer dillerde, farklı isimler vermekten başka yolu yoktur.


Bilgisayar için bu bir sorun değildir, ancak geliştirici için, örneğin EmailMessage ve MailMessage'ınız var olabilir.
JSBach

@Oscar Açıkçası. Bilgisayar için olabilir xyz123ve hala aynı çalışır. Daha sonra ayrıntılı gitmenin başka bir yolunu görmüyorum (yorumlarda bundan kaçınmaya çalıştığını söylediniz).
11:56, BЈовић

2

Sorunuz çok iyi. Yönteminize U (veya u) veya cls (sınıf kısaltması) gibi bir önek eklerseniz ne olur? Örneğin:

clsEMailMEssage veya uEMailMEssage

Bu çok fazla yazmayı gerektirmez ve hemen türün 'sizin' olduğunu söyleyebilirsiniz.

Düzenle - İlk 2 yoruma yanıt olarak:

Okuyucunun dikkatini şu gerçeğe işaret etmek istiyorum: Tüm Macar gösterimleri eşit yaratılmamıştır. Sistem Macarcası ile Uygulama Macarcası arasında ayrım yapmalıyız , yukarıdaki önerinin zararlı olmayan Apps Macarca türünü izlediğini varsayıyorum.

Bir ID'nin adlandırılması gibi Sistem Macar notasyonu ile ilişkili zarar yukarıdaki öneriye dahil değildir.

Bu konuda daha fazla bilgi için, bir göz atın: Yanlış Kodun Yanlış Görünmesini Sağlama - Joel On Software


3
Birisi Macarca notasyonu önerdiğinde, Tanrı bir yavru kedi öldürür.
Konamiman

2
BIgHUmpCAmelCAsing de yardımcı olmuyor.
Steven Jeuris

Yukarıdaki yorumlar takdir edilmektedir. Pls, düzenlemelerimi görüyor, ancak bazılarımızın fikrini değiştirmeyeceğini bilsem de, sonuçta bir yavru kedi öldürülmek ister mi? :)
NoChance

Bazı geçerli gerekçeler eklediğiniz için oylamayı kaldırdım. Ancak, Apps Macarca'nın bu senaryodaki adlardan daha uygun olduğunu kabul etmiyorum. Dil takma adları desteklediğinde, bu çok daha uygun bir çözümdür. Kevin Cline'ın cevabına bakın .
Steven Jeuris

@Steven Jeuris, yorumunuz için teşekkürler. Ad alanları, yazmaya devam etmek için uzun olmaları dışında mükemmeldir, sağladığınız bağlantıyı kontrol edeceğim.
NoChance
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.