ڈیٹا تک رسائی کے علاوہ اشیاء کے رویے کو آزاد کریں
کے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
قدم
- کے
- گٹٹرز کی شناخت جو اندرونی اشیاء کی حالت کو ظاہر کرتے ہیں کے
- کوڈ بیس میں تمام استعمالات تلاش کریں کے
- حرکت کا رویہ جس میں گٹار کو خود کو اشیاء میں استعمال ہوتا ہے کے
- آپریشنز کو انجام دینے والے intention-revealing طریقوں کو پیدا کریں (get prefix کو ہٹا دیں) کے
- نئے طریقوں کو استعمال کرنے کے لئے اپنے کوڈ کو اپ ڈیٹ کریں کے
نمونہ کوڈ
سے پہلے
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. نئے طریقوں کو استعمال کرنے کے لئے اپنے کوڈ کو اپ ڈیٹ کریں
صحیح ہدایات کے بغیر
صحیح ہدایات کے بغیر
خاص ہدایات کے ساتھ
چیٹنگ
چیٹنگ
چیٹنگ
کلوڈ
کلوڈ
کلوڈ
کلوڈ
پریشانی
پریشانی
پائلٹ
پائلٹ
Gemini کے
Gemini کے
DeepSeek کے
DeepSeek کے
DeepSeek کے
کا مقصد
کا مقصد
کا مقصد
کا مقصد
گرک
گرک
️️
- کے
- Encapsulation کے کے
سطح
- کے
- [x] منتظم کے
Refactoring کے مترادفات
یہ بھی پڑھیں
کریڈٹ
تصویر کےکریڈٹہےPixabay میں
یہ مضمون Refactoring سیریز کا حصہ ہے.