Skip to content

पोस्ट

कोड रीफैक्टर

22 अक्टूबर 2010 • 6 मिनट पढ़ना

कोड रीफैक्टर

एक हाल की परियोजना पर, मुझे एक वेब सिस्टम के बड़े हिस्सों को रीफैक्टर करने का काम सौंपा गया था। यह C# में लिखा गया है। समय के साथ कुछ कोड-बिहाइंड फ़ाइलें 4000 लाइनों तक बढ़ गई थीं। लक्ष्य इस संख्या को अधिक रखरखाव योग्य स्तर तक कम करना था।

अगली कुछ पोस्टों में, मैंने कोड के स्निपेट लिए हैं जिन्हें मैंने रीफैक्टर किया है और अपने विचार और समाधान तक पहुंचने के तरीके की व्याख्या करूंगा।

पहला कोड स्निपेट:

    string tmp = Request.QueryString["st"];
    _varStartRecNum = tmp;
    if ((tmp != null) & (!Page.IsPostBack))
    {
        _varStartRecNum = tmp;
        postBack = true;
    }

    tmp = Request.QueryString["det"];
    if ((tmp != null) & (!Page.IsPostBack))
    {
        _varDetailsRecNum = tmp;
        postBack = true;
    }

    tmp = Request.QueryString["return"];
    if ((tmp != null) & (!Page.IsPostBack))
    {
        postBack = true;
    }

    tmp = Request.QueryString["searchnow"];
    if ((tmp != null) & (!Page.IsPostBack))
    {
        Session["selectedTab"] = "mtf";
        Session["sessionDSProviders"] = null;
        Session["mtfs"] = null;
    }

    tmp = Request.QueryString["displaywalking"];
    if (tmp == "true")
    {
        dispMtf = false;
        postBack = true;
    }

    tmp = Request.QueryString["sb"];

    if ((tmp != null) & (!Page.IsPostBack))
    {
        _varSortBy = tmp;
        postBack = true;
        switch (_varSortBy)
        {
            case "Distance":
            case "Drive time":
                ddlSortBy.SelectedIndex = 0;
                break;
            case "Name":
                ddlSortBy.SelectedIndex = 1;
                break;
            case "Gender":
                ddlSortBy.SelectedIndex = 2;
                break;
            case "Clinic":
                ddlSortBy.SelectedIndex = 3;
                break;
            case "City":
                ddlSortBy.SelectedIndex = 4;
                break;
            case "Description":
                ddlSortBy.SelectedIndex = 5;
                break;
        }
    }

उपरोक्त कोड स्निपेट if स्टेटमेंट का एक संग्रह है, जो एक मूल्यांकन और एक निष्पादन है। मेरे पहले प्रयास में, मैंने सभी if स्टेटमेंट के लिए समान मूल्यांकन का उपयोग करने का प्रयास किया, लेकिन फिर मुझे एहसास हुआ कि एक अलग था। कोड के इरादे को न समझते हुए, मुझे तर्क को शब्दशः संरक्षित करने के लिए मजबूर किया गया।

अलग if मूल्यांकन:

tmp = Request.QueryString["displaywalking"];
if (tmp == "true")
{
    dispMtf = false;
    postBack = true;
}

स्विच स्टेटमेंट ने मुझे चिंतित किया। स्विच स्टेटमेंट में प्रवेश करने की शर्त अन्य लोगों के समान थी। मैंने आगे बढ़ने का फैसला किया और स्विच स्टेटमेंट के बारे में बाद में चिंता करने का फैसला किया।

कोड एक ही चर, ‘tmp’ चर का उपयोग करके विभिन्न क्वेरी मान प्राप्त करता है। मान प्रत्येक क्वेरी मान पुनर्प्राप्ति के साथ अधिलेखित किया जाता है। स्पष्टता के लिए मैंने प्रत्येक क्वेरी मान के लिए एक चर बनाया:

string st = Request.QueryString["st"];
string det = Request.QueryString["det"];
string @return = Request.QueryString["return"];
string searchNow = Request.QueryString["searchnow"];
string displayWaling = Request.QueryString["displaywalking"];
string sb = Request.QueryString["sb"];

अगला कदम मूल्यांकन और अभिव्यक्ति को अलग करना था जबकि उन्हें एक दूसरे के साथ जुड़ा रखना था। यदि कोई मूल्यांकन सत्य है, तो मैं इसकी संबंधित अभिव्यक्ति को निष्पादित करना चाहता हूं। मैंने एक वर्ग बनाया जो संघ का प्रतिनिधित्व करता था।

private class Evaluate
{

    public Func Evaluation { get; set; }

    public Action Expression { get; set; }
}

अब मैं एक मूल्यांकन बना सकता हूं, और यदि यह सत्य है, तो मैं इसकी अभिव्यक्ति को निष्पादित कर सकता हूं।

अगली समस्या यह थी कि सभी if स्टेटमेंट के साथ उपरोक्त वर्ग का उपयोग कैसे करें। मुझे चिंता थी कि अभिव्यक्तियां एक संग्रह में अनुपयोगी हो सकती हैं। पूरा उद्देश्य एक संक्षिप्त स्केलेबल समाधान बनाना था। मौजूदा समाधान न तो था।

var eval = new[]
               {
                   new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(st) && !IsPostBack), Expression = () => { _varStartRecNum = st;postBack = true; }},
                   new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(det) && !IsPostBack), Expression = () => { _varStartRecNum = det;postBack = true; }}, 
                   new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(@return) && !IsPostBack), Expression = () => {postBack = true; }}, 
                   new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(searchNow) && !IsPostBack), Expression = () => {Session["selectedTab"] = "mtf";Session["sessionDSProviders"] = null; Session["mtfs"] = null;}}, 
                   new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(displayWaling)), Expression = () => {dispMtf = false; postBack = true;}}, 
                   new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(sb) && !IsPostBack), Expression = () => {_varSortBy = sb;postBack = true; SetSort(_varSortBy);}}, 
               };

यह मेरी अपेक्षा से बेहतर निकला। मेरे समाधान का एक नुकसान यह है कि यदि आप डेलिगेट का उपयोग करना नहीं जानते हैं, तो उपरोक्त कोड को बनाए रखने के समय आप परेशान हो जाएंगे।

अंतिम बाधा स्विच स्टेटमेंट थी। यह मेरे अनाम संग्रह में सुंदरता से फिट नहीं होने वाला था, लेकिन फिर इसे करने की आवश्यकता नहीं थी:

private void SetSort(string sortBy)
{
    switch (sortBy)
    {
        case "Distance":
        case "Drive time":
            ddlSortBy.SelectedIndex = 0;
            break;
        case "Name":
            ddlSortBy.SelectedIndex = 1;
            break;
        case "Gender":
            ddlSortBy.SelectedIndex = 2;
            break;
        case "Clinic":
            ddlSortBy.SelectedIndex = 3;
            break;
        case "City":
            ddlSortBy.SelectedIndex = 4;
            break;
        case "Description":
            ddlSortBy.SelectedIndex = 5;
            break;
    }
}

इसे एक विधि में एनकैप्सुलेट करके, मैं अभिव्यक्ति में विधि का संदर्भ दे सकता था। यह बहुत अच्छी तरह से काम किया।

new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(sb) && !IsPostBack), Expression = () => {_varSortBy = sb;postBack = true; SetSort(_varSortBy);}

अंतिम घटक संग्रह पर पुनरावृत्ति कर रहा है:

foreach (var evaluate in eval.Where(evaluate => evaluate.Evaluation()))
{
    evaluate.Expression();
}

पूर्ण समाधान:

private class Evaluate
{
    public Func Evaluation { get; set; }

    public Action Expression { get; set; }
}

private void SetSort(string sortBy)
{
    switch (sortBy)
    {
        case "Distance":
        case "Drive time":
            ddlSortBy.SelectedIndex = 0;
            break;
        case "Name":
            ddlSortBy.SelectedIndex = 1;
            break;
        case "Gender":
            ddlSortBy.SelectedIndex = 2;
            break;
        case "Clinic":
            ddlSortBy.SelectedIndex = 3;
            break;
        case "City":
            ddlSortBy.SelectedIndex = 4;
            break;
        case "Description":
            ddlSortBy.SelectedIndex = 5;
            break;
    }
}

private void EvaluateQueryParameters()
{
    string st = Request.QueryString["st"];
    string det = Request.QueryString["det"];
    string @return = Request.QueryString["return"];
    string searchNow = Request.QueryString["searchnow"];
    string displayWaling = Request.QueryString["displaywalking"];
    string sb = Request.QueryString["sb"];

    var eval = new[]
                   {
                       new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(st) && !IsPostBack), Expression = () => { _varStartRecNum = st;postBack = true; }},
                       new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(det) && !IsPostBack), Expression = () => { _varStartRecNum = det;postBack = true; }}, 
                       new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(@return) && !IsPostBack), Expression = () => {postBack = true; }}, 
                       new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(searchNow) && !IsPostBack), Expression = () => {Session["selectedTab"] = "mtf";Session["sessionDSProviders"] = null; Session["mtfs"] = null;}}, 
                       new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(displayWaling)), Expression = () => {dispMtf = false; postBack = true;}}, 
                       new Evaluate {Evaluation = () => (!string.IsNullOrEmpty(sb) && !IsPostBack), Expression = () => {_varSortBy = sb;postBack = true; SetSort(_varSortBy);}}, 
                   };

    foreach (var evaluate in eval.Where(evaluate => evaluate.Evaluation()))
    {
        evaluate.Expression();
    }
}

अंत में, मुझे यह समाधान मूल से बेहतर पसंद है। एक नुकसान यह है कि यह किस स्तर पर लिखा गया है। मैं एक सरल समाधान बनाना चाहता था जिसे कोई भी डेवलपर बनाए रख सके। उपरोक्त कोड में कुछ भी मुश्किल नहीं है; मैं एक संग्रह बना रहा हूं और इस पर पुनरावृत्ति कर रहा हूं। भ्रम मूल्यांकन और अभिव्यक्तियों के साथ आता है। यह एक शुरुआती विषय नहीं है।

लेखक: Chuck Conway एक AI इंजीनियर हैं जिनके पास सॉफ्टवेयर इंजीनियरिंग का लगभग 30 साल का अनुभव है। वह व्यावहारिक AI सिस्टम बनाते हैं—कंटेंट पाइपलाइन, इंफ्रास्ट्रक्चर एजेंट, और ऐसे टूल जो वास्तविक समस्याओं को हल करते हैं—और अपनी सीख को साझा करते हैं। सोशल मीडिया पर उनसे जुड़ें: X (@chuckconway) या YouTube और SubStack पर उनसे मिलें।

↑ शीर्ष पर वापस जाएं

आपको यह भी पसंद आ सकता है