“FullName” veya “FormattedPhoneNumber” gibi alıcıları modelinize koymak “kalıp kokusu” mu?


13

Bir ASP.NET MVC uygulaması üzerinde çalışıyorum ve model / varlık sınıflarıma yararlı ve kullanışlı alıcılar gibi görünen şeyleri koyma alışkanlığına giriyorum.

Örneğin:

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }

    public string FullName
    {
        get { return FirstName + " " + LastName; }
    }

    public string FormattedPhoneNumber
    {
        get { return "(" + PhoneNumber.Substring(0, 3) + ") " + PhoneNumber.Substring(3, 3) + "-" + PhoneNumber.Substring(6); }
    }
}

İnsanların meraklıları FullNameve FormattedPhoneNumbermeraklılarını düşündüklerini merak ediyorum .

Uygulama boyunca standartlaştırılmış veri formatları oluşturmayı çok kolaylaştırıyorlar ve çok sayıda tekrarlanan kod kaydetmiş gibi görünüyorlar, ancak veri formatının modelden görünüm modeline eşlemede ele alınması gereken bir şey olduğu kesinlikle iddia edilebilir.

Aslında, bu veri formatlarını başlangıçta eşlememi yaptığım hizmet katmanımda uyguluyordum, ancak sürekli olarak formatlayıcılar yazmak ve bunları birçok farklı yere uygulamak zorunda kalıyorum. Örneğin, çoğu görünümde "Tam Ad" kullanıyorum ve model.FullName = MappingUtilities.GetFullName(entity.FirstName, entity.LastName);her yere benzer bir şey yazmak zorunda kalmadan sadece yazmaktan çok daha az zarif görünüyordu model.FullName = entity.FullName(ya da AutoMapper gibi bir şey kullanırsanız, hiçbir şey yazmıyorsanız).

Peki, veri biçimlendirmesi söz konusu olduğunda çizgiyi nerede çizersiniz. Modelinizde veri biçimlendirmesi yapmak "iyi" mi yoksa bu bir "desen kokusu" mu?

Not: Modelimde kesinlikle html yok. Bunun için html yardımcıları kullanıyorum. Kesinlikle veri biçimlendirme veya birleştirme (ve özellikle sık kullanılan veriler) hakkında konuşuyorum.


1
Bunu yapmak uygun olabilir. Ancak bu kodu uluslararasılaştırmak zorunda kalmamanız için umut ve dua edin.
btilly

@btilly, iyi bir nokta, ama yapmayacağımdan yaklaşık% 99.99 eminim.
devuxer

FullName ve PhoneNumber'a özgüdür. Soru, özellikle farklı kültürlerde tutarsız formatlara sahip oldukları için mi, yoksa @DanM daha genel bir soru için uluslararasılaşmayan örnekleri seçti mi?
Greg Jackson

@Greg Jackson, kesinlikle merdiven. AmmoQ'nun işaret ettiği gibi, PhoneNumbermuhtemelen kendi sınıfına aittir (şimdi uyguladım). Ama FullNamegerçekten soruyu yazmaya motive eden oydu. Ancak, genel olarak, uygulama genelinde uygulanacak şeyler için modele veri biçimlendirme / tarama vb. Koymanın anlamlı olup olmadığını öğrenmekle ilgileniyorum. Aşağıdaki cevaplardan, bu bir anti-desen değil gibi görünüyor, ancak karar dikkatli bir şekilde alınmalıdır.
devuxer

Tam ad için bu özel biçimlendirmenin de uluslararası düzeyde uygun olamayabileceğini unutmayın. Örneğin Doğu Asya'da isim sırası, Batı dünyasındakinin tersidir. Gerçekten bunu açıkça ele almanız gerekiyor mu? Belki değil, ancak verileri biçimlendirirken karşılaşacağınız birçok zor şey olduğunu unutmayın.
Greg Jackson

Yanıtlar:


9

FullNameÖrneğinizde , alıcıyı (verdiğiniz tüm nedenlerden dolayı) seviyorum, ancak FormattedPhoneNumber alıcısını sevmiyorum. Nedeni: muhtemelen olmadığını (eğer uluslararası telefon numaralarını vb bir kez) ile bir yöntemde telefon numaralarını biçimlendirme için mantık yerleştirirseniz kolay Member, büyük ihtimalle gözden geçirmeniz gerekecektir (veya kopyalayıp yapıştırın caugh ) size bir kez için formatlanmış telefon numarası lazım Institution, Vendorvs de.

EDIT: IMO PhoneNumberbir Formattedalıcı ile bir sınıf olması daha iyi olurdu .


+1 ve teşekkürler. Ancak, telefon numarası biçimlendirme kodumu bir uzantı yöntemine koyarsam ne olur? Daha sonra herhangi bir model onu kullanabilir ve yeniden düzenleme veya kopyalama / yapıştırma olmazdı. Bu çözüm, biçimlendiriciyi her görünümde görünen her telefon numarasına uygulamaktan daha az tekrarlayıcı olacaktır.
devuxer

3
Bunun için bir uzatma yöntemi kullanmak, "fonksiyonel ayrışma" antipatternerine giden hızlı bir yol olacaktır. Bir uzantı yöntemi kullanarak ( Stringsınıf için, sanırım), Stringsınıfa telefon numaralarını nasıl biçimlendireceğinizi "öğretirsiniz" . StringTelefon numaralarını bilmek gerçekten sınıfın sorumluluğunda mı? Ben öyle düşünmüyorum. Bu şekilde kullanıldığında, uzatma yöntemleri, nesne yönelimli olmayan bir şeyin olduğu gibi görünmesini sağlamak için sözdizimsel şekerdir.
user281377

1
Tamam, unut uzatma yöntemi dedim. Yardımcı yöntem veya biçimlendirici sınıfı dedim. Ben sadece bir model alıcı veya biçimlendirme başka bir yerde yapmak olsun, yeniden düzenleme / kopya yapıştırma gerekli olmadığını söylüyorum.
devuxer

1
Ve bir PhoneNumbersınıf fikrini seviyorum . Yine de bunu yapmayı planlıyordum çünkü bir mülküm de var PhoneType.
devuxer

PhoneNumberVeri sınıfı olduğu için bir örnek sınıf olarak sahip olma fikrini sevmiyorum string. Aksine, bu yöntemlerle statik bir sınıf olmalıdır public static string Format(string phoneNumber, PhoneNumberStyle style).
Bay Anderson

5

Kod yazarken dikkat etmeniz gerekenler: Doğru mu? Okunabilir mi? Verimli mi? Bakımı yapılabilir mi? @Btilly'nin de belirttiği gibi, kültüre özgü biçimlendirme nedeniyle sürdürülemez olduğunu iddia ediyorum, ancak soru bunun daha genel gibi görünüyor.

Bu gibi erişimcilerin kullanılması kodunuzu daha okunaklı hale getirir ve nasıl kullandığınıza bağlı olarak kodunuzun diğer bölümlerini daha temiz hale getirebilir. Bence bu hiç kokmuyor. Yazdırmak isteyebileceğiniz her türlü dize için Biçimlendirme erişiminiz olsaydı kokmaya başlayacaktır ( public string FirstLastName; public string FullName; public string FullNameWithMiddleInitial; public string PhoneNumberWithAreaCode; public string PhoneNumberWithoutAreaCode; public string PhoneNumberWithCountryCode;vb.)

Ya da başka bir deyişle, bir kalıp kullanmak otomatik olarak kodunuzun "kalıp kokusu" olmasını sağlamaz. Bu özelliği kazanmak istiyorsanız kötüye kullanmanız gerekir.


Teşekkürler Greg. +1. Her kombinasyonu koymanız konusunda size katılıyorum. Gerçekten sadece verilerin nasıl görüntülendiğini standartlaştırmanın en temiz yolunu bulmaya çalışıyorum.
devuxer

3

Tek sorumluluk ilkesini ihlal eder. Neden bir telefon numarası sınıfı yapmıyorsunuz?


Tamam, aslında buna katılıyorum (ammoQ'nun cevabı altındaki tartışmaya bakın), ama aynı zamanda bir FullNamesınıf mı yapmalıyım ?
devuxer

Evet, yazmalısınız, ancak "FullName" den "FoolName" e yazım işlemini düzeltmelisiniz. Ya da belki "PersonalName", çünkü bir kişinin adıdır, tam değil.
kevin cline

1
Gerçekten mi? Verilen sınıfın büyümesi beklenmedikçe, bunun tam olarak nesi var? Büyüyor olsa bile, o zaman yeniden çarpanlara ayırmak ne kadar zor olurdu?
İş

@DanM: O zaman bunu istersiniz, yani tam yasal adlarını yazmasını isteyin. İlk ada göre sıralama yapıyorsanız, gerçekten adın ilk harfini (sonra ikinci harfini vb.) (Daha sonra bir sonrakini, daha sonra) sıralarsınız, böylece adlar ne olursa olsun aynı şekilde sıralanır.
Matt Ellen


1

Örneğin, belirli biçimleri kullanmak için çok büyük bir anlaşma olarak görmüyorum. Bir veya iki ve uygulamanın tüm bölümleri aynı biçimi kullanıyor.

Bu kararın dağılmaya başlayacağı yer, aynı verilerin farklı biçimler gerektiren birkaç farklı yere gittiği zamandır .

Bu olsaydı, Membersınıfı geri çekmeye cazip olurdum :

public class Member
{
    public int Id { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string PhoneNumber { get; set; }  
}

Ve sonra her hedef için farklı adaptörler yapın. Örneğin, bilgilerin CSV biçiminde gerekli olduğunu varsayalım:

public static class CSVMemberAdapter
{
    public static string ToCSV(this Member mbr)
    {
         return mbr.Id + "," + mbr.LastName + "," + mbr.FirstName, "," mbr.PhoneNumber;
    }
}

Her zaman veriyi temizlediğinizi varsayarak dizelerde virgül vb. Olmaz.

Bağdaştırıcının bir uzatma yöntemi olması gerekmez, ancak bu inandırıcı durum için uygun gibi görünüyor.


C # yazdığımdan bu yana bir süre geçti, ancak kesinlikle işleyebilecek serileştirme sınıfları var, toCSV gibi sık sık tekrar tekrar ve tekrar tekrar tekrar tekrar tekrar tekrar tekrar tekrar tekrar tekrar tekrar tekrar ve tekrar tekrar ve tekrar tekrar ve tekrar ...
kevin cline

@kevin cline: Her lavaboda neye ihtiyacınız olduğuna bağlı. Tüm ihtiyaçları serileştirilmiş XML ise, iyi. Birçok sistem bunu yapmaz. Eğer bu overkadar çok yapılması gerekiyorsa , tasarımda bir sorun var.
Peter K.

tipik olarak serileştirilecek birçok sınıf olurdu. Örneğin olduğu gibi elle kodlamak yerine, çoğu sınıfı yansıma yoluyla işleyebilecek tek bir CSV veya başka bir serileştirici yazmak mümkün olmalıdır.
kevin cline

@kevin cline: Şiddetle katılıyorum! Sorulan soru için çok özel bir şey yazıyordum. Somut, basit örnekler işleri daha iyi açıklama eğilimindedir.
Peter K.
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.