275 okumalar

Refactoring 027 - Nasıl Getters çıkarmak için

ile Maximiliano Contieri7m2025/04/20
Read on Terminal Reader

Çok uzun; Okumak

Getterleri, iç durumunu ortaya çıkarmak yerine işlemleri gerçekleştiren davranışsal zengin yöntemlerle kaldırın veya değiştirin.
featured image - Refactoring 027 - Nasıl Getters çıkarmak için
Maximiliano Contieri HackerNoon profile picture

Veri erişiminin ötesinde nesnenin davranışını serbest bırakın

Şöyle

TL;DR: İç durumu ortaya çıkarmak yerine işlemleri gerçekleştiren davranışsal zengin yöntemlerle getterleri kaldırın veya değiştirin.

Şöyle

TL;DR: İç durumu ortaya çıkarmak yerine işlemleri gerçekleştiren davranışsal zengin yöntemlerle getterleri kaldırın veya değiştirin.

Sorunlar Çözüldü

    Şöyle
  • Anemik nesneler
  • Şöyle
  • aşırı bağlantı
  • Şöyle
  • Kayıp Kapsül
  • Şöyle
  • Mutasyon Özellikleri
  • Şöyle
  • Demeter Yasası ihlalleri
  • Şöyle
  • Bilgi Kaybı
  • Şöyle
  • Açık içerikler
  • Şöyle
  • İlkel obsesyon
  • Şöyle

Etiket Arşivi: koku

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxix

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiii

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-i-xqz3evd

HTTPS://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv

Adımlar

    Şöyle
  1. İçsel nesne durumunu ortaya koyan getterleri tanımlayın
  2. Şöyle
  3. Codebase'deki tüm kullanıma bakın
  4. Şöyle
  5. Gönder davranışı, getter'ı nesnenin kendisinde kullanır
  6. Şöyle
  7. İşlemleri gerçekleştiren niyet ortaya çıkarma yöntemleri oluşturun (git önbelleği kaldırın)
  8. Şöyle
  9. Yeni yöntemleri kullanmak için kodunuzu güncelleyin
  10. Şöyle

Kod örnekleri

Önceden

public class Invoice {
    private List<LineItem> items;
    private Customer customer;
    private LocalDate dueDate;
    
    public Invoice(Customer customer, LocalDate dueDate) {
        this.customer = customer;
        this.dueDate = dueDate;
        this.items = new ArrayList<>();
    }
    
    public void addItem(LineItem item) {
        // This is the right way 
        // to manipulate the internal consistency
        // adding assertions and access control if necessary
        items.add(item);
    }
    
    public List<LineItem> getItems() {
        // You are exposing your internal implementation
        // In some languages, you also open a backdoor to
        // manipulate your own collection unless you return
        // a copy
        return items;
    }
    
    public Customer getCustomer() {
        // You expose your accidental implementation
        return customer;
    }
    
    public LocalDate getDueDate() {
        // You expose your accidental implementation
        return dueDate;
    }
}
 
Invoice invoice = new Invoice(customer, dueDate);
// Calculate the total violating encapsulation principle
double total = 0;
for (LineItem item : invoice.getItems()) {
    total += item.getPrice() * item.getQuantity();
}

// Check if the invoice is overdue
boolean isOverdue = LocalDate.now().isAfter(invoice.getDueDate());

// Print the customer information
System.out.println("Customer: " + invoice.getCustomer().getName());

Sonrasında

public class Invoice {
    private List<LineItem> items;
    private Customer customer;
    private LocalDate dueDate;
    
    public Invoice(Customer customer, LocalDate dueDate) {
        this.customer = customer;
        this.dueDate = dueDate;
        this.items = new ArrayList<>();
    }
    
    public void addItem(LineItem item) {
        items.add(item);
    }
    
    // Step 3: Move behavior that uses the getter into the object
    public double calculateTotal() {
        // Step 4: Create intention-revealing methods
        double total = 0;
        for (LineItem item : items) {
            total += item.price() * item.quantity();
        }
        return total;
    }
    
    public boolean isOverdue(date) {
        // Step 4: Create intention-revealing methods
        // Notice you inject the time control source
        // Removing the getter and breaking the coupling
        return date.isAfter(dueDate);
    }
    
    public String customerInformation() {
        // Step 4: Create intention-revealing methods
        // You no longer print with side effects 
        // And coupling to a global console
        return "Customer: " + customer.name();        
    }
    
    // For collections, return an unmodifiable view if needed
    // Only expose internal collaborators if the name 
    // is an actual behavior
    public List<LineItem> items() {
        return Collections.unmodifiableList(items);
    }
    
    // Only if required by frameworks 
    // or telling the customer is an actual responsibility
    // The caller should not assume the Invoice is actually
    // holding it
    public String customerName() {
        return customer.name();
    }
    
    // You might not need to return the dueDate
    // Challenge yourself if you essentially need to expose it
    // public LocalDate dueDate() {
    //     return dueDate;
    // }
}

// Client code (Step 5: Update client code)
Invoice invoice = new Invoice(customer, dueDate);
double total = invoice.calculateTotal();
boolean isOverdue = invoice.isOverdue(date);
System.out.println(invoice.customerInformation());

Türü

    Şöyle
  • [x] Yarı otomatik
  • Şöyle

Güvenlik ️

Bu işlem genellikle güvenlidir, ancak dikkatli bir şekilde uygulanmalıdır.


Getter'in tüm kullanımlarının tanımlandığı ve yeni davranış yöntemleri ile değiştirildiğinden emin olmalısınız.


En büyük risk, getterlerin değişken nesneleri veya koleksiyonları iade ettikleri zaman ortaya çıkar, çünkü müşteri kodu bu nesneleri değiştirmiş olabilir.


Refactoring öncesi ve sonrasında kapsamlı testler yoluyla davranışın değişmediğini doğrulamalısınız.


Koleksiyonlar için, geçiş sırasında güvenliği korumak için değiştirilemez kopyaları veya görünümleri iade edin. mülkiyet erişimi gerektiren çerçeveler için, davranışsal zengin yöntemlerinizle birlikte "give" öngörüsü olmadan basit aksesuarları korumanız gerekebilir.


Her zamanki gibi, refactoring yapmadan önce kodunuza davranışsal (struktural değil) kapsam ekleyin.

Kod Neden Daha İyi?

Yeniden yapılandırılmış kod daha iyidir çünküSöyle-Hiç Sormayınilke, nesnelerinizin sadece anemik veri taşıyıcıları yerine akıllı hale getirilmesi.


Çözüm, nesnenin verileriyle ilgili mantığı nesnenin kendisi içinde merkezleştirir, ikiliği azaltır. Uygulama ayrıntılarını gizler, müşteri kodu etkisi olmadan iç temsilini değiştirmenize olanak tanır.


Bu yaklaşım azaldıKopyalamaMüşterilerin, nesnenin iç yapısını bilmesi gerekmez.


Demeter Kanunu'nun ihlalleri, zincirleri ortadan kaldırarak da önlenir.


Ondan beriEsas değişmiyor, çözüm, nesnenin içinde daha iyi doğrulama ve işletme kurallarının uygulanmasını sağlar.

️Devamı Nasıl Yapılır? ️

Götürücüleri ortadan kaldırmak iyileştirirbişeylernesnelerin gerçek dünya eşleşmelerine benzer davranmalarını sağlamak ile kod ve gerçeklik arasındaki fark.


Gerçek dünyada, nesneler diğerleri tarafından manipüle edilebilmeleri için iç durumlarını ortaya çıkarmazlar - isteklere dayalı işlemleri gerçekleştirirler.


Örneğin, bir banka hesabına dengesini sormazsınız ve daha sonra çekilme mümkün olup olmadığını kendiniz hesaplarsınız. bunun yerine, hesabı “100 dolar çekebilir miyim?” diye sorarsınız.


Verileri ortaya çıkarmak yerine işlemleri gerçekleştirmek için nesnelerinizi modellemekle alan kavramlarının daha sadık bir temsilini oluşturursunuz.

Bu, gerçek dünyayla hesaplanabilir modeliniz arasındaki tek-bir uyumunu güçlendirir, kodunuzu daha sezgisel hale getirir ve insanların sorun alanı hakkında nasıl düşündüğüne uyum sağlar.


Bu yaklaşım sonrasındaHaritasıHesaplanmış nesnelerin, yapı ve davranışlarında gerçek dünyadaki varlıkları yansıtır.

Kısıtlamalar ️

Çerçeve ve kütüphaneler genellikle serializasyon / deserializasyon için getter yöntemlerini bekliyor.


Miras kod tabanları, bir kerede her şeyi yenilemek zor olan yaygın bir getter kullanımı olabilir.


Birim testleri, iç durumun daha az erişilebilir olduğu için daha zorlaşabilir. Unutmayın, özel yöntemleri asla test etmeyin.

Refactor ile AI

Şöyle

Önerilen Prompt: 1. İç nesne durumunu ortaya çıkaran getterleri tanımlayın 2. Kod tabanında tüm getter kullanımlarını bulun 3. getter'i nesneye kullanan davranışları nesneye taşıyın 4. İşlemleri gerçekleştiren niyet ortaya çıkarma yöntemleri oluşturun (gett prefix'i kaldırın) 5. yeni yöntemleri kullanmak için kodunuzu güncelleme

Şöyle

Önerilen Prompt: 1. İç nesne durumunu ortaya çıkaran getterleri tanımlayın 2. Kod tabanında tüm getter kullanımlarını bulun 3. getter'i nesneye kullanan davranışları nesneye taşıyın 4. İşlemleri gerçekleştiren niyet ortaya çıkarma yöntemleri oluşturun (gett prefix'i kaldırın) 5. yeni yöntemleri kullanmak için kodunuzu güncelleme

ŞöyleUygun talimatlar olmadan Özel talimatlar ChatGPT ChatGPT Claude Claude Şaşkınlık Şaşkınlık Copilot Gemini DeepSeek DeepSeek Meta AI Meta AI Grok Grok Qwen Qwen
Uygun talimatlar olmadan Özel talimatlar ChatGPT ChatGPT Claude Claude Şaşkınlık Şaşkınlık Copilot Gemini DeepSeek DeepSeek Meta AI Meta AI Grok Grok Qwen QwenUygun talimatlar olmadan, özel talimatlarDoğru talimatlar olmadan

Doğru talimatlar olmadan

Şöyle

Özel talimatlar ile

Özel talimatlar ile

ChatGPT HakkındaŞöyle

Çatışma

Çatışma

Şöyle

Çatışma

Çatışma

ŞöyleClaude içinŞöyleClaude içinŞöyleClaude için

Claude için

Claude için

Claude için

Şaşkınlık ŞaşkınlıkŞaşkınlık

Şaşkınlık

Şöyle

Şaşkınlık

Şaşkınlık

Pilot Copilotçocuk pilot

çocuk pilot

Şöyle

çocuk pilot

çocuk pilot

İkizler Geminiikizler

ikizler

ikizler

ikizler

DeepSeek Hakkındaderinlemesine

derinlemesine

derinlemesine

derinlemesine

Hedef Meta AIŞöyle

Hedefimiz AI

Hedefimiz AI

Şöyle

Hedefimiz AI

Hedefimiz AI

Gökçe GökçeGökçe

Gökçe

Gökçe

Gökçe

Çanakkale Çanakkaleçin

çin

Şöyle

çin

çin

Güncel ️

    Şöyle
  • Encapsulasyon
  • Şöyle

Seviye

    Şöyle
  • [x] Ortaçağ
  • Şöyle

İlişkiler

bence

Kredi

Görüntü bykrisBenimPixabay Hakkında


Bu makale Refactoring serisinin bir parçasıdır.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks