275 ریڈنگز

Refactoring 027 - Getters کو کیسے ہٹا دیں

کی طرف سے Maximiliano Contieri7m2025/04/20
Read on Terminal Reader

بہت لمبا؛ پڑھنے کے لئے

Getters کو ہٹا دیں یا ان کے اندرونی حالات کو ظاہر کرنے کے بجائے آپریشنوں کو انجام دینے والے رویے میں امیر طریقوں کے ساتھ تبدیل کریں.
featured image - Refactoring 027 - Getters کو کیسے ہٹا دیں
Maximiliano Contieri HackerNoon profile picture

ڈیٹا تک رسائی کے علاوہ اشیاء کے رویے کو آزاد کریں

کے

TL;DR: داخلہ کی حالت کو ظاہر کرنے کے بجائے آپریشنوں کو انجام دینے والے رفتار امیر طریقوں کے ساتھ گٹٹرز کو ہٹا دیں یا تبدیل کریں.

کے

TL;DR: داخلہ کی حالت کو ظاہر کرنے کے بجائے آپریشنوں کو انجام دینے والے رفتار امیر طریقوں کے ساتھ گٹٹرز کو ہٹا دیں یا تبدیل کریں.

مسائل کا حل

    کے
  • Anemic اشیاء
  • کے
  • زیادہ سے زیادہ coupling
  • کے
  • کھویا encapsulation
  • کے
  • بنیادی متغیر
  • کے
  • Demeter قانون کی خلاف ورزی
  • کے
  • معلومات چوری
  • کے
  • داخلہ دکھایا گیا
  • کے
  • ابتدائی Obsession
  • کے

کاپی رائٹ

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

قدم

    کے
  1. گٹٹرز کی شناخت جو اندرونی اشیاء کی حالت کو ظاہر کرتے ہیں
  2. کے
  3. کوڈ بیس میں تمام استعمالات تلاش کریں
  4. کے
  5. حرکت کا رویہ جس میں گٹار کو خود کو اشیاء میں استعمال ہوتا ہے
  6. کے
  7. آپریشنز کو انجام دینے والے intention-revealing طریقوں کو پیدا کریں (get prefix کو ہٹا دیں)
  8. کے
  9. نئے طریقوں کو استعمال کرنے کے لئے اپنے کوڈ کو اپ ڈیٹ کریں
  10. کے

نمونہ کوڈ

سے پہلے

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());

کے بعد

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());

نوعیت

    کے
  • [x] نصف خودکار
  • کے

امن ️

یہ refactoring عام طور پر محفوظ ہے لیکن احتیاط سے عملدرآمد کی ضرورت ہے.


آپ کو اس بات کا یقین کرنے کی ضرورت ہے کہ گیتر کے تمام استعمال کی شناخت کی جاتی ہے اور نئے رویے کے طریقوں کے ساتھ تبدیل کیا جاتا ہے.


سب سے بڑا خطرہ اس وقت ہوتا ہے جب گٹروں کو تبدیل شدہ اشیاء یا مجموعات واپس کرتے ہیں، کیونکہ کلائنٹ کوڈ ان اشیاء کو تبدیل کر سکتا ہے.


آپ کو اس بات کی تصدیق کرنا چاہئے کہ آپ کے رویے کو دوبارہ تبدیل کرنے سے پہلے اور بعد میں جامع ٹیسٹ کے ذریعے تبدیل نہیں کیا گیا ہے.


مجموعات کے لئے، منتقلی کے دوران سیکورٹی کو برقرار رکھنے کے لئے غیر ترمیم شدہ کاپیوں یا نقطہ نظر کو واپس کریں. فریم ورک کے لئے جس میں خصوصیات تک رسائی کی ضرورت ہوتی ہے، آپ کو آپ کے رویے میں امیر طریقوں کے ساتھ ساتھ "کچھ" پیشکش کے بغیر سادہ اجزاء کو برقرار رکھنے کی ضرورت ہوسکتی ہے.


معمول کے طور پر، آپ کو refactoring کرنے سے پہلے آپ کو آپ کے کوڈ میں رویے کی پوشیدہ (نظام نہیں) شامل کرنا چاہئے.

کوڈ کیوں بہتر ہے؟

Refactored کوڈ بہتر ہے کیونکہ یہ پیروی کرتا ہےنہیں پوچھنااصل میں، آپ کے اشیاء کو ذہین بنانے کے بجائے صرف anemic ڈیٹا ٹرانسمیٹرز.


حل اپنے آپ کو ڈپلیکیشن کو کم کرنے کے لئے اشیاء کے اعداد و شمار کے ساتھ متعلق منطق کو مرکزی بناتا ہے. یہ انضمام کی تفصیلات کو چھپاتا ہے، آپ کو کلائنٹ کوڈ پر اثر انداز کرنے کے بغیر اندرونی نمائندگی کو تبدیل کرنے کی اجازت دیتا ہے.


یہ نقطہ نظر کم کرتا ہےکاٹنےکیونکہ صارفین کو اشیاء کے اندرونی ساخت کے بارے میں جاننے کی ضرورت نہیں ہے.


یہ بھی ڈیمٹر کے قانون کی خلاف ورزیوں کو گٹاروں کی زنجیروں کو ہٹانے سے روکتا ہے.


کے بعد سےبنیادی طور پر متحرک نہیں ہے، حل کو بہتر تصدیق اور کاروباری قواعد کی اطمینان کی اجازت دیتا ہے.

یہ کس طرح بہتر بناتا ہے؟ ️

گٹاروں کو دور کرنے سے بہتر ہےbijection کےکوڈ اور حقیقت کے درمیان، اشیاء کو ان کے حقیقی دنیا کے ساتھیوں کی طرح زیادہ سلوک کرنے کی طرف سے.


حقیقی دنیا میں، اشیاء اپنے اندرونی حالات کو دوسروں کے ساتھ کنٹرول کرنے کے لئے ظاہر نہیں کرتے ہیں - وہ درخواستوں پر مبنی آپریشنز کرتے ہیں.


مثال کے طور پر، آپ کسی بینک اکاؤنٹ سے اس کے توازن کے بارے میں نہیں پوچھتے ہیں اور پھر اپنے آپ کو اندازہ لگاتے ہیں کہ کیا ایک نکالنے کا امکان ہے.


آپ کو ڈیٹا کو ظاہر کرنے کے بجائے آپ کے اشیاء کو آپریشنز کو انجام دینے کے لئے ماڈلنگ کی طرف سے ڈومین کے خیالات کو زیادہ سچا طور پر پیدا کرتے ہیں.You create a more faithful representation of domain concepts by modeling your objects to perform operations rather than exposing the data.

یہ حقیقی دنیا اور آپ کے کمپیوٹنگ ماڈل کے درمیان ایک سے ایک کے موازنہ کو مضبوط کرتا ہے، آپ کے کوڈ کو زیادہ intuitive اور لوگوں کے مسائل کے ڈومین کے بارے میں سوچنے کے طریقے کے ساتھ مطابقت رکھتا ہے.


یہ نقطہ نظر اس کے بعد ہےنقشہیہ اس بات کو یقینی بناتا ہے کہ کمپیوٹیکل اشیاء ساخت اور رویے میں حقیقی دنیا کی اشیاء کی طرف اشارہ کرتے ہیں.

️قسمیں

فریم ورک اور لائبریریوں کو اکثر serialization / deserialization کے لئے getter طریقوں کی توقع ہوتی ہے.


ارجنٹسی کوڈ بیسوں کو وسیع پیمانے پر استعمال کیا جا سکتا ہے جو ایک بار میں سب کچھ دوبارہ کرنے کے لئے مشکل ہے.


Unit testing more challenging as the internal state is less accessible. یاد رکھیں، آپ کو کبھی بھی ذاتی طریقوں کا تجربہ نہیں کرنا چاہئے.

Refactor کے ساتھ AI

کے

مشورہ کردہ پرومٹ: 1. ان گٹروں کی شناخت کریں جو اندرونی اشیاء کی حالت کو ظاہر کرتے ہیں 2. کوڈ بیس میں تمام گٹروں کے استعمال کو تلاش کریں 3. گٹروں کو اپنے اشیاء میں استعمال کرنے والے رویے کو منتقل کریں 4. کارروائیوں کو انجام دینے والے intention-revealing طریقوں کو پیدا کریں (گٹ پیشکش کو ہٹا دیں) 5. نئے طریقوں کو استعمال کرنے کے لئے اپنے کوڈ کو اپ ڈیٹ کریں

کے

مشورہ کردہ پرومٹ: 1. ان گٹروں کی شناخت کریں جو اندرونی اشیاء کی حالت کو ظاہر کرتے ہیں 2. کوڈ بیس میں تمام گٹروں کے استعمال کو تلاش کریں 3. گٹروں کو اپنے اشیاء میں استعمال کرنے والے رویے کو منتقل کریں 4. کارروائیوں کو انجام دینے والے intention-revealing طریقوں کو پیدا کریں (گٹ پیشکش کو ہٹا دیں) 5. نئے طریقوں کو استعمال کرنے کے لئے اپنے کوڈ کو اپ ڈیٹ کریں

کےمناسب ہدایات کے بغیر مخصوص ہدایات کے ساتھ ChatGPT ChatGPT Claude Claude Perplexity Perplexity Copilot Gemini DeepSeek DeepSeek Meta AI Meta AI Grok Grok Qwen Qwen
مناسب ہدایات کے بغیر خاص ہدایات کے ساتھکےچیٹ گیمزکےکلودکےPerplexity کے مترادفاتکےCopilot کے بارے میںکےGemini کے مترادفاتکےDeepSeek کے بارے میںکےآپ کا مقصد ہےکےگلوکارکےQWEN QWENکےمناسب ہدایات کے بغیر خاص ہدایات کے ساتھکے

صحیح ہدایات کے بغیر

صحیح ہدایات کے بغیر

خاص ہدایات کے ساتھ

خاص ہدایات کے ساتھ

چیٹ گیمزکے

چیٹنگ

چیٹنگ

چیٹنگ

چیٹنگ

کلودکے

کلوڈ

کلوڈ

کے

کلوڈ

کلوڈ

Perplexity کے مترادفاتکے

پریشانی

پریشانی

پریشانی

پریشانی

Copilot کے بارے میںپائلٹ

پائلٹ

کے

پائلٹ

پائلٹ

Gemini کے مترادفاتGemini کے

Gemini کے

Gemini کے

Gemini کے

DeepSeek کے بارے میںکے

DeepSeek کے

DeepSeek کے

DeepSeek کے

DeepSeek کے

آپ کا مقصد ہےکے

کا مقصد

کا مقصد

کے

کا مقصد

کا مقصد

گلوکارگرک

گرک

کے

گرک

گرک

کےکیوینکےکیوینکےکیوین

کیوین

کیوین

کیوین

️️

    کے
  • Encapsulation کے
  • کے

سطح

    کے
  • [x] منتظم
  • کے

Refactoring کے مترادفات

یہ بھی پڑھیں

کریڈٹ

تصویر کےکریڈٹہےPixabay میں


یہ مضمون Refactoring سیریز کا حصہ ہے.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks