রিফ্যাক্টরিং - যতক্ষণ না সমস্ত পরীক্ষার উত্তীর্ণ হয় কেবল কোডটি পুনরায় লেখার পক্ষে কি উপযুক্ত?


9

আমি সম্প্রতি রেলসনফ ২০১৪-র "অল দ্য লিটল থিংস" দেখেছি this

def tick
    if @name != 'Aged Brie' && @name != 'Backstage passes to a TAFKAL80ETC concert'
        if @quality > 0
            if @name != 'Sulfuras, Hand of Ragnaros'
                @quality -= 1
            end
        end
    else
        ...
    end
    ...
end

প্রথম পদক্ষেপটি ফাংশনটিকে কয়েকটি ছোট ছোট ভাগে বিভক্ত করা হয়:

def tick
    case name
    when 'Aged Brie'
        return brie_tick
    ...
    end
end

def brie_tick
    @days_remaining -= 1
    return if quality >= 50

    @quality += 1
    @quality += 1 if @days_remaining <= 0
end

আমি যা আকর্ষণীয় মনে করেছি তা হল এই ছোট ফাংশনগুলি যেভাবে লেখা হয়েছিল। brie_tickউদাহরণস্বরূপ, মূল tickফাংশনের প্রাসঙ্গিক অংশগুলি বের করে লেখা হয়নি , তবে test_brie_*ইউনিট পরীক্ষাগুলি উল্লেখ করে স্ক্র্যাচ থেকে । একবারে এই ইউনিট পরীক্ষাগুলির সমস্ত পাস হয়ে গেলে brie_tickবিবেচিত হয়েছিল। ছোট সমস্ত ফাংশন একবার হয়ে গেলে, মূল একশব্দটি tickফাংশনটি মোছা হয়েছিল।

দুর্ভাগ্যক্রমে, উপস্থাপক অজানা বলে মনে হয়েছিল যে এই পদ্ধতির ফলে চারটি *_tickফাংশনের মধ্যে তিনটি ভুল হয়েছে (এবং অন্যটি খালি ছিল!)। এমন প্রান্তের কেস রয়েছে যেখানে *_tickফাংশনগুলির আচরণ মূল tickফাংশনের থেকে পৃথক হয় । উদাহরণস্বরূপ, @days_remaining <= 0মধ্যে brie_tickথাকা উচিত < 0- সুতরাং এবং brie_tickসাথে ডাকা হলে সঠিকভাবে কাজ করে না ।days_remaining == 1quality < 50

এখানে কি ভুল হয়েছে? এটি কি পরীক্ষার ব্যর্থতা - কারণ এই নির্দিষ্ট প্রান্তের ক্ষেত্রে কোনও পরীক্ষা ছিল না? বা রিফ্যাক্টরিংয়ের ব্যর্থতা - কারণ কোডটি স্ক্র্যাচ থেকে নতুন করে লেখার চেয়ে ধাপে ধাপে রূপান্তর করা উচিত ছিল?


2
আমি নিশ্চিত যে আমি প্রশ্ন পেয়েছি। অবশ্যই কোডটি পুনর্লিখন করা ঠিক আছে। আমি নিশ্চিত নই যে আপনি নির্দিষ্ট করে কী বোঝাতে চেয়েছেন " কেবল কোড পুনর্লিখন করা কি ঠিক ?" যদি আপনি জিজ্ঞাসা করেন যে "কোডের মধ্যে অনেক চিন্তাভাবনা না করে আবার নতুন করে লেখা ঠিক আছে," তবে উত্তরটি হ'ল ঠিক যেমন ঠিক কোডটি লিখতে ঠিক হয় না ।
জন উ

এটি সাধারণত পরীক্ষার পরিকল্পনার কারণে ঘটে যা মূলত সাফল্যের ব্যবহারের ক্ষেত্রে পরীক্ষার উপর দৃষ্টি নিবদ্ধ করে এবং ত্রুটি ব্যবহারের ক্ষেত্রে বা উপ-ব্যবহারের ক্ষেত্রে littleাকা দেওয়ার ক্ষেত্রে খুব কম (বা মোটেও নয়)। সুতরাং এটি মূলত কভারেজের একটি ফুটো। পরীক্ষার একটি ফাঁস।
লাইভ

@ জোহানউইউ - আমি এই ছাপে ছিলাম যে রিফ্যাক্টরিং সাধারণত কোডগুলি পুনরায় লেখার পরিবর্তে সোর্স কোড ("এক্সট্র্যাক্ট-পদ্ধতি" ইত্যাদি) এর ছোট ছোট রূপান্তরগুলির একটি সিরিজ হিসাবে সম্পন্ন করা হয়েছিল (যার দ্বারা আমি এটি আবার স্ক্র্যাচ থেকে আবার এটি লেখার অর্থ) লিঙ্ক উপস্থাপনায় সম্পন্ন হিসাবে বিদ্যমান কোডটি দেখুন)।
ব্যবহারকারী200783

@ জোহানউউ - স্ক্র্যাচ থেকে পুনর্লিখন কি কোনও গ্রহণযোগ্য রিফ্যাক্টরিং কৌশল? যদি তা না হয় তবে রিফ্যাক্টরিং সম্পর্কিত এমন একটি সম্মানিত উপস্থাপনাটি দেখে এটাই হতাশ। OTOH যদি এটি গ্রহণযোগ্য হয়, তবে আচরণে অনিচ্ছাকৃত পরিবর্তনগুলি অনুপস্থিত পরীক্ষার জন্য দায়ী করা যেতে পারে - তবে কি আত্মবিশ্বাসের কোনও উপায় আছে যে পরীক্ষাগুলি সমস্ত সম্ভাব্য প্রান্তগুলি আবরণ করে?
ব্যবহারকারী200783

@ ইউজার ২০০78৮৩৩ এটি একটি বড় প্রশ্ন, এটি কি নয় (আমি কীভাবে আমার পরীক্ষাগুলি ব্যাপকভাবে নিশ্চিত করব?) বাস্তবিকভাবে, আমি সম্ভবত কোনও পরিবর্তন করার আগে একটি কোড কভারেজ রিপোর্ট চালাতাম, এবং কোডের এমন কোনও ক্ষেত্র যা সাবধানতার সাথে পরীক্ষা করে না তা পরীক্ষা করে দেখব অনুশীলন করুন, নিশ্চিত করুন বিকাশকারী দলটি যুক্তিটি পুনরায় লেখার সাথে সাথে তাদের মনে রাখবে।
জন উ

উত্তর:


11

এটি কি পরীক্ষার ব্যর্থতা - কারণ এই নির্দিষ্ট প্রান্তের ক্ষেত্রে কোনও পরীক্ষা ছিল না? বা রিফ্যাক্টরিংয়ের ব্যর্থতা - কারণ কোডটি স্ক্র্যাচ থেকে নতুন করে লেখার চেয়ে ধাপে ধাপে রূপান্তর করা উচিত ছিল?

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

কখনও কখনও যাইহোক, কোডের একটি বিভাগ পুনর্লিখন এটি আপনার প্রয়োজন বা করতে চান। এবং যদি কেসটি হয় তবে আপনার আরও ভাল পরীক্ষা করা দরকার।

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


1
ধন্যবাদ, এটি উপলব্ধি করে। সুতরাং, যদি আচরণে অনাকাঙ্ক্ষিত পরিবর্তনের চূড়ান্ত সমাধানের জন্য বিস্তৃত পরীক্ষা করা হয়, তবে পরীক্ষাগুলি সমস্ত সম্ভাব্য প্রান্তের কেসগুলিকে কভার করে যে আত্মবিশ্বাসের কোন উপায় আছে? উদাহরণস্বরূপ, brie_tickসমস্যাযুক্ত কেসটি কখনও পরীক্ষা না করে এর 100% কভারেজ থাকা সম্ভব হবে @days_remaining == 1, উদাহরণস্বরূপ, @days_remainingসেট সেট 10এবং এর সাথে পরীক্ষা করা -10
ব্যবহারকারী200783

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

1
এই উদাহরণস্বরূপ, মিসড ব্রাঞ্চগুলি পরীক্ষাগুলির বিকাশকালে একটি কোড কভারেজ সরঞ্জাম দিয়ে ধরা পড়তে পারে।
cbojar

2

এখানে কি ভুল হয়েছে? এটি কি পরীক্ষার ব্যর্থতা - কারণ এই নির্দিষ্ট প্রান্তের ক্ষেত্রে কোনও পরীক্ষা ছিল না? বা রিফ্যাক্টরিংয়ের ব্যর্থতা - কারণ কোডটি স্ক্র্যাচ থেকে নতুন করে লেখার চেয়ে ধাপে ধাপে রূপান্তর করা উচিত ছিল?

উত্তরাধিকারের কোড সহ কাজ করা সম্পর্কে সত্যই একটি বিষয়: বর্তমান আচরণের একটি সম্পূর্ণ বোঝা অর্জন করা।

পরীক্ষাগুলি ছাড়াই লিগ্যাসি কোড যা সমস্ত আচরণকে সীমাবদ্ধ করে বন্যের মধ্যে একটি সাধারণ প্যাটার্ন। কোনটি আপনাকে অনুমানের সাথে ছেড়ে দেয়: এর অর্থ এই নয় যে অসংগঠিত আচরণগুলি বিনামূল্যে পরিবর্তনশীল? বা প্রয়োজনীয়তা যা অপ্রয়োজনীয়?

আলোচনা থেকে :

এখন এটি রিফ্যাক্টরিংয়ের সংজ্ঞা অনুসারে বাস্তব রিফ্যাক্টরিং; আমি এই কোডটি রিফ্যাক্টর করতে যাচ্ছি। আমি এর আচরণ পরিবর্তন না করে এর ব্যবস্থা পরিবর্তন করতে চলেছি।

এটি আরও রক্ষণশীল পন্থা; যদি প্রয়োজনীয়তাগুলি অপ্রকাশিত হতে পারে, যদি পরীক্ষাগুলি সমস্ত বিদ্যমান যুক্তি ক্যাপচার না করে, তবে কীভাবে আপনি এগিয়ে যান সে সম্পর্কে আপনাকে খুব সতর্কতা অবলম্বন করতে হবে।

নির্দিষ্ট হিসাবে, আপনি দৃ as়ভাবে বলতে পারেন যে পরীক্ষাগুলি যদি সিস্টেমের আচরণের অপ্রতুলতার সাথে বর্ণনা করে তবে আপনার "পরীক্ষার ব্যর্থতা" রয়েছে। এবং আমি মনে করি এটি ন্যায্য - তবে বাস্তবে কার্যকর নয়; বন্য মধ্যে থাকা এটি একটি সাধারণ সমস্যা

বা রিফ্যাক্টরিংয়ের ব্যর্থতা - কারণ কোডটি স্ক্র্যাচ থেকে নতুন করে লেখার চেয়ে ধাপে ধাপে রূপান্তর করা উচিত ছিল?

সমস্যা হয় না বেশ যে রূপান্তরের ধাপে ধাপে হওয়া উচিত ছিল; তবে এর চেয়ে বেশি যে ত্রুটির হার বেশি হওয়ার কারণে পরীক্ষামূলক কভারেজের সাথে রিফ্যাক্টরিং সরঞ্জাম (হিউম্যান কীবোর্ড অপারেটর? গাইড অটোমেশনের চেয়ে ভাল) ভালভাবে সাজানো হয়নি।

এই পারে সুরাহা হয়েছে পারেন উচ্চ নির্ভরযোগ্যতা সঙ্গে refactoring সরঞ্জাম ব্যবহার দ্বারা বা পরীক্ষার একটি বৃহত্তর ব্যাটারি উপস্থাপক সিস্টেমে সীমাবদ্ধতার উন্নত করতে হবে।

সুতরাং আমি মনে করি আপনার সংমিশ্রণটি খারাপভাবে বেছে নেওয়া হয়েছে; ANDনা OR


2

রিফ্যাক্টরিং আপনার কোডের বাহ্যিক দৃশ্যমান আচরণ পরিবর্তন করা উচিত নয়। এটাই লক্ষ্য।

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

এই ক্ষেত্রে ওয়ার্কিং ইউনিট পরীক্ষাগুলি আপনাকে কেবল সাফল্যের ভুল অনুভূতি দেয়। তবে কী ভুল হয়েছে? দুটি জিনিস: রিফ্যাক্টরিং অযত্ন ছিল এবং ইউনিট পরীক্ষা খুব ভাল ছিল না।


1

আপনি যদি "সঠিক "টিকে" পরীক্ষাগুলি পাস "হতে সংজ্ঞায়িত করেন তবে সংজ্ঞা অনুসারে অনির্ধারিত আচরণ পরিবর্তন করা ভুল নয়।

যদি কোনও নির্দিষ্ট প্রান্তের আচরণটি সংজ্ঞায়িত করা উচিত তবে এর জন্য একটি পরীক্ষা যুক্ত করুন, যদি তা না হয় তবে কী হয় তা যত্ন না করা ঠিক আছে। আপনি যদি সত্যই পেডেন্টিক হন তবে আপনি এমন একটি পরীক্ষা লিখতে পারেন যা পরীক্ষা করে trueযখন প্রান্তের ক্ষেত্রে ডকুমেন্টটি পরীক্ষা করে যে আচরণটি কী তা আপনার যত্ন নেই।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.