Takip et

Kuru Geliştirme (DRY – Don’t Repeat Yourself) Prensibi: Yazılımda Tekrarı Önlemek

Kuru Geliştirme (DRY – Don’t Repeat Yourself) Prensibi: Yazılımda Tekrarı Önlemek Yazılım geliştirme dünyasında, kod kalitesini, sürdürülebilirliğini ve yönetilebilirliğini artırmak için birçok prensip ve metodoloji ortaya konulmuştur.

Kuru Geliştirme (DRY – Don’t Repeat Yourself) Prensibi: Yazılımda Tekrarı Önlemek

Yazılım geliştirme dünyasında, kod kalitesini, sürdürülebilirliğini ve yönetilebilirliğini artırmak için birçok prensip ve metodoloji ortaya konulmuştur. Bu prensiplerin başında gelenlerden biri de “DRY” (Don’t Repeat Yourself – Kendini Tekrar Etme) prensibidir. DRY, yazılım mühendisliğinde temel bir ilke olup, kodun tekrarını önleyerek daha temiz, daha verimli ve daha bakımı kolay sistemler oluşturmayı hedefler. Bu makalede, DRY prensibinin ne olduğunu, neden bu kadar önemli olduğunu, yazılımcıların bu prensibi uygulamak için hangi teknikleri kullanabileceğini ve aşırıya kaçmanın potansiyel tuzaklarını detaylı bir şekilde inceleyeceğiz.

DRY Prensibi Nedir?

DRY prensibi, ilk olarak Andy Hunt ve Dave Thomas tarafından “The Pragmatic Programmer” adlı kitaplarında popülerleştirilmiştir. Temel olarak, “Her bilgi parçası sistem içinde tek, açık ve yetkili bir temsile sahip olmalıdır” ilkesini savunur. Buradaki “bilgi parçası” sadece kod satırları anlamına gelmez; aynı zamanda veritabanı şemaları, test senaryoları, yapılandırma dosyaları, belgeler ve hatta iş mantığı gibi her türlü bilgiyi kapsar.

Yazılım geliştirme sürecinde, bir iş kuralının veya bir hesaplama mantığının birden fazla yerde tanımlanması veya uygulanması durumu sıkça karşılaşılan bir problemdir. Örneğin, bir kullanıcının yaşını hesaplayan bir kod bloğunun hem kullanıcı profil sayfasında, hem raporlama modülünde, hem de bildirim servisinde ayrı ayrı yazıldığını düşünün. Bu, DRY prensibinin doğrudan ihlalidir. DRY prensibi, bu tür tekrarların önüne geçerek, aynı mantığın tek bir yerde tanımlanmasını ve diğer yerlerin bu tek tanıma başvurmasını (referans vermesini) sağlar.

Prensibin özü, bir sistemde aynı bilginin veya mantığın birden fazla yerde bulunmasının ciddi maliyetlere yol açmasıdır. Tekrar, sadece kod satırlarının kopyalanması anlamına gelmez; aynı zamanda aynı işlevselliğin farklı adlarla veya biraz farklı varyasyonlarla birden fazla kez uygulanması da bir tekrar biçimidir. DRY, bu tür tekrarların ortadan kaldırılmasıyla yazılımın kalitesini artırmayı ve geliştirme süreçlerini optimize etmeyi amaçlar.

Neden DRY Prensibi Bu Kadar Önemli? Tekrarın Maliyetleri

Tekrar eden kod (veya bilgi), başlangıçta zaman kazandırıyor gibi görünse de, uzun vadede projelere ciddi maliyetler yükler. Bu maliyetler sadece finansal değil, aynı zamanda zaman, emek ve sistemin genel sağlığı üzerinde de olumsuz etkiler yaratır.

Bakım Zorluğu ve Yüksek Maliyet

Bir iş kuralının veya bir hesaplama mantığının birden fazla yerde tekrarlandığını varsayalım. Bu mantıkta bir değişiklik yapılması gerektiğinde, geliştiricinin sistemdeki tüm kopyalarını bulup güncellemesi gerekir. Bu süreç, özellikle büyük ve karmaşık projelerde son derece zaman alıcı ve hataya açık olabilir. Geliştiricinin bir kopyayı gözden kaçırması durumunda, sistemde tutarsız davranışlar ve beklenmedik hatalar ortaya çıkar. Bu durum, bakım maliyetlerini doğrudan artırır. DRY prensibi uygulandığında, bir mantık tek bir yerde bulunur ve değişiklikler sadece o tek noktada yapılır, bu da bakım sürecini basitleştirir ve maliyetleri düşürür.

Hata Olasılığının Artması

Tekrar eden kod, hata olasılığını katlayarak artırır. Bir kod bloğunda bir hata tespit edildiğinde, bu hatanın tüm kopyalarında düzeltilmesi gerekir. Eğer bu düzeltme tüm kopyalara uygulanmazsa, sistemde farklı yerlerde farklı davranışlar sergileyen ve farklı sonuçlar üreten hatalı kod parçaları kalır. Bu durum, hata ayıklama sürecini kabusa çevirebilir ve sistemin güvenilirliğini ciddi şekilde zedeleyebilir. DRY, hatanın tek bir yerde düzeltilmesini sağlayarak, hatanın yayılmasını engeller ve sistemin genel kalitesini artırır.

Geliştirme Süresinin Uzaması

Aynı veya benzer işlevselliği tekrar tekrar yazmak, geliştiricinin zamanını boşa harcar. Her yeni özellik eklemede veya mevcut bir özelliği genişletmede, geliştiricinin zaten var olan bir mantığı yeniden düşünmesi ve kodlaması gerekir. Bu durum, geliştirme hızını düşürür ve projenin teslim sürelerini uzatabilir. DRY prensibi, mevcut, test edilmiş ve güvenilir kod parçalarının yeniden kullanılmasını teşvik ederek, geliştirme sürecini hızlandırır ve geliştiricilerin daha yaratıcı ve karmaşık sorunlara odaklanmasına olanak tanır.

Kod Şişkinliği (Code Bloat) ve Anlaşılabilirlik Zorluğu

Tekrar eden kod, kod tabanının gereksiz yere büyümesine neden olur. Bu “kod şişkinliği”, projenin genel boyutunu artırır, derleme sürelerini uzatır ve kaynak tüketimini artırabilir. Daha da önemlisi, tekrar eden kod, kodun okunabilirliğini ve anlaşılabilirliğini zorlaştırır. Aynı mantığın farklı varyasyonlarla veya farklı bağlamlarda tekrar tekrar görülmesi, yeni geliştiricilerin sisteme adapte olmasını güçleştirir ve mevcut geliştiricilerin bile kodun amacını anlamasını karmaşık hale getirir. DRY, kod tabanını daha kompakt, daha düzenli ve daha kolay anlaşılır hale getirir.

Test Zorluğu

Tekrar eden kod, test süreçlerini de olumsuz etkiler. Aynı mantığın birden fazla kopyası varsa, bu kopyaların her birinin ayrı ayrı test edilmesi gerekir. Bu, test senaryolarının sayısını artırır, test süresini uzatır ve test kapsamının eksik kalma riskini artırır. DRY prensibi sayesinde, bir mantık tek bir yerde uygulandığında, sadece o tek kod parçasının kapsamlı bir şekilde test edilmesi yeterlidir. Bu, test süreçlerini basitleştirir, test süresini kısaltır ve testlerin daha güvenilir olmasını sağlar.

DRY Prensibini Uygulama Yöntemleri ve Teknikler

DRY prensibini uygulamak için birçok farklı teknik ve araç mevcuttur. Bu teknikler, farklı soyutlama seviyelerinde ve farklı programlama paradigmalarında kullanılabilir.

Fonksiyonlar ve Metotlar

Tekrar eden kod bloklarını ortadan kaldırmanın en temel ve yaygın yolu, onları bir fonksiyona veya metoda taşımaktır. Eğer aynı işlem birden fazla yerde yapılıyorsa, bu işlemi bir fonksiyon içine alarak ve her ihtiyaç duyulduğunda bu fonksiyonu çağırarak kod tekrarını önleyebilirsiniz. Bu, özellikle prosedürel programlamada yaygın olarak kullanılan bir yaklaşımdır.

# DRY öncesi: Tekrar eden kod
def calculate_total_order_page1(price, quantity, tax_rate):
    subtotal = price * quantity
    tax = subtotal * tax_rate
    total = subtotal + tax
    return total

def calculate_total_order_page2(price, quantity, tax_rate):
    subtotal = price * quantity
    tax = subtotal * tax_rate
    total = subtotal + tax
    return total

DRY sonrası: Fonksiyon kullanımı

def calculate_order_total(price, quantity, tax_rate): subtotal = price * quantity tax = subtotal * tax_rate total = subtotal + tax return total order1_total = calculate_order_total(100, 2, 0.18) order2_total = calculate_order_total(50, 3, 0.18)

Sınıflar ve Nesneler (Nesne Tabanlı Programlama)

Nesne Tabanlı Programlama (OOP), DRY prensibini doğal olarak destekler. Ortak davranışları ve verileri sınıflar içinde kapsülleyerek, bu sınıfların nesnelerini farklı yerlerde kullanabiliriz. Bir sınıf, belirli bir varlığın özelliklerini (nitelikler) ve davranışlarını (metotlar) tek bir yerde tanımlar. Bu sayede, aynı varlığın farklı örnekleri için kod tekrarı engellenir.

// DRY öncesi: Tekrar eden veri ve davranış tanımları
public class UserRegistrationService {
    public void registerUser(String username, String email, String password) {
        // Kullanıcı doğrulama, şifreleme, veritabanı kaydı gibi işlemler
        System.out.println("Kullanıcı " + username + " kaydedildi.");
    }
}

public class AdminRegistrationService {
    public void registerAdmin(String username, String email, String password) {
        // Benzer doğrulama, şifreleme, veritabanı kaydı işlemleri
        System.println("Admin " + username + " kaydedildi.");
    }
}

// DRY sonrası: Ortak bir soyutlama (örneğin User sınıfı ve bir servis)
public class User {
    private String username;
    private String email;
    private String passwordHash; // Şifre doğrudan saklanmaz

    public User(String username, String email, String password) {
        this.username = username;
        this.email = email;
        this.passwordHash = hashPassword(password); // Şifreleme mantığı
    }

    private String hashPassword(String password) {
        // Şifreleme algoritması
        return "hashed_" + password;
    }

    // Getter metotları
}

public class UserService {
    public void register(User user) {
        // Doğrulama, veritabanı kaydı gibi işlemler
        System.out.println(user.getUsername() + " kaydedildi.");
    }
}

// Kullanım
User newUser = new User("ahmet", "ahmet@example.com", "parola123");
UserService userService = new UserService();
userService.register(newUser);

Modüller ve Kütüphaneler

Daha geniş ölçekte, ortak işlevsellikleri ayrı modüller veya kütüphaneler halinde paketleyip farklı projelerde veya uygulamanın farklı bölümlerinde kullanmak da DRY prensibinin önemli bir uygulamasıdır. Örneğin, bir tarih formatlama modülü veya bir matematiksel hesaplama kütüphanesi oluşturmak, bu işlevselliklerin her projede yeniden yazılmasını engeller.

Kalıtım (Inheritance)

Kalıtım, nesne tabanlı programlamada ortak özellikleri ve davranışları üst sınıfta tanımlayıp alt sınıfların bunları miras almasını sağlayan bir mekanizmadır. Bu, kod tekrarını azaltır ancak dikkatli kullanılmalıdır. Aşırı veya yanlış kalıtım hiyerarşileri, “elmas problemi” gibi sorunlara veya katı bağlılıklara yol açabilir. Genellikle “kompozisyon kalıtıma tercih edilmeli” (favor composition over inheritance) prensibi tavsiye edilir.

Kompozisyon (Composition)

Kompozisyon, bir sınıfın diğer sınıfların nesnelerini içermesi yoluyla işlevsellikleri bir araya getirmesidir. Bu, kalıtıma göre daha esnek ve daha az bağımlılık yaratan bir yaklaşımdır. Ortak davranışlar ayrı sınıflar olarak tanımlanır ve ihtiyaç duyan sınıflar bu davranışları “kullanır” (has-a ilişkisi).

// Kalıtım yerine kompozisyon örneği
interface Flyable {
    void fly();
}

class Wings implements Flyable {
    public void fly() {
        System.out.println("Kanatlarla uçuyor.");
    }
}

class JetEngine implements Flyable {
    public void fly() {
        System.out.println("Jet motoruyla uçuyor.");
    }
}

class Bird {
    private Flyable flyBehavior;

    public Bird(Flyable flyBehavior) {
        this.flyBehavior = flyBehavior;
    }

    public void performFly() {
        flyBehavior.fly();
    }
}

// Kullanım
Bird eagle = new Bird(new Wings());
eagle.performFly(); // Kanatlarla uçuyor.

Bird jetPlane = new Bird(new JetEngine());
jetPlane.performFly(); // Jet motoruyla uçuyor.

Şablonlar (Templates)

Web geliştirme, belge oluşturma veya kod üretimi gibi alanlarda tekrar eden yapıları şablonlarla yönetmek, DRY prensibinin önemli bir uygulamasıdır. HTML şablon motorları (Jinja2, Thymeleaf, Handlebars), CSS preprocessor’ları (Sass, Less) veya kod üretme araçları (code generators) bu kategoriye girer.

Veritabanı Normalizasyonu

Veritabanı tasarımında, veri tekrarını önlemek için normalizasyon kuralları uygulanır. Veri tekrarı, veritabanının boyutunu artırmanın yanı sıra, veri tutarsızlıklarına ve güncelleme anomalilerine yol açabilir. Normalizasyon, verileri daha küçük, ilişkili tablolara ayırarak bu sorunların önüne geçer.

Tasarım Kalıpları (Design Patterns)

Tasarım kalıpları, belirli yazılım sorunlarına kanıtlanmış, tekrar kullanılabilir çözümler sunar. Örneğin, “Strateji” kalıbı, bir algoritmanın farklı varyasyonlarını ayrı sınıflara taşıyarak kod tekrarını önler. “Fabrika” kalıbı, nesne oluşturma mantığını tek bir yerde toplayarak client kodunda tekrarı engeller. “Şablon Metot” kalıbı, bir algoritmanın genel yapısını bir üst sınıfta tanımlayıp alt sınıfların belirli adımları kendi ihtiyaçlarına göre implemente etmesini sağlar.

Konfigürasyon Yönetimi

Sabit kodlanmış (hardcoded) değerler yerine, uygulama ayarlarını ve parametrelerini dışarıdan konfigürasyon dosyaları (JSON, YAML, .env vb.) veya ortam değişkenleri aracılığıyla yönetmek, DRY prensibine uygun bir yaklaşımdır. Bu sayede, farklı ortamlar (geliştirme, test, üretim) için aynı kod tabanı kullanılabilir ve sadece konfigürasyon değiştirilerek uygulama davranışı adapte edilebilir.

Jenerik Programlama (Generics)

Jenerik programlama, türden bağımsız algoritmalar ve veri yapıları oluşturmayı sağlar. Örneğin, bir liste veya kuyruk veri yapısı, farklı türdeki elemanları barındırabilir ve bu veri yapısının kodunun her tür için ayrı ayrı yazılmasına gerek kalmaz. Bu, özellikle tip güvenliği sağlayan dillerde (Java, C#, TypeScript) önemli bir DRY aracıdır.

DRY’ı Aşırıya Kaçırmamak: WET ve A-DRY

DRY prensibi son derece değerli olsa da, her prensip gibi aşırıya kaçıldığında veya yanlış anlaşıldığında zararlı sonuçlar doğurabilir. Burada iki önemli kavram ortaya çıkar: WET ve A-DRY.

WET (Write Everything Twice / We Enjoy Typing)

WET, DRY prensibinin tam tersidir. Bu durum, geliştiricilerin bilinçli veya bilinçsiz olarak aynı kodu tekrar tekrar yazması anlamına gelir. WET kodu, yukarıda bahsedilen tüm bakım, hata, anlaşılabilirlik ve geliştirme süresi maliyetlerini taşır. Amacımız her zaman WET’ten kaçınmak olmalıdır.

A-DRY (Accidentally Don’t Repeat Yourself – Yanlışlıkla Kendini Tekrar Etme)

A-DRY, DRY prensibini yanlış veya erken uygulamaktan kaynaklanan bir sorundur. Bu durum genellikle şu şekillerde ortaya çıkar:

1. Yanlış Soyutlama (False Abstraction): Geliştiriciler, farklı bağlamlarda sadece yüzeysel olarak benzer görünen kod parçalarını tek bir soyutlama altında birleştirmeye çalışabilirler. Bu kod parçaları başlangıçta aynı görünse de, gelecekte farklı yönlerde evrimleşme potansiyeline sahip olabilirler. Onları erken birleştirmek, daha sonra bu soyutlamayı bozmak veya karmaşıklaştırmak zorunda kalmaya yol açar. Sonuç, daha karmaşık, daha az esnek ve anlaşılması daha zor bir koddur.

2. Erken Optimizasyon (Premature Optimization): Gelecekteki olası ihtiyaçlar veya senaryolar için şimdiden soyutlamalar yapmak, “İhtiyacın Olmayacak” (YAGNI – You Ain’t Gonna Need It) prensibine aykırıdır. Bir kod parçasının gerçekten tekrar edip etmeyeceği veya farklı bağlamlarda aynı kalıp kalmayacağı belli değilken soyutlama yapmak, gereksiz karmaşıklık ve ek yük getirebilir.

A-DRY’ın sonuçları, DRY’ın faydalarını tamamen ortadan kaldırabilir. Ortaya çıkan soyutlama, gerçekte olduğundan daha karmaşık hale gelir, esnekliğini kaybeder ve bakımını zorlaştırır. Bu nedenle, DRY prensibini uygularken ne zaman durulacağını bilmek çok önemlidir.

“Üç Kuralı” (Rule of Three)

Bu noktada “Üç Kuralı” faydalı bir rehber olabilir:
* Bir kod parçası bir kez göründüğünde, onu olduğu gibi bırakın.
* Bir kod parçası iki kez göründüğünde, hala bir soyutlama yapmayı düşünmeyin (şimdilik).
* Bir kod parçası üçüncü kez göründüğünde, o zaman bir soyutlama yapmayı düşünmenin zamanı gelmiştir.

Bu kural, erken soyutlamadan kaçınmak ve sadece gerçekten tekrar eden ve istikrarlı olduğu anlaşılan mantıklar için soyutlama yapmak için bir kılavuz görevi görür. Esneklik ve basitlik arasındaki dengeyi bulmak, deneyim ve iyi bir yargı gerektirir.

DRY ve Diğer Yazılım Prensipleri

DRY prensibi, yazılım mühendisliğindeki diğer temel prensiplerle yakından ilişkilidir ve genellikle onlarla birlikte daha etkili sonuçlar verir.

SOLID Prensipleri

DRY, özellikle SOLID prensipleriyle güçlü bir sinerji içindedir:

* SRP (Single Responsibility Principle – Tek Sorumluluk Prensibi): Bir sınıfın veya modülün yalnızca tek bir sorumluluğu olmalıdır. Bu prensip uygulandığında, belirli bir sorumluluğa ait mantık sadece bir yerde bulunur ve bu da doğal olarak DRY’ı destekler. Eğer bir sınıfın birden fazla sorumluluğu varsa, o sorumluluklara ait kodlar tekrar etme eğiliminde olabilir.
* OCP (Open/Closed Principle – Açık/Kapalı Prensibi): Yazılım varlıkları (sınıflar, modüller, fonksiyonlar vb.) geliştirmeye açık, ancak değişikliğe kapalı olmalıdır. Bu, mevcut kodu değiştirmeden yeni işlevsellik eklemeyi sağlar. Yeni özellikler eklerken mevcut kodu tekrar tekrar kopyalamak yerine, genişletme mekanizmaları (kalıtım, kompozisyon, arayüzler) kullanarak DRY prensibini destekler.
* LSP (Liskov Substitution Principle – Liskov Yerine Geçme Prensibi): Alt sınıflar, üst sınıfların yerine geçebilir olmalıdır. Bu prensip, ortak arayüzler ve davranışlar yoluyla kod tekrarını azaltır ve daha tutarlı bir hiyerarşi sağlar.
* ISP (Interface Segregation Principle – Arayüz Ayırma Prensibi): İstemciler, kullanmadıkları arayüzlere bağımlı olmaya zorlanmamalıdır. Küçük, özelleşmiş arayüzler oluşturmak, sınıfların sadece ihtiyaç duydukları metotları uygulamalarını sağlar ve gereksiz implementasyon tekrarını önler.
* DIP (Dependency Inversion Principle – Bağımlılık Tersine Çevirme Prensibi): Yüksek seviyeli modüllerin düşük seviyeli modüllere bağımlı olmaması, soyutlamalar üzerinden iletişim kurması gerekir. Bu prensip, modüllerin daha az bağımlı ve daha tekrar kullanılabilir olmasını sağlayarak DRY’ı destekler.

YAGNI (You Ain’t Gonna Need It – İhtiyacın Olmayacak)

YAGNI prensibi, “İhtiyaç duymayacağın bir şeyi ekleme” der. Bu, gelecekteki olası ihtiyaçlar için gereksiz yere soyutlamalar veya genellemeler yapmaktan kaçınmayı teşvik eder. YAGNI, A-DRY’dan kaçınmak için DRY ile birlikte düşünülmesi gereken kritik bir prensiptir. Yalnızca mevcut ve kesinleşmiş tekrarlar için soyutlama yapmak, gereksiz karmaşıklığı önler.

KISS (Keep It Simple, Stupid – Basit Tut, Aptal)

KISS prensibi, karmaşık çözümler yerine her zaman en basit çözümü aramayı önerir. DRY prensibini uygularken, karmaşık soyutlamalar veya tasarım kalıpları kullanmak yerine, mümkün olduğunca basit ve anlaşılır bir çözüm bulmak önemlidir. Bazen basit bir fonksiyon veya küçük bir sınıf, karmaşık bir kalıtım hiyerarşisinden daha DRY ve daha yönetilebilir olabilir.

DRY’ın Faydaları Özetle

DRY prensibini uygulamanın yazılım projeleri için sayısız faydası vardır:

* Daha Az Kod: Kod tabanının genel boyutunu küçültür, bu da daha az dosya ve daha az satır kodu anlamına gelir.
* Daha Kolay Bakım ve Güncelleme: Bir iş kuralı veya mantık tek bir yerde tanımlandığı için, değişiklikler sadece o tek noktada yapılır ve sistem genelinde tutarlılık sağlanır.
* Daha Az Hata: Hataların tek bir yerde düzeltilmesi, hatanın sistem genelinde yayılmasını engeller ve hata ayıklama sürecini basitleştirir.
* Daha Hızlı Geliştirme: Mevcut, test edilmiş ve güvenilir kod parçalarının yeniden kullanılması, geliştirme hızını artırır.
* Daha Anlaşılır ve Okunabilir Kod: Tekrar eden kodun olmaması, kodun amacını anlamayı kolaylaştırır ve yeni geliştiricilerin projeye adaptasyonunu hızlandırır.
* Daha Test Edilebilir Kod: Soyutlanmış ve tek sorumluluğa sahip kod parçaları, birim testlerinin yazılmasını ve uygulanmasını kolaylaştırır.
* Daha Esnek ve Genişletilebilir Sistemler: İyi tasarlanmış soyutlamalar, sistemin gelecekteki değişikliklere ve yeni özelliklere daha kolay adapte olmasını sağlar.

Sonuç

DRY (Don’t Repeat Yourself) prensibi, modern yazılım geliştirmenin temel taşlarından biridir. Tekrar eden kodu, bilgiyi ve iş mantığını ortadan kaldırarak, yazılımın kalitesini, sürdürülebilirliğini ve yönetilebilirliğini önemli ölçüde artırır. Bakım maliyetlerini düşürür, hata olasılığını azaltır, geliştirme hızını artırır ve daha anlaşılır sistemler oluşturur.

Ancak, DRY prensibini uygularken dengeli bir yaklaşım benimsemek esastır. Erken soyutlamadan, yanlış genellemelerden ve gereksiz karmaşıklıktan kaçınmak için “Üç Kuralı” ve YAGNI gibi prensiplerle birlikte düşünülmelidir. En iyi uygulamalar, yalnızca gerçek ve istikrarlı tekrarlar için soyutlama yapmayı, basit ve anlaşılır çözümleri tercih etmeyi ve SOLID prensipleri gibi diğer tasarım ilkeleriyle uyumlu çalışmayı gerektirir.

Sonuç olarak, DRY prensibi, sadece kod yazma alışkanlığından öte, bir düşünce biçimidir. Geliştiricilerin sürekli olarak kod tabanlarını gözden geçirmelerini, potansiyel tekrarları tespit etmelerini ve bunları zarif ve esnek soyutlamalarla çözmelerini teşvik eder. Bu sürekli çaba, uzun vadede daha sağlam, daha verimli ve daha başarılı yazılım projelerine yol açar. İyi yazılım, DRY bir yazılımdır.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.