एक डकी के साथ कोड शुरू करें
(एम। फाउलर द्वारा रिफैक्टरिंग) ।
पुस्तक
Refactoring के लिए निरंतर, रिफैक्टिंग तकनीक
। मौजूदा कोड मार्टिन फाउलर में सुधार ।
सिंटैक्स C # में होगा, लेकिन मुख्य बात यह है कि विचार को समझना है, और इसका उपयोग किसी अन्य प्रोग्रामिंग भाषा में किया जा सकता है।
विधियों का संकलन।
- एक विधि को हाइलाइट करना ( कोड के एक टुकड़े को एक विधि में बदलना जिसका नाम उसका अर्थ बताता है )।
हम लंबी विधि को तार्किक उप-विधियों में तोड़ते हैं।
से
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); }
- एक विधि को एम्बेड करना ( उस कोड को विधि का शरीर डालें जो इसे कॉल करता है और विधि को हटाता है )।
अत्यधिक अप्रत्यक्ष (विधियों में टूटने) कक्षा को जटिल कर सकता है।
से
int GetPoints() { return HasMaxSum() ? decimal.One : decimal.Zero; } bool HasMaxSum() { return summ >= maxSumm; }
को
int GetPoints() { return summ >= maxSumm ? decimal.One : decimal.Zero; }
- एक अस्थायी चर एम्बेड करना ( इस अभिव्यक्ति को इस चर के सभी संदर्भों के साथ बदलें )।
अतिरिक्त मध्यवर्ती कोड।
से
decimal cost = order.GetCost(); return cost > 1000;
को
return order.GetCost() > 1000;
- एक अस्थायी चर को विधि कॉल के साथ बदलना ( अभिव्यक्ति को विधि में बदलना )।
ऐसी कई जगह होने पर विधि को कक्षा में कहीं भी बुलाया जा सकता है।
से
decimal MethodA() { decimal summ = amount * cost; if(summ > 1000) {
को
decimal MethodA() { decimal summ = GetSumm(); if(summ > 1000) {
- एक व्याख्यात्मक चर का परिचय ( एक अस्थायी चर में अभिव्यक्ति या इसके भाग का परिणाम डालें )।
कोड पढ़ना और समझना सरल है।
से
if(VisualItems.ColumnCount == FocusedCell.X && (key == Keys.Alt | Keys.Shift) && WasInitialized() && (resize > 0)) {
को
bool isLastFocusedColumn = VisualItems.ColumnCount == FocusedCell.X; bool altShiftPressed = (key == Keys.Alt | Keys.Shift); bool wasResized = resize > 0; if(isLastFocusedColumn && altShiftPressed && WasInitialized() && wasResized) {
- एक व्याख्यात्मक चर को विभाजित करना ( प्रत्येक असाइनमेंट के लिए एक अलग अस्थायी चर बनाना )।
कोड पढ़ना और समझना सरल है।
से
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);
- मापदंडों को असाइनमेंट निकालना ( अस्थायी चर का उपयोग करना बेहतर है )।
तरीकों को इनपुट मापदंडों के मूल्यों को तब तक नहीं बदलना चाहिए जब तक कि स्पष्ट रूप से निर्दिष्ट नहीं किया जाता है (उदाहरण के लिए, सी # में रेफरी)।
से
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; }
- विधि ऑब्जेक्ट के साथ एक विधि को बदलना ( विधि को एक अलग ऑब्जेक्ट में परिवर्तित करें )।
कोड लचीलेपन के लिए वर्ग अपघटन।
से
class MessageSender { public Send(string title, string body) {
को
class MessageSender { public Send(string title, string body, decimal percent, int quantity) {
- एल्गोरिथ्म का प्रतिस्थापन ( एल्गोरिथ्म को अधिक समझने योग्य के साथ बदलें )।
बेहतर पठनीयता और / या प्रदर्शन के लिए कोड अनुकूलन।
से
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 बलों की आवश्यकता होती है, एक नियम के रूप में, एक अन्य प्रोग्रामर (अधिमानतः अधिक अनुभव के साथ) को अपनी राय व्यक्त करनी चाहिए।
मैं अगले लेख में ब्याज के संघर्ष और उनके समाधान के बारे में बात करूंगा।