Jakie są przykłady dobrych struktur klasy używanych do zarządzania dostępem do bazy danych? Jestem fanem enkapsulacji klas i wolałbym, aby kontenery (np. Samochód) nie wykonywały zadań bazy danych.
Chciałbym również mieć możliwość łatwego upuszczania rzeczy takich jak pamięć podręczna bazy danych w przyszłości.
Często biorę wzorzec klas kontenerów, wraz z modułami pobierającymi i ustawiającymi do sprawdzania poprawności i dostępu do bazy danych wykonywanymi przez pojedynczą klasę singleton. To powiedziawszy, często miesza się między nimi i staje się dość mylące.
Przepraszam, jeśli moje pytanie jest trudne do zrozumienia; Nie mam absolutnej pewności co do warunków dotyczących baz danych. W razie potrzeby prosimy o wyjaśnienia.
Odpowiedzi:
Wolę wzorzec repozytorium od enkapsulacji dostępu do danych. Krótko mówiąc, repozytorium jest odpowiedzialne za ładowanie wszystkich danych wymaganych dla określonego obiektu. Powiedz, że masz obiekt samochodowy, jak w twoim przykładzie. Ale wszystkie atrybuty samochodu, marki, modelu, roku, właścicieli, funkcji (odtwarzacz CD, napęd na 4 koła itp.) Są przechowywane w różnych tabelach w całej bazie danych. Repozytorium określa sposób ładowania i zapisywania danych. Jeśli potrzeba wielu mniejszych zapytań, dobrze, ale tylko wzorzec repozytorium musi o tym wiedzieć. Warstwa usługi wywołująca repozytorium musi tylko wiedzieć, które repozytorium ma zostać wywołane.
Można to następnie połączyć z wzorcem jednostki pracy . Tak więc w twoim przykładzie warstwa usługi powiedziałaby, że musi załadować jednostkę samochodu, ma jakiś unikalny identyfikator i wysyła ten identyfikator do repozytorium. Repozytorium zwraca jednostkę samochodu. Niektóre inne kody manipulują jednostką samochodu i odsyłają ją do repozytorium, aby można ją było zapisać.
Jeśli naprawdę chcesz wyjść na całość, warstwa repozytorium udostępnia tylko interfejsy, takie jak ICarRepository. Repozytorium zawierałoby fabrykę, której warstwa usługi użyłaby do uzyskania interfejsu ICarRepository. Cały dostęp do bazy danych byłby ukryty za interfejsem, co znacznie ułatwia testowanie jednostek.
źródło
Użyłem Wzorca Strategii do enkapsulacji dostępu do danych. Ten wzór pozwala ukryć rodzaj używanej pamięci za wspólnym interfejsem. W interfejsie określ metody dostępu do danych, nie uwzględniając typu magazynu (plik, baza danych, sieć). Następnie dla bieżącego wyboru miejsca do przechowywania, w klasie realizującej interfejs strategii, zaimplementuj szczegóły dostępu do danych. W ten sposób aplikacja nie dba o używane źródło danych.
Można również zbudować warstwę usługi, która wykorzystuje bieżącą instancję strategii przechowywania danych do definiowania bardziej szczegółowych informacji specyficznych dla aplikacji zamiast mieszania dostępu do danych i logiki biznesowej.
źródło
To jest przykład wzorca fabrycznego bazy danych;
źródło