O Soyutlamaya Muhtemelen Ihtiyaciniz Yok
Bir gelistirici yeni bir projeye katilir. Kod tabanini acar ve sunlari bulur: bir AbstractBaseRepositoryInterface, bir RepositoryFactory, bir RepositoryFactoryFactory, uc katman middleware, Laravel'in yerlesik olay sistemini saran ozel bir event bus ve iki ayda gelistirilip tam olarak tek bir formu dogrulayan yapilandirma tabanli bir dogrulama motoru.
Her bir parca, bir gun yasayabilecekleri bir sorunu cozen akilli bir gelistirici tarafindan yazilmistir.
Bu asiri muhendisliktir ve yazilim gelistirmedeki en pahali sorunlardan biridir — ilk gelistirme maliyeti yuzunden degil, yarattigi suregelen bakim yuku yuzunden.
Asiri Muhendisligin Gercek Ornekleri
1. Eloquent icin Repository Pattern
Bu, Laravel dunyasindaki en yaygin ornektir:
// The "enterprise" approach
interface UserRepositoryInterface
{
public function findById(int $id): ?User;
public function findByEmail(string $email): ?User;
public function create(array $data): User;
public function update(int $id, array $data): User;
public function delete(int $id): bool;
public function paginate(int $perPage): LengthAwarePaginator;
}
class EloquentUserRepository implements UserRepositoryInterface
{
public function findById(int $id): ?User
{
return User::find($id); // That's it. That's the whole method.
}
public function findByEmail(string $email): ?User
{
return User::where('email', $email)->first();
}
// ... 50 more one-liner wrapper methods
}
// versus: just use Eloquent directly
$user = User::find($id);
$user = User::where('email', $email)->first();
Gerekce: "Ya Eloquent'ten baska bir ORM'ye gecmemiz gerekirse?"
Gercek: Gecmeyeceksiniz. Ve gecseniz bile, Eloquent'in sorgu desenleri ham SQL veya Doctrine'den temelden farkli oldugu icin repository arayuzu sizi kurtarmaz. Zaten her seyi yeniden yazardiniz.
2. Belirli Sorunlar icin Genel Servisler
// Over-engineered: a configurable notification pipeline
class NotificationPipeline
{
private array $channels = [];
private array $filters = [];
private array $transformers = [];
private ?RetryStrategy $retryStrategy = null;
private ?RateLimiter $rateLimiter = null;
public function addChannel(NotificationChannel $channel): self { /* ... */ }
public function addFilter(NotificationFilter $filter): self { /* ... */ }
public function addTransformer(MessageTransformer $transformer): self { /* ... */ }
public function setRetryStrategy(RetryStrategy $strategy): self { /* ... */ }
public function setRateLimiter(RateLimiter $limiter): self { /* ... */ }
public function dispatch(Notification $notification): NotificationResult { /* ... */ }
}
// What the app actually needs:
Mail::to($user)->send(new OrderConfirmation($order));
3. Erken Mikroservisler
Monolit dakikada 100 istek karsilamaktadir. Takim "olceklenebilirlik icin" onu 12 mikroservise bolmeye karar verir. Artik sunlara ihtiyaclari vardir: servis kesfetme, API gateway'leri, dagitik izleme, servisler arasi mesaj kuyruklar, nihai tutarlilik yonetimi ve bir Kubernetes kumesi.
Uygulama hala dakikada 100 istek karsilamaktadir.
Asiri Muhendislik Yaptiginizin Isaretleri
- Varsayimsal gelecek gereksinimleri icin kod yaziyorsunuz — "Bir gun buna ihtiyacimiz olabilir"
- Soyutlamanizin tam olarak tek bir uygulamasi var — Arkasinda tek bir sinif olan bir arayuz, sadece bir arayuz vergisidir
- Yeni takim uyeleri basit bir ozellik ekleyebilmek icin "mimari tanitima" ihtiyac duyuyor
- Bir ozellik eklemek, mantik basit olmasina ragmen 8'den fazla dosyada degisiklik gerektiriyor
- Ozelligin kendisinden cok altyapi uzerinde zaman harciyorsunuz
- DRY yeniden duzenlemeniz ilgisiz seyleri birlestirdi — Bugun birbirine benzeyen iki sey yarin farklilasilabilir
Ucler Kurali
Soyutlama icin faydali bir yonerge:
- Ilk seferinde: Sadece kodu yazin
- Ikinci seferinde: Tekrari fark edin, ancak soyutlama durtusune direnin. Kopyala-yapistir gayet uygundur.
- Ucuncu seferinde: Artik elinizde uc somut ornek var. Gercek deseni gorebilir ve anlamli bir soyutlama olusturabilirsiniz.
// First and second time: just write the validation
$request->validate(['email' => 'required|email|unique:users']);
$request->validate(['email' => 'required|email|unique:admins']);
// Third time: NOW extract it (if the pattern is genuinely the same)
// But honestly, this is Laravel — the above is already clean enough.
Karmasikligin Hakli Oldugu Durumlar
Her karmasik kod asiri muhendislik degildir. Bazen soyutlamaya gercekten ihtiyaciniz vardir:
- Birden fazla odeme agirligi — Strategy pattern, 3 veya daha fazla saglayiciyla haklidir
- Cok kiracili veri izolasyonu — Karmasiklik gercek bir guvenlik gereksinimini karsilar
- Mevzuat uyumlulugu — HIPAA/GDPR denetim izleri, event sourcing desenlerini hakli kilar
- Kanitlanmis performans darbogazlari — Onbellek katmanlari, sorunu olctugunuzde haklidir
Panzehir
"Calisan en basit sey" tembellik degil — disiplindir. Basit kod yazmak, karmasik kod yazmaktan daha fazla beceri gerektirir. Karmasiklik varsayilandir; basitlik basaridir.
- Yarinin varsayimlari icin degil, bugunun gereksinimleri icin kod yazin
- Optimize etmeden once olcun
- Heyecan verici teknoloji yerine sikici teknolojiyi tercih edin
- Mimarinizi 5 dakikada aciklayamiyorsaniz, muhtemelen fazla karmasiktir
- Kodu acimasizca silin. Her kod satiri bir yukumluluktur.