तकनीक: तरीकों का संकलन (एम। फाउलर द्वारा रिफलेक्टरिंग)

एक डकी के साथ कोड शुरू करें (एम। फाउलर द्वारा रिफैक्टरिंग)
पुस्तक Refactoring के लिए निरंतर, रिफैक्टिंग तकनीक मौजूदा कोड मार्टिन फाउलर में सुधार

सिंटैक्स C # में होगा, लेकिन मुख्य बात यह है कि विचार को समझना है, और इसका उपयोग किसी अन्य प्रोग्रामिंग भाषा में किया जा सकता है।

विधियों का संकलन।


  1. एक विधि को हाइलाइट करना ( कोड के एक टुकड़े को एक विधि में बदलना जिसका नाम उसका अर्थ बताता है )।
    हम लंबी विधि को तार्किक उप-विधियों में तोड़ते हैं।
    से
    void PrintUserInfo(decimal amount) { PrintParentInfo(); Console.WriteLine(string.Format(": {0}", name); Console.WriteLine(string.Format(": {0}", age); Console.WriteLine(string.Format("-: {0}", amount); } 

    को
     void PrintUserInfo(decimal amount) { PrintParentInfo(); PrintUserDetails(decimal amount); } void PrintUserDetails(decimal amount) { Console.WriteLine(string.Format(": {0}", name); Console.WriteLine(string.Format(": {0}", age); Console.WriteLine(string.Format("-: {0}", amount); } 

  2. एक विधि को एम्बेड करना ( उस कोड को विधि का शरीर डालें जो इसे कॉल करता है और विधि को हटाता है )।
    अत्यधिक अप्रत्यक्ष (विधियों में टूटने) कक्षा को जटिल कर सकता है।
    से
     int GetPoints() { return HasMaxSum() ? decimal.One : decimal.Zero; } bool HasMaxSum() { return summ >= maxSumm; } 

    को
     int GetPoints() { return summ >= maxSumm ? decimal.One : decimal.Zero; } 

  3. एक अस्थायी चर एम्बेड करना ( इस अभिव्यक्ति को इस चर के सभी संदर्भों के साथ बदलें )।
    अतिरिक्त मध्यवर्ती कोड।
    से
     decimal cost = order.GetCost(); return cost > 1000; 

    को
     return order.GetCost() > 1000; 

  4. एक अस्थायी चर को विधि कॉल के साथ बदलना ( अभिव्यक्ति को विधि में बदलना )।
    ऐसी कई जगह होने पर विधि को कक्षा में कहीं भी बुलाया जा सकता है।
    से
     decimal MethodA() { decimal summ = amount * cost; if(summ > 1000) { //do something return summ * 10; } return 0; } decimal MethodB() { //do something decimal summ = amount * cost; return summ != 0 ? summ * 100 : 1; } 

    को
     decimal MethodA() { decimal summ = GetSumm(); if(summ > 1000) { //do something return summ * 10; } return 0; } decimal MethodB() { //do something return GetSumm() != 0 ? GetSumm() * 100 : 1; } decimal GetSumm() { return amount * cost; } 

  5. एक व्याख्यात्मक चर का परिचय ( एक अस्थायी चर में अभिव्यक्ति या इसके भाग का परिणाम डालें )।
    कोड पढ़ना और समझना सरल है।
    से
     if(VisualItems.ColumnCount == FocusedCell.X && (key == Keys.Alt | Keys.Shift) && WasInitialized() && (resize > 0)) { // do something } 

    को
     bool isLastFocusedColumn = VisualItems.ColumnCount == FocusedCell.X; bool altShiftPressed = (key == Keys.Alt | Keys.Shift); bool wasResized = resize > 0; if(isLastFocusedColumn && altShiftPressed && WasInitialized() && wasResized) { // do something } 

  6. एक व्याख्यात्मक चर को विभाजित करना ( प्रत्येक असाइनमेंट के लिए एक अलग अस्थायी चर बनाना )।
    कोड पढ़ना और समझना सरल है।
    से
     decimal temp = 2 * (height + width); Console.WriteLine(temp); temp = height * width; Console.WriteLine(temp); 

    को
     decimal perimetr = 2 * (height + width); Console.WriteLine(perimetr); decimal area = height * width; Console.WriteLine(area); 

  7. मापदंडों को असाइनमेंट निकालना ( अस्थायी चर का उपयोग करना बेहतर है )।
    तरीकों को इनपुट मापदंडों के मूल्यों को तब तक नहीं बदलना चाहिए जब तक कि स्पष्ट रूप से निर्दिष्ट नहीं किया जाता है (उदाहरण के लिए, सी # में रेफरी)।
    से
     int Discount(int amount, bool useDefaultDiscount, DateTime date) { if(amount == 0 && useDefaultDiscount) { amount = 10; } return amount; } 

    को
     int Discount(int amount, bool useDefaultDiscount, DateTime date) { int result = amount; if(amount == 0 && useDefaultDiscount) { result = 10; } return result; } 

  8. विधि ऑब्जेक्ट के साथ एक विधि को बदलना ( विधि को एक अलग ऑब्जेक्ट में परिवर्तित करें )।
    कोड लचीलेपन के लिए वर्ग अपघटन।
    से
     class MessageSender { public Send(string title, string body) { // do something // long calculation of some condition if(condition) { // sending message } } } 

    को
     class MessageSender { public Send(string title, string body, decimal percent, int quantity) { // do something Condition condition = new Condition (percent, quantity, dateTime); if(condition.Calculate()) { // sending message } } } class Condition { public Condition(decimal percent, int quantity, DateTime dt) { } public bool Calculate() { // long calculation of some condition } } 

  9. एल्गोरिथ्म का प्रतिस्थापन ( एल्गोरिथ्म को अधिक समझने योग्य के साथ बदलें )।
    बेहतर पठनीयता और / या प्रदर्शन के लिए कोड अनुकूलन।
    से
     string FoundPerson(List<string> people) { foreach(var person in people) { if(person == "Max") { return "Max"; } else if(person == "Bill") { return "Bill"; } else if(person == "John") { return "John"; } return ""; } } 

    को
     string FoundPerson(List<string> people) { var candidates = new List<string>{ "Max", "Bill", "John"}; foreach(var person in people) { if(candidates.Contains(person)) { return person; } } return ""; } 


वास्तविकता का थोड़ा और कोड की समीक्षा प्रक्रिया।


किए गए परिवर्तनों को फिर से भरने या सत्यापित करने से पहले, कोड समीक्षा प्रक्रिया का उपयोग किया जाता है।
इस मामले में, हम समीक्षक के "टिप्पणियों" (मानदंड) पर ध्यान केंद्रित करेंगे।

वास्तविकता यह है कि इन मानदंडों के बीच की रेखा प्रत्येक प्रोग्रामर के लिए अलग हो सकती है, लेकिन यह सहनीय है - सामान्य। इससे भी बदतर जब समीक्षक के पास कोई 3 मानदंड नहीं है, अर्थात। वह हमेशा सही होता है, और यदि वह सही नहीं है, तो उसे साबित करें (लेकिन सब कुछ निर्णायक नहीं है, फिर भी गणित नहीं है)। पहले से ही एक कोड कमिटर बनना, इसके विपरीत, यह केवल 3 मानदंड लागू करता है।
और जब दो ऐसे लोग टकराते हैं, तो यह एक ज्वाला है, चिल्लाती है (मैंने इसे माँ के साथ देखा :))।
संघर्ष को हल करने के लिए, 3 बलों की आवश्यकता होती है, एक नियम के रूप में, एक अन्य प्रोग्रामर (अधिमानतः अधिक अनुभव के साथ) को अपनी राय व्यक्त करनी चाहिए।

मैं अगले लेख में ब्याज के संघर्ष और उनके समाधान के बारे में बात करूंगा।


Source: https://habr.com/ru/post/In173903/


All Articles