Skip to content

পোস্ট

কোড রিফ্যাক্টর

২২ অক্টোবর, ২০১০ • 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();
    }
}

শেষ পর্যন্ত, আমি এই সমাধানটি মূলটির চেয়ে বেশি পছন্দ করি। একটি অসুবিধা হল যে স্তরটি যা লেখা হয়েছে। আমি একটি সহজ সমাধান তৈরি করতে চেয়েছিলাম যা যেকোনো ডেভেলপার বজায় রাখতে পারে। উপরের কোডে কিছুই কঠিন নেই; আমি একটি সংগ্রহ তৈরি করছি এবং এটির উপর পুনরাবৃত্তি করছি। বিভ্রান্তি মূল্যায়ন এবং অভিব্যক্তির সাথে আসে। এটি একটি শিক্ষানবিস বিষয় নয়।

লেখক: চাক কনওয়ে একজন এআই ইঞ্জিনিয়ার যার কাছে প্রায় ৩০ বছরের সফটওয়্যার ইঞ্জিনিয়ারিং অভিজ্ঞতা রয়েছে। তিনি ব্যবহারিক এআই সিস্টেম তৈরি করেন—কন্টেন্ট পাইপলাইন, অবকাঠামো এজেন্ট এবং সরঞ্জাম যা বাস্তব সমস্যার সমাধান করে—এবং তার শেখার বিষয়গুলি শেয়ার করেন। তার সাথে সোশ্যাল মিডিয়ায় সংযোগ করুন: X (@chuckconway) অথবা তাকে YouTube এবং SubStack এ দেখুন।

↑ শীর্ষে ফিরে যান

আপনি এটিও পছন্দ করতে পারেন