Pisanie obiektu użytkownika w Swift, choć moje pytanie dotyczy dowolnego silnie napisanego języka. Użytkownik może mieć kilka linków (FacebookProfile, InstagramProfile itp.). Kilka pytań wokół tego.
- Czy dobrą praktyką jest zawijanie łączy we własnym obiekcie?
struct Użytkownik { var firstName: string var lastName: string var email: string var links: Linki }
Struktur Linki { var facebook: string var instagram: string var twitter: string }
A może powinny być luźne? Wiem, że technicznie oba sposoby są w porządku, ale zastanawiam się, czy istnieje ogólnie zalecane podejście - szczególnie w zakresie czytelności.
struct User {
var firstName: string
var lastName: string
var email: string
var facebookLink: string
var twitterLink: string
var instagramLink: string
}
Czy w takim scenariuszu linki powinny być zbiorem / listą? Uznałem, że nie powinna to być lista, ponieważ dostępna jest stała liczba opcji linków, a nie rosnąca liczba. Czy moje myślenie jest prawidłowe?
Czy dobrą praktyką jest umieszczanie moich metod sieciowych w obiekcie użytkownika, takich jak getUsers, getUser, updateUser?
Wiem, że mogą być subiektywne, ale staram się zrozumieć, jaka jest najlepsza praktyka w podobnych sytuacjach. Byłby wdzięczny za wszelkie wskazówki.
FacebookProfile, InstagramProfile, ...
Myślę, że OP już odpowiedział na pytanie. Jego język mówi nam, że Użytkownicy mogą nie mieć żadnego profilu lub kilku profili związanych z sieciami społecznościowymi. Ale programista w nim / nim zamienił ten element w zwykłe linki. Dlaczego nie kolekcjaProfiles
? Zgodziłem się z CandiedOrange. Za dużo zakładasz na przyszłość. Mogą pojawić się nowe sieci społecznościowe. Rzeczywiste mogą zniknąć. Użytkownicy mogą przechodzić z jednej sieci do drugiej.link1
,link2
,link3
, potrzeba zbierania byłaby bardziej oczywista. Jednak fakt, że nadałeś kolumnom bardziej znaczącą nazwę, nie zmienia faktu, że jest to zbiór powtarzalnych danych.Jesteś na skraju wpadnięcia w pułapkę „Widzę techniczną możliwość”.
To, że widzisz wspólną cechę wśród przedmiotów, nie oznacza, że warto na nich zastosować agregację. Agregacja powinna coś znaczyć. Nie na poziomie technicznym, ale w domenie problemowej.
Wszystkie linki są w porządku, ale czy w kontekście klasy użytkownika to coś znaczy? Nie. Jest to tak samo pozbawione znaczenia, jak byłoby podgrupowanie za pomocą klas o nazwach „ciągi” i „liczby”.
Problem z tego rodzaju rzeczą polega na tym, że rozmazuje twój model. Zmusza czytnik kodów do odcięcia znaczącego od pozbawionego znaczenia, zanim będzie w pełni rozumieć domenę.
Nikt nigdy nie mówi o linkach użytkownika. Byłoby inaczej, gdybyś nazwał swoją agregację SocialNetworkIds. Ponieważ w rzeczywistości coś to znaczyłoby, byłaby to prawdziwa właściwość Użytkownika, a nie arbitralny zbiór techniczny.
źródło
link1
,link2
,link3
? Struktura struktury danych jest niezależna od nazwy pól, więc mój przykład jest funkcjonalnie równoważny. To kwestia zabezpieczenia na przyszłość. YAGNI miałoby ogólnie zastosowanie, ale w ogóle media społecznościowe okazały się podatne na popularność i zmiany wirusowe. Pożądane wydaje się unikanie przebudowy każdego nowego popularnego serwisu społecznościowego. W przeciwnym razie ryzykujesz wpadnięcie w „co to jeszcze jedno pole?” pułapka, która może stworzyć ogromny dług.Ogólnie rzecz biorąc, uważam, że rozsądne byłoby posiadanie odnośników,
struct
jeśli prawdopodobnie zastosujesz podobne operacje do każdego z nich, a zwłaszcza jeśli zawsze będziesz wykonywać te same operacje na wszystkich z nich. Jeśli są one w twoim wniosku niezwiązane z celami, to bym je rozdzielił. Na przykład, jeśli byliby stroną domową użytkownika, witryną ubezpieczyciela i linkiem do ich ulubionej witryny z wiadomościami, prawdopodobnie nie zgrupowałbym ich razem, ponieważ wydają się niezwiązani. Ale w przypadku 3 serwisów społecznościowych wygląda na to, że będą one traktowane podobnie w aplikacji i jako takie powinny być prawdopodobnie zgrupowane razem. Użyłbym bardziej opisowej nazwy niżLinks
chociaż. (Jaki typ linków? W jakim celu w Twojej aplikacji?)Zgadzam się z twoim myśleniem na # 2. Jak wspomniano powyżej, jeśli liczba miałaby rosnąć lub stać się zmienną, lista lub inna kolekcja byłaby dobrym wyborem, ale nie dla opisanego scenariusza.
Nie umieszczałbym metod sieciowych w obiektach przechowujących dane pobrane przez sieć. Skąd pochodzą dane i jak je uzyskać, zwykle nie mają znaczenia dla głównego celu klasy. Co jeśli w przyszłości chcesz uzyskać dane z dysku? Lub chcesz, aby użytkownik go wprowadził? Idź wystarczająco daleko tą drogą, a prosta
User
klasa musi mieć kod do obsługi każdej możliwej metody wprowadzania i wyszukiwania danych. Po prostuUser
zatrzymaj klasę i zachowaj dane, gdy są one w pamięci. Wszystko inne może być obsługiwane przez bardziej odpowiednie klasy.źródło