Uygulamalar karmaşıklaştıkça, geleneksel "spagetti kod" yapısı yönetilemez hale gelir. İş mantığı, kullanıcı arayüzü (UI) çerçeveleri ve veritabanı sorgularıyla iç içe geçer; bu da test etmeyi zorlaştırır ve değişiklik yapmayı güçleştirir. İşte Altıgen Mimari (ayrıca Bağlar ve Adaptörler olarak bilinir) ve Katmanlı Mimari. Bu desenler, kodunuzu düzenlemek için sağlam bir şablon sağlar ve temel iş kurallarınızın veritabanları, web sunucuları veya kullanıcı arayüzleri gibi dış konulardan bağımsız kalmasını güvence altına alır.
Temel Prensip: Bağımlılık Tersine Çevirme
Her iki mimarinin de altın kuralı basittir: bağımlılıklar içe doğru yönelir. En iç katman, saf iş mantığınızı içerirken, dış katmanlar teknik detayları içerir. Bu, Bağımlılık Tersine Çevirme İlkesi'nin (DIP) bir uygulamasıdır. Yüksek seviyeli modüller, düşük seviyeli modüllere bağımlı olmamalıdır; her ikisi de soyutlamalara bağımlı olmalıdır.
Standart bir katmanlı mimaride, Sunum, İş ve Veri gibi katmanlar görebiliriz. Ancak, Altıgen Mimari, "etki alanı" (çekirdek mantık) ile "altyapı" (dış araçlar) arasındaki ayrımı açıkça yaparak bunu bir adım öteye taşır. Bu sayede, temel iş kurallarınıza dokunmadan MySQL veritabanını PostgreSQL'e veya bir REST API'sini gRPC'ye değiştirebilirsiniz.
Bağlar ve Adaptörler: Etkileşim Mekanizması
Altıgen mimari, sistemin şekli nedeniyle bu adıyı alır: çekirdek bir altıgendir ve bağlar, dış aktörlerin sisteme etkileşimde bulunmasını sağlayan arayüzlerdir.
- Bağlar: Altyapı tarafından değil, uygulama tarafından tanımlanan arayüzlerdir. Sistemin ne yapabileceğini tanımlarlar (örneğin,
UserRepositoryveyaPaymentGateway). - Adaptörler: Bu bağların uygulamalarıdır. Dış istekleri bağ çağrılarına çevirir ve yanıtları dış dünyaya uygun biçimde formatlar (örneğin,
JpaUserRepositoryveyaStripePaymentAdapter).
Pratik Örnek: Bağımlılık Enjeksiyonu
Basit bir kullanım durumunu ele alalım: bir kullanıcı kaydı. Sıkı bağlı bir sistemde, hizmet sınıfı doğrudan bir MysqlUserDAO örneği oluştururdu. Altıgen tasarımda ise hizmet bir arayüze bağımlıdır.
// Bağ (Arayüz) - Çekirdek/Etki Alanı katmanında tanımlanır
public interface UserRepository {
User save(User user);
Optional<User> findByEmail(String email);
}
// Uygulama Hizmeti - Yine Çekirdek katmanda
public class RegistrationService {
private final UserRepository userRepository;
// Kurucu üzerinden Bağımlılık Enjeksiyonu
public RegistrationService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public void registerUser(String email, String password) {
if (userRepository.findByEmail(email).isPresent()) {
throw new IllegalArgumentException("E-posta zaten mevcut");
}
User user = new User(email, password);
userRepository.save(user);
}
}
RegistrationService'in veritabanları, SQL veya JSON hakkında hiçbir şey bilmediğine dikkat edin. Sadece UserRepository arayüzünü bilir. Bu, birim testlerini son derece kolaylaştırır. Test sırasında sahte (mock) bir uygulama enjekte edebilirsiniz.
// Test Örneği
@Test
public void testRegistration() {
UserRepository mockRepo = mock(UserRepository.class);
RegistrationService service = new RegistrationService(mockRepo);
service.registerUser("test@example.com", "password");
verify(mockRepo).save(any(User.class));
}
Bu Yaklaşımın Faydaları
- Test Edilebilirlik: Çekirdek mantık, bir sunucu başlatmadan veya gerçek bir veritabanına bağlanmadan izole bir şekilde test edilebilir.
- Esneklik: İş mantığını yeniden düzenlemeden teknolojik uygulamaları (örneğin mesaj kuyruklarını değiştirmek gibi) değiştirebilirsiniz.
- Netlik: İş kurallarının nerede, teknik detayların ise nerede bulunduğunu anında anlamak kolaylaşır.
Sonuç
Katmanlı veya Altıgen Mimari benimsemek, başlangıçta bir zihniyet değişikliği ve daha fazla iskelet kod (arayüzler ve adaptörler) gerektirir. Ancak, sürdürülebilirlik, test edilebilirlik ve ölçeklenebilirlikteki uzun vadeli faydalar önemlidir. Bağımlılık tersine çevirmeyi sıkı bir şekilde uygulamak ve bağları adaptörlerden ayırmak sayesinde, değişime dirençli ve ekibinizin zamanla daha kolay anlayıp değiştirebileceği sistemler oluşturursunuz.