Veri erişiminin ötesinde nesnenin davranışını serbest bırakın
ŞöyleTL;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
- İçsel nesne durumunu ortaya koyan getterleri tanımlayın Şöyle
- Codebase'deki tüm kullanıma bakın Şöyle
- Gönder davranışı, getter'ı nesnenin kendisinde kullanır Şöyle
- İşlemleri gerçekleştiren niyet ortaya çıkarma yöntemleri oluşturun (git önbelleği kaldırın) Şöyle
- Yeni yöntemleri kullanmak için kodunuzu güncelleyin Şö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
Doğru talimatlar olmadan
Özel talimatlar ile
Özel talimatlar ile
Çatışma
Çatışma
Çatışma
Claude için
Claude için
Şaşkınlık
Şaşkınlık
çocuk pilot
çocuk pilot
ikizler
Hedefimiz AI
Hedefimiz AI
Hedefimiz AI
Hedefimiz AI
Gökçe
çin
ç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.