আমি কোনও কিছু ভেঙে দিই না তা নিশ্চিত করার জন্য কোনও বৃহত পদ্ধতিতে রিফ্যাকচার করার সময় কী সহায়তা করবে?


10

আমি বর্তমানে বৃহত্তর কোডবেসের একটি অংশকে রিফেক্টর করছি যা কোনও ইউনিট পরীক্ষা ছাড়াই। আমি অবিশ্বাস্য কোডটি কোডটি রিফ্যাক্টর করার চেষ্টা করেছি, অর্থাৎ কোডটি কী করছে এবং কী কী পরিবর্তনগুলি এর অর্থ পরিবর্তন করে না তা অনুমান করার চেষ্টা করে, তবে সাফল্য ছাড়াই: এটি এলোমেলোভাবে কোডবেসের চারপাশে সমস্ত বৈশিষ্ট্যগুলি ভেঙে দেয়।

নোট করুন যে রিফ্যাক্টরিংয়ের মধ্যে লেগ্যাসি সি # কোডকে আরও কার্যকরী স্টাইলে স্থানান্তরিত করা হয় (লিগ্যাসি কোড .NET ফ্রেমওয়ার্ক 3 এবং তারপরে লিনকিউ সহ আরও কিছু বৈশিষ্ট্য ব্যবহার করে না), কোডগুলি তাদের থেকে উপকার পেতে পারে এমন জেনেরিকগুলি যুক্ত করে ইত্যাদি includes

তাদের কত খরচ হবে তা দিয়ে আমি আনুষ্ঠানিক পদ্ধতিগুলি ব্যবহার করতে পারি না ।

অন্যদিকে, আমি অনুমান করি যে কমপক্ষে " যে কোনও রিফ্যাক্টরড লিগ্যাসি কোড ইউনিট পরীক্ষার সাথে আসবে" নিয়মটি কঠোরভাবে অনুসরণ করা উচিত, যতই খরচ পড়ুক না কেন। সমস্যাটি হ'ল আমি যখন 500 টি এলওসি ব্যক্তিগত পদ্ধতির একটি ক্ষুদ্র অংশকে রিফ্যাক্টর করি তখন ইউনিট পরীক্ষা যুক্ত করা একটি কঠিন কাজ বলে মনে হয়।

কোন ইউনিট পরীক্ষাগুলি কোনও কোডের প্রদত্ত অংশের জন্য প্রাসঙ্গিক তা জানতে আমাকে কী সাহায্য করতে পারে? আমি অনুমান করছি যে কোডটির স্থির বিশ্লেষণটি কোনওভাবে উপকারী হবে তবে আমি কী কী সরঞ্জাম এবং কৌশলগুলি ব্যবহার করতে পারি সেগুলি:

  • আমার ঠিক কী ইউনিট পরীক্ষা করা উচিত তা জেনে নিন,

  • এবং / অথবা আমি জানি যে পরিবর্তনটি মূল কোডটি এমনভাবে প্রভাবিত করেছে যেটি এখন থেকে ভিন্নভাবে সম্পাদন করছে?


আপনার যুক্তিটি কী যে লেখার ইউনিট পরীক্ষাগুলি এই প্রকল্পের জন্য সময় বাড়িয়ে তুলবে? অনেক সমর্থক একমত নন, তবে এটি লেখার আপনার ক্ষমতার উপরও নির্ভরশীল।
JeffO

আমি বলছি না এটি প্রকল্পের সামগ্রিক সময় বাড়িয়ে তুলবে। আমি যা বলতে চেয়েছিলাম তা হ'ল এটি স্বল্পমেয়াদী সময়কে বাড়িয়ে তুলবে (অর্থাত্ কোডটি রিফ্যাক্ট করার সময় আমি এখনই কাটিয়েছি )।
আর্সেনি মরজেনকো

1
আপনি formal methods in software developmentযেভাবেই ব্যবহার করতে চাইবেন না কারণ এটি কোনও প্রাক্টিকেট যুক্তি ব্যবহার করে কোনও প্রোগ্রামের যথার্থতা প্রমাণ করতে ব্যবহৃত হয় এবং কোনও বৃহত কোডবেস পুনরায় সংশোধন করার ক্ষেত্রে প্রয়োগযোগ্যতা থাকে না। সাধারণত মেডিকেল অ্যাপ্লিকেশনগুলির মতো ক্ষেত্রে কোডটি সঠিকভাবে প্রমাণিত করার জন্য ব্যবহৃত আনুষ্ঠানিক পদ্ধতিগুলি। আপনি ঠিক বলেছেন এটি করা ব্যয়বহুল, এ কারণেই এটি প্রায়শই ব্যবহৃত হয় না।
মুশি

রিশার্পারে রিফ্যাক্টর বিকল্পগুলির মতো একটি ভাল সরঞ্জাম এ জাতীয় কাজটি আরও সহজ করে তোলে। এ জাতীয় পরিস্থিতিতে এটি অর্থের পক্ষে ভাল
বিলি.বব

1
সম্পূর্ণ উত্তর নয় তবে বোবা কৌশলটি আমি আশ্চর্যজনকভাবে কার্যকর বলে মনে করি যখন অন্য সমস্ত রিফ্যাক্টরিং কৌশলগুলি আমাকে ব্যর্থ করছে: একটি নতুন ক্লাস তৈরি করুন, ইতিমধ্যে সেখানে উপস্থিত কোডের সাথে পৃথক ফাংশনটি আলাদা করুন, প্রতি 50 বা তত লাইন ভাঙ্গা হয়েছে, যে কোনও প্রচার করুন স্থানীয়দের যা ফাংশন জুড়ে সদস্যদের সাথে ভাগ করা হয়, তারপরে স্বতন্ত্র ফাংশনগুলি আমার মাথার মধ্যে আরও ভাল ফিট করে এবং আমাকে সদস্যগুলিতে দেখার দক্ষতা দেয় যেগুলি সম্পূর্ণ যুক্তির মাধ্যমে টুকরো টুকরো করা হয়। এটি কোনও শেষ লক্ষ্য নয়, একটি উত্তরাধিকারসূত্রে বিশৃঙ্খলা পাওয়ার নিরাপদ উপায় নিরাপদে রিফ্যাক্টরিংয়ের জন্য প্রস্তুত।
জিমি হোফা

উত্তর:


12

আমারও একই রকম চ্যালেঞ্জ ছিল। উত্তরাধিকার কোড নিয়ে কাজ বই একটি বড় সম্পদ, কিন্তু অনুমান যে আপনার ইউনিট পরীক্ষা শু-হর্ন আপনার কাজ সমর্থন করার জন্য করতে পারেন। কখনও কখনও এটি সম্ভব হয় না।

আমার প্রত্নতাত্ত্বিক কাজের (এই জাতীয় উত্তরাধিকারের কোডটি রক্ষণাবেক্ষণের জন্য আমার শব্দ), আপনি কী বলেছিলেন তাতে আমি একই ধরণের পদ্ধতির অনুসরণ করি।

  • রুটিন বর্তমানে কী করছে তার একটি দৃ understanding় বোঝার সাথে শুরু করুন।
  • একই সাথে, রুটিনটি কী করা উচিত ছিল তা সনাক্ত করুন। অনেকে মনে করেন এই বুলেট এবং আগেরটি একই, তবে একটি সূক্ষ্ম পার্থক্য রয়েছে। প্রায়শই, যদি রুটিনটি যা করছিল বলে কাজটি করছিল তখন আপনি রক্ষণাবেক্ষণের পরিবর্তনগুলি প্রয়োগ করবেন না।
  • রুটিনের মাধ্যমে কিছু নমুনা চালান এবং নিশ্চিত করুন যে আপনি সীমানা কেস, প্রাসঙ্গিক ত্রুটিযুক্ত পথগুলি, মূললাইনটির সাথে আঘাত করেছেন। আমার অভিজ্ঞতা হ'ল জামানত সংক্রান্ত ক্ষতি (বৈশিষ্ট্য ভঙ্গ) হ'ল সীমানা শর্ত থেকে ঠিক একইভাবে প্রয়োগ করা হচ্ছে না from
  • এই নমুনা কেসগুলির পরে, কী অবিচল রয়েছে তা শনাক্ত করুন যা অগত্যা চালিয়ে যাওয়ার দরকার নেই। আবার, আমি দেখতে পেয়েছি যে এটি এর মতো পার্শ্ব প্রতিক্রিয়া যা অন্য কোথাও জামানত ক্ষতির দিকে নিয়ে যায়।

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

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

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


2
একা "প্রত্নতত্ত্ব" ব্যবহারের জন্য +1। আমি এই ক্রিয়াকলাপটি বর্ণনা করার জন্য একই শব্দটি ব্যবহার করি এবং আমার মনে হয় এটি রাখার দুর্দান্ত উপায় (উত্তরটি ভাল ছিল বলে আমি মনে করি - আমি আসলে তেমন অগভীর নই)
এরিক ডিয়েট্রিচ

10

আমি কোনও কিছু ভেঙে দিই না তা নিশ্চিত করার জন্য কোনও বৃহত পদ্ধতিতে রিফ্যাকচার করার সময় কী সহায়তা করবে?

সংক্ষিপ্ত উত্তর: ছোট পদক্ষেপ।

সমস্যাটি হ'ল আমি যখন 500 টি এলওসি ব্যক্তিগত পদ্ধতির একটি ক্ষুদ্র অংশকে রিফ্যাক্টর করি তখন ইউনিট পরীক্ষা যুক্ত করা একটি কঠিন কাজ বলে মনে হয়।

এই পদক্ষেপগুলি বিবেচনা করুন:

  1. বাস্তবায়নটিকে একটি অন্য (ব্যক্তিগত) ফাংশনে সরান এবং কলটি অর্পণ করুন।

    // old:
    private int ugly500loc(int parameters) {
        // 500 LOC here
    }
    
    // new:    
    private int ugly500loc_old(int parameters) {
        // 500 LOC here
    }
    
    private void ugly500loc(int parameters) {
        return ugly500loc_old(parameters);
    }
    
  2. সমস্ত ইনপুট এবং আউটপুটগুলির জন্য আপনার আসল ফাংশনে লগিং কোড যুক্ত করুন (নিশ্চিত করুন যে লগিং ব্যর্থ হয় না)।

    private void ugly500loc(int parameters) {
        static int call_count = 0;
        int current = ++call_count;
        save_to_file(current, parameters);
        int result = ugly500loc_old(parameters);
        save_to_file(current, result); // result, any exceptions, etc.
        return result;
    }
    

    আপনার অ্যাপ্লিকেশনটি চালান এবং এটি দিয়ে যা যা পারেন তা করুন (বৈধ ব্যবহার, অবৈধ ব্যবহার, সাধারণ ব্যবহার, সাধারণ ব্যবহার, ইত্যাদি)।

  3. max(call_count)আপনার পরীক্ষাগুলি লেখার জন্য আপনার কাছে এখন ইনপুট এবং আউটপুটগুলির সেট রয়েছে; আপনি এমন একক পরীক্ষা লিখতে পারেন যা আপনার সমস্ত পরামিতি / ফলাফলের সেটগুলির উপরে পুনরাবৃত্তি করে এবং এগুলি একটি লুপে কার্যকর করে। আপনি একটি অ্যাডিশনাল টেস্টও লিখতে পারেন যা একটি নির্দিষ্ট সংমিশ্রণ চালায় (দ্রুত কোনও নির্দিষ্ট আই / ও সেটটি পেরিয়ে যাওয়ার পরীক্ষা করতে ব্যবহৃত হবে)।

  4. // 500 LOC hereআপনার ugly500locফাংশনে ফিরে যান (এবং লগিং কার্যকারিতা সরিয়ে ফেলুন)।

  5. বড় ফাংশন থেকে ফাংশনগুলি বের করা শুরু করুন (অন্য কিছুই করবেন না, কেবল ফাংশনগুলি এক্সট্রাক্ট করুন) এবং পরীক্ষা চালান। এর পরে আপনার 500CB এর পরিবর্তে রিফ্যাক্টরের আরও কম কাজ করা উচিত।

  6. কখনও পরে সুখে বাস.


3

সাধারণত ইউনিট টেস্টগুলি যাওয়ার উপায়।

প্রয়োজনীয় পরীক্ষাগুলি তৈরি করুন যা প্রমাণ করে যে বর্তমান প্রত্যাশা অনুযায়ী কাজ করে। আপনার সময় নিন এবং শেষ পরীক্ষা অবশ্যই আউটপুট সম্পর্কে আপনাকে আত্মবিশ্বাসী করে তুলবে।

কোন ইউনিট পরীক্ষাগুলি কোনও কোডের প্রদত্ত অংশের জন্য প্রাসঙ্গিক তা জানতে আমাকে কী সাহায্য করতে পারে?

আপনি কোনও কোডের টুকরোটি রিফ্যাক্ট করার প্রক্রিয়াতে রয়েছেন, আপনাকে অবশ্যই এটি জানতে হবে যে এটি কী করে এবং এটি কী প্রভাব ফেলে। সুতরাং মূলত আপনাকে সমস্ত প্রভাবিত অঞ্চল পরীক্ষা করতে হবে। এটি আপনাকে অনেক সময় নিবে ... তবে এটি কোনও রিফ্যাক্টরিং প্রক্রিয়াটির প্রত্যাশিত ফলাফল।

তারপরে আপনি কোনও সমস্যা ছাড়াই সমস্ত ছিন্ন করতে পারেন।

আফাইক, এর জন্য কোনও বুলেট প্রুফ কৌশল নেই ... আপনাকে কেবল পদ্ধতিগত হতে হবে (যে পদ্ধতিতে আপনি স্বাচ্ছন্দ্য বোধ করেন), প্রচুর সময় এবং প্রচুর ধৈর্য! :)

চিয়ার্স এবং শুভকামনা!

অ্যালেক্স


কোড কভারেজ সরঞ্জাম এখানে প্রয়োজনীয়। নিশ্চিত করা যে আপনি প্রতিটি পথকে একটি বৃহত জটিল পদ্ধতিতে পরিদর্শনের মাধ্যমে আবৃত করেছেন difficult এমন একটি সরঞ্জাম যা দেখায় যে সম্মিলিতভাবে রান্নাঘরের সিংকমেথডটেষ্ট01 () ... রান্নাঘরের সিংকিথ মেথডটেষ্ট 17 () 1-45, 48-220, 245-399, এবং 488-500 এর কভার লাইনগুলি কিন্তু এর মধ্যে কোডটি স্পর্শ করবে না; আপনাকে আরও সহজ লেখার জন্য কী কী অতিরিক্ত পরীক্ষাগুলি প্রয়োজন তা নির্ধারণ করবে।
ড্যান ইজ ফিজলিং ফায়ারলাইট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.