Wzorzec Repository w Clean Architecture
Zaimplementuj wzorzec Repository, aby abstrahować dostęp do danych i umożliwić Use Cases korzystanie z utrwalonych danych bez znajomości szczegółów ich przechowywania.
Wzorzec Repository w Clean Architecture to bezpłatna lekcja Clean Architecture & Design Patterns in Practice na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Clean Architecture & Design Patterns in Practice, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Clean Architecture & Design Patterns in Practice zawiera 4 lekcji w sumie.
Części tej lekcji nie zostały jeszcze przetłumaczone i są wyświetlane po angielsku.
What's the Repository Pattern?
In Clean Architecture, we want our core business logic (Use Cases) to be independent of external details like databases or web frameworks.
The Repository Pattern helps achieve this by abstracting the way data is stored and retrieved. It acts as a mediator between the domain and data mapping layers.
The Problem: Direct Data Access
Imagine your Use Case directly querying a database or calling an ORM (Object-Relational Mapper) like Hibernate or Entity Framework.
- Your Use Case becomes coupled to the database technology.
- Changing the database means changing the Use Case.
- Testing Use Cases requires a live database connection.
This violates the Dependency Rule of Clean Architecture, which states that dependencies should only point inwards.
Introducing the Repository Interface
The solution is to define an interface (a contract) for data access within your Use Case layer. This interface is the Repository.
It declares methods like findById(), save(), or findAll(). The Use Case layer owns this interface, meaning it defines what data operations it needs.
Code: User & Repository Interface
First, we define a simple User entity. Then, the UserRepository interface specifies the contract for how we'll interact with User data.
public class User {
String id;
String name;
public User(String id, String name) {
this.id = id; this.name = name;
}
public String getId() { return id; }
public String getName() { return name; }
@Override public String toString() {
return name + " (" + id + ")";
}
}
public interface UserRepository {
User findById(String id);
void save(User user);
}
public class Main {
public static void main(String[] args) {
System.out.println("User entity and UserRepository interface defined.");
}
}Repository Implementations
While the interface lives in your core domain, the concrete implementation of the Repository lives in an outer layer, typically the 'Interface Adapters' or 'Frameworks/Drivers' layer.
This implementation knows the details of the specific persistence technology (e.g., SQL database, NoSQL database, external API, or even in-memory storage).
Code: In-Memory Implementation
Here's an example of an InMemoryUserRepository. It implements the UserRepository interface using a simple HashMap, simulating a database for testing or simple applications.
// Assume User and UserRepository exist
import java.util.HashMap;
import java.util.Map;
public class InMemoryUserRepository implements UserRepository {
private final Map<String, User> users = new HashMap<>();
@Override
public User findById(String id) {
return users.get(id);
}
@Override
public void save(User user) {
users.put(user.getId(), user);
}
}
public class Main {
public static void main(String[] args) {
InMemoryUserRepository repo = new InMemoryUserRepository();
User newUser = new User("001", "Charlie");
repo.save(newUser);
User found = repo.findById("001");
System.out.println("Found user: " + found.getName());
}
}Use Cases & Repositories
A Use Case receives an instance of the UserRepository interface through dependency injection (e.g., via its constructor).
The Use Case then calls methods on this interface, completely unaware of whether it's talking to an in-memory map, a SQL database, or a remote API. This is true decoupling!
Code: Use Case with Repository
This CreateUserUseCase depends only on the UserRepository interface, not its specific implementation. This makes it highly testable and flexible.
// Assume User, UserRepository, InMemoryUserRepository exist
public class CreateUserUseCase {
private final UserRepository userRepository;
public CreateUserUseCase(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User execute(String id, String name) {
User newUser = new User(id, name);
userRepository.save(newUser);
return newUser;
}
}
public class Main {
public static void main(String[] args) {
// Inject the in-memory implementation
UserRepository repo = new InMemoryUserRepository();
CreateUserUseCase createUser = new CreateUserUseCase(repo);
User createdUser = createUser.execute("002", "Diana");
System.out.println("Created user: " + createdUser.getName());
User found = repo.findById("002");
System.out.println("Verified in repo: " + found.getName());
}
}Benefits of Repositories in Clean Arch
Using the Repository Pattern offers significant advantages:
- Decoupling: Business rules are isolated from data storage details.
- Testability: Use Cases can be tested with mock or in-memory repositories.
- Flexibility: Easily swap data sources (e.g., from SQL to NoSQL) without changing core logic.
- Maintainability: Changes in data access technology are localized to repository implementations.
Quick Check on Repositories
The Repository Pattern is a cornerstone for maintaining separation of concerns in Clean Architecture.
Repository Pattern: Recap
You've learned about the Repository Pattern and its crucial role in Clean Architecture!
- It abstracts data access from your core business logic.
- It uses an interface (owned by the domain) and concrete implementations (in outer layers).
- This approach greatly enhances decoupling, testability, and flexibility.
By implementing Repositories, you ensure your Use Cases remain clean, focused, and independent of external data storage mechanisms.
Ucz się Clean Architecture & Design Patterns in Practice dzięki korepetycjom AI — za darmo
Pisz i uruchamiaj kod w przeglądarce, otrzymuj natychmiastową pomoc od korepetytora AI dostępnego 24/7 i kontynuuj naukę w sieci lub w aplikacji.
- Kursy
- 12
- Lekcje
- 48
Często zadawane pytania
Czy lekcja „Wzorzec Repository w Clean Architecture” jest bezpłatna?
Tak — pełny tekst „Wzorzec Repository w Clean Architecture” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Clean Architecture & Design Patterns in Practice, przejdź na CoddyKit PRO. Kurs Clean Architecture & Design Patterns in Practice zawiera 4 lekcji w sumie.
Co nauczysz się w „Wzorzec Repository w Clean Architecture”?
Zaimplementuj wzorzec Repository, aby abstrahować dostęp do danych i umożliwić Use Cases korzystanie z utrwalonych danych bez znajomości szczegółów ich przechowywania. Ćwiczysz Clean Architecture & Design Patterns in Practice z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Clean Architecture & Design Patterns in Practice?
Nie wymagamy żadnego doświadczenia. Clean Architecture & Design Patterns in Practice w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Wzorzec Repository w Clean Architecture”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Clean Architecture & Design Patterns in Practice?
Tak. Każda lekcja Clean Architecture & Design Patterns in Practice zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Wzorzec Repository w Clean Architecture
- Interfejsy Gateway dla systemów zewnętrznych
- Data Mappers i DTO
- Warstwy antykorupcyjne dla API firm trzecich