İlgili bir özellik kümesini kendi yapısına / sınıfına sarmak iyi bir uygulama mudur?


10

Swift'te bir User nesnesi yazmak, ancak sorum güçlü yazılan herhangi bir dille ilgili. Bir kullanıcı bir sürü bağlantıya sahip olabilir (FacebookProfile, InstagramProfile, vb.). Bu konuda birkaç soru.

  1. Bağlantıları kendi nesnelerine sarmak iyi bir uygulama mudur?
    struct Kullanıcısı {
       var firstName: string
       var lastName: string
       var email: dize
       var links: Bağlantılar
    }
    struct Bağlantıları {
       var facebook: dize
       var instagram: dize
       var twitter: string 
    }

Yoksa gevşek mi olmalılar? Teknik olarak her iki yolun da iyi olduğunu biliyorum, ancak genel olarak önerilen bir yaklaşım olup olmadığını merak ediyorum - özellikle okunabilirlik için.

struct User { 
   var firstName: string
   var lastName: string
   var email: string
   var facebookLink: string
   var twitterLink: string
   var instagramLink: string
}
  1. Böyle bir senaryoda, bağlantılar bir koleksiyon / liste olmalı mı? Bir liste olmaması gerektiğini düşündüm, çünkü bağlantı sayısının sabit olması ve artan bir sayı olmaması. Düşüncem doğru mu?

  2. Ağ oluşturma yöntemlerimi getUsers, getUser, updateUser gibi User nesnesinin içine yerleştirmek iyi bir uygulama mudur?

Bunların öznel olabileceğini biliyorum, ama benzer durumlar hakkındaki en iyi uygulamanın ne olduğunu anlamaya çalışıyorum. Herhangi bir işaretçiler takdir ediyorum.

Yanıtlar:


30

İhtiyacınız olacak

  • sıfır şey,
  • bir şeyden biri, veya
  • gelişigüzel bir şey.

Tasarımınızın gerekli bağlantı sayısının her zaman üç olacağını ve adlarının sonsuza kadar ne olduğunu bildiğinizi tahmin etmesinden şaşırdım.

Vaaz ettiğim şeye sıfır bir sonsuzluk kuralı denir . İlk başta açık olmayabilir ama bana tasarımınızın geleceğe toleranslı olmadığını söyleyen şey bu.

Bu bağlantılar hakkında kendilerine özel bir şey olsaydı farklı hissederdim. Twitter bağlantısı için yapmadığım bir facebook bağlantısına erişirken farklı yaptığım bazı özel şeyler. Bu onları farklı şeyler yapar. Ancak bu, bu kodda belirtilmemiştir.

Bu yüzden e-posta dizesinden rahatsız değilim. Bunun bağlantılardan farklı bir şekilde kullanıldığını biliyorum.

Bu bağlantıları farklı bir şekilde kullanmanın bir nedenini görene kadar bir bağlantı koleksiyonunun yanındayım.


4
FacebookProfile, InstagramProfile, ...Bence OP zaten soruyu yanıtladı. Dili bize Kullanıcıların sosyal alanlarla ilgili hiçbir veya birden fazla profili bulunmayabileceğini söylüyor. Ancak içindeki programcı bu unsuru sadece bağlantılara dönüştürdü. Neden bir koleksiyon değil Profiles? CandiedOrange ile anlaştım. Gelecek hakkında çok fazla şey varsayıyorsunuz. Yeni sosyal ağlar görünebilir. Gerçek olanlar yok olabilir. Kullanıcılar bir ağdan diğerine gidip gelebilir.
Laiv

Bu bir tahmin. Bu profilleri sosyal girişler için kullanmak istediğinizi varsayalım. Bileşen Profiline sahip olarak, nereden başlayacağımız var. Bu profillerle kimlik doğrulaması ve geçerli oturumla ilgili bilgilerin bulunduğu yerler. Bu YAGNI veya aşırı mühendislik olarak kabul edilebilir, ancak düşünülmesi gereken hiçbir şey değmez, bu özelliklerin istenip istenmeyeceğini veya uygulamamıza değer sağlayıp sağlayamayacaklarını görün. Değilse, onları atın.
Laiv

1
@ Prabhu neden sınırladığınıza bağlıdır. Benim tahminim GUI'ye çok fazla uyuyor. Hangisi iyi. Ancak GUI nedeniyle veri yapısını sınırlamayın. GUI'ler bir hevesle değişir. Veri yapılarının değiştirilmesi maliyetlidir. İlk seferinde onları düzeltmek gerçekten işe yarıyor.
candied_orange

2
Mesele bu. Sadece gelecekteki değişiklikleri daha az acı verici hale getirecek yapıları benimseyin. Ne fazla ne az. Biz, Candied ve ben bunu söylüyoruz, çünkü (inandığım) benzer durumlarla sık sık karşılaştık ve değişmeye veya gelişmeye açık olası özellikleri öngörüyoruz. Sonuçta, projeye ve gelecekteki beklentisine daha yakınsınız.
Laiv

1
@Prabhu: Özel senaryo için en kısa yaklaşım olup olmadığı değil, iyi uygulama hakkında bir soru sorduğunuza dikkat edin . Genellikle aşırı mühendislikten kaçınmanın yanındayım, ancak gelecekteki bakımın maliyeti (bağlantı ekleme / kaldırma, varlık sınıfı tanımlarını güncelleme, ...) bir bağlantı koleksiyonu uygulama maliyetinden çok daha ağır basar. Sütunlarınızı denilen Eğer link1, link2, link3, bir koleksiyon için ihtiyaç daha belirgin olurdu. Bununla birlikte, sütunlara daha anlamlı bir ad vermiş olmanız, tekrarlanan verilerin bir koleksiyonu olduğu gerçeğini değiştirmez.
flater

6

"Teknik bir olasılık görüyorum" tuzağına düşmek üzeresiniz.

Öğeler arasında ortak bir özellik görmeniz, bunlara bazı toplamaların uygulanması mantıklı olduğu anlamına gelmez. Toplama bir şey ifade etmelidir. Teknik düzeyde değil, sorunlu alan adınızda.

Hepsi link iyi, ama bir kullanıcı sınıfı bağlamında, bu bir şey ifade ediyor mu? Hayır. "Dizeler" ve "sayılar" adlı sınıfları kullanarak alt gruplara ayırmak kadar anlamsızdır.

Bu tür bir şeyle ilgili sorun, modelinizi bulanıklaştırmasıdır. Etki alanını tam olarak anlamadan önce kod okuyucuyu anlamsızdan koparmaya zorlar.

Hiç kimse bir kullanıcının bağlantılarından bahsetmez. Toplama SocialNetworkIds çağırmak farklı olurdu. Bu aslında bir şey ifade edeceğinden, keyfi bir teknik koleksiyondan ziyade Kullanıcının gerçek bir özelliği olacaktır.


Tam olarak şüphe ettiğim şey, bu soruyu sormama neden oldu. Farklı bağlantılar arasındaki tek ilişki, muhtemelen kullanıcı arayüzünde birlikte görüntülenecek olmasıdır. Yani, bu durumda, bunları ayrı bir nesneye doğru bir yere koymamayı, doğrudan Kullanıcı nesnesinin altında tutmayı önerirsiniz.
Prabhu

1
Bu durumda faydalı olacağını düşünmüyorum. Henüz bir karmaşıklık katmanı eklemeyi haklı kılan bir sorununuz yok. Çok daha fazla mülkünüz olsaydı, bir gruplama çabasında (gruplar için uygun isimlerle) bir kazanç olmuş olabilir. Yine de bağlam olmadan neyin uygun olduğunu söylemek zordur. Sonuç olarak, işleri kolaylaştırmasıdır. Geliştirme sürecindeki bir sonraki adımınız ne olursa olsun anlamak ve / veya devam etmek.
Martin Maat

Genellikle aşırı mühendislik kaçınarak gibi, ama ben merak yapın: Eğer OP onun alanları adlı olsaydı aynı şeyi söylerdi link1, link2, link3? Bir veri yapısının tasarımı alanların adından bağımsızdır, bu yüzden örneğim işlevsel olarak eşdeğerdir. Bu geleceğe yönelik bir meseledir. YAGNI genellikle geçerlidir, ancak herhangi bir şey olursa, sosyal medya viral popülariteye ve değişikliklere yatkın olduğunu kanıtlamıştır. Her yeni popüler sosyal medya sitesi için yeniden geliştirilmekten kaçınılması arzu edilmektedir. Aksi takdirde, "bir alan daha nedir?" büyük borç yaratabilecek tuzak.
Flater

1

Genel olarak, structeğer her birine benzer işlemler uygulayacaksanız ve özellikle de aynı işlemleri her zaman gerçekleştirirseniz, bağlantıların kendi başına olması mantıklı olacaktır . Başvurunuzda ilgisiz amaçlar için olsalardı, onları ayrı yapardım. Örneğin, kullanıcının ana sayfası, sağlık sigortası sağlayıcısının web sitesi ve en sevdikleri haber sitesine bağlantı olsaydı, muhtemelen ilgisiz göründükleri için onları gruplandırmazdım. Ancak 3 sosyal medya sitesi için, bir uygulamada benzer şekilde ele alınacak gibi görünüyor ve bu nedenle muhtemelen birlikte gruplandırılmalıdır. Daha açıklayıcı bir isim kullanırdım Links. (Ne tür bağlantılar? Uygulamanızda hangi amaçla?)

# 2 hakkındaki düşüncenize katılıyorum. Yukarıda belirtildiği gibi, sayı büyüyecek veya değişken olacaksa, bir liste veya başka bir koleksiyon iyi bir seçim olacaktır, ancak tanımladığınız senaryo için değil.

Ağ tarafından alınan verileri tutan nesnelerin içine ağ yöntemleri yerleştirmek olmaz. Verilerin nereden geldiği ve nasıl elde edileceği genellikle bir sınıfın temel amacı ile ilgisizdir. Gelecekte diskten veri almak isterseniz ne olur? Veya kullanıcının girmesini ister misiniz? Bu yolda yeterince ilerleyin ve basit bir Usersınıf, olası her veri girişi ve alma yöntemini işleyecek koda sahip olmalıdır. Sadece bir Usersınıfın verileri bellekte tutmasını ve bakımını yapmasını sağlayın . Diğer her şey daha uygun sınıflar tarafından yapılabilir.

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.