কীভাবে ক্যাসকেডিং রিফ্যাক্টরিংগুলি এড়াতে পারি?


52

আমি একটি প্রকল্প পেয়েছি। এই প্রকল্পে আমি এটিতে কোনও বৈশিষ্ট্য যুক্ত করতে পুনরায় চুলক করতে চেয়েছিলাম এবং বৈশিষ্ট্যটি যুক্ত করার জন্য আমি প্রকল্পটি রিফেক্টর করেছি।

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

ভবিষ্যতে আমি কীভাবে এই জাতীয় ক্যাসকেডিং রিফ্যাক্টরিংগুলি এড়াতে পারি? একে অপরের উপর খুব দৃly়তার সাথে নির্ভর করে এটি কি আমার পূর্ববর্তী ক্লাসগুলির একটি লক্ষণ?

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

পাঁচ দিন আগে আমি প্রতিশ্রুতিবদ্ধ বড় সম্পাদনা:

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

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

for(auto&& a : as) {
     f(a);
}

যাইহোক, এই প্রসঙ্গটি পেতে, আমার এটিকে আরও ভালো কিছুতে পরিবর্তন করা দরকার

std::vector<Context> contexts;
for(auto&& a : as)
    contexts.push_back(g(a));
do_thing_now_we_have_contexts();
for(auto&& con : contexts)
    f(con);

এর অর্থ হ'ল যে সমস্ত ক্রিয়াকলাপের একটি অংশ হিসাবে ব্যবহৃত হত fতাদের জন্য কিছুকে নতুন ফাংশনের একটি অংশ তৈরি করা দরকার যা gপ্রসঙ্গ ছাড়াই পরিচালিত হয় এবং তাদের কিছুকে এখন-পিছিয়ে যাওয়া অংশের তৈরি করা দরকার f। তবে সমস্ত পদ্ধতির fপ্রয়োজন হয় না বা এই প্রসঙ্গটি চান না - তাদের কারও কারও স্বতন্ত্র প্রসঙ্গ প্রয়োজন যা তারা পৃথক উপায়ে অর্জন করেন। সুতরাং fকলিংয়ে শেষ হওয়া সমস্ত কিছুর জন্য (যা মোটামুটিভাবে বলা যায়, বেশ কিছু সবকিছু ), আমি তাদের নির্ধারণ করতে হয়েছিল যে তাদের প্রসঙ্গটি কী দরকার, তাদের এটি কোথায় থেকে পাওয়া উচিত এবং কীভাবে তাদেরকে পুরানো fথেকে নতুন fএবং নতুনতে ভাগ করা যায়? g

আমি এখন যেখানে আছি সেখানেই শেষ হয়ে গেল। আমি যাচ্ছি কেবলমাত্র কারণ হ'ল যাইহোক আমার অন্যান্য কারণে এই রিফ্যাক্টরিংয়ের প্রয়োজন ছিল needed


67
যখন আপনি বলেন যে আপনি "কোনও বৈশিষ্ট্য যুক্ত করার জন্য প্রকল্পটি রিফেক্টর করেছেন", আপনি ঠিক কী বোঝাতে চাইছেন? রিফ্যাক্টরিং প্রোগ্রামগুলির আচরণের পরিবর্তন করে না সংজ্ঞা অনুসারে, যা এই বিবৃতিটিকে বিভ্রান্ত করে তোলে।
জুলাই

5
@ জুলেস: কড়া কথা বলতে গেলে বৈশিষ্ট্যটি হ'ল অন্য বিকাশকারীদের একটি নির্দিষ্ট ধরণের এক্সটেনশন যুক্ত করার অনুমতি দেওয়া হয়েছিল, তাই বৈশিষ্ট্যটি ছিল রিফ্যাক্টর, যা শ্রেণি কাঠামোটিকে আরও উন্মুক্ত করে তুলেছিল।
ডেড এমজি

5
আমি ভেবেছিলাম প্রতিটি বই এবং নিবন্ধে এটি রিফ্যাক্টরিংয়ের বিষয়ে আলোচনা করা হয়েছে? উত্স নিয়ন্ত্রণ উদ্ধার আসে; আপনি যদি ধাপ A তে করতে চান তবে আপনাকে প্রথমে বি ধাপটি করতে হবে, তারপরে A কে স্ক্র্যাপ করুন এবং প্রথমে বি করুন।
রওয়ং

4
@ ডিএডএমজি: এটি প্রথম বইটিতে আমি প্রথম মন্তব্যটিতে উদ্ধৃত করতে চেয়েছিলাম: "গেম" পিক-আপ লাঠিগুলি মিকাদো পদ্ধতির জন্য একটি ভাল রূপক You আপনি "প্রযুক্তিগত "
রওয়ং

2
মে, আমরা কোন প্রোগ্রামিং ভাষার বিষয়ে কথা বলছি তা স্পষ্ট করে বলতে পারি? আপনার সমস্ত মন্তব্য পড়ার পরে, আমি এই সিদ্ধান্তে পৌঁছেছি যে আপনি কোনও আইডিই আপনাকে সহায়তা করার পরিবর্তে হাত দ্বারা এটি করছেন। এইভাবে আমি জানতে চাই, আমি আপনাকে কিছু ব্যবহারিক পরামর্শ দিতে পারি কিনা।
thepacker

উত্তর:


69

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

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

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

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


53

একে অপরের উপর খুব দৃly়তার সাথে নির্ভর করে এটি কি আমার পূর্ববর্তী ক্লাসগুলির একটি লক্ষণ?

অবশ্যই। অন্যান্য পরিবর্তনগুলির অগণিত কারণগুলির মধ্যে একটি পরিবর্তন মিলনের সংজ্ঞাটি অনেক বেশি।

আমি কীভাবে ক্যাসকেডিং রিফ্যাক্টরগুলি এড়াতে পারি?

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

সাধারণত এর অর্থ কিছুটা অ্যাডাপ্টারের তৈরির সাহায্যে পুরানো কোডটিকে এমন কিছু দিয়ে কাজ করতে সহায়তা করা হয় যা দেখতে পুরানো কোডের মতো দেখায় এবং কাজ করে তবে নতুন বাস্তবায়ন / ইন্টারফেস ব্যবহার করে। সর্বোপরি, যদি আপনি যা করেন তা হ'ল ইন্টারফেস / বাস্তবায়ন পরিবর্তন করে তবে সংযোজনটি ছেড়ে যান যা আপনি কিছুই অর্জন করছেন না। এটি শুয়োরের লিপস্টিক।


33
+1 যত বেশি খারাপভাবে একটি রিফ্যাক্টরিং প্রয়োজন, তত বেশি পরিমাণে রিফ্যাক্টরিং পৌঁছে যাবে। এটা জিনিস খুব প্রকৃতি।
পল ড্রপার

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

+1 একটি অ্যাডাপ্টার হ'ল আপনি প্রথমে যে কোডটি পরিবর্তন করতে চান সেটি বিচ্ছিন্ন করার উপায়।
উইঙ্কব্র্যাস

17

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

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


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

3
আমি এমন পরিস্থিতিতে ছিলাম না যেখানে আমি এমন রিফ্যাক্টরিং করতে চেয়েছিলাম, তবে আমার বলতে হবে এটি আমার কাছে বেশ অস্বাভাবিক মনে হয়েছে। আপনি কি বলছেন যে আপনি ইন্টারফেস থেকে কার্যকারিতা সরিয়েছেন? যদি তাই হয় তবে কোথায় গেল? অন্য ইন্টারফেসে? নাকি অন্য কোথাও?
জুলাই

5
তারপরে এটি করার উপায় হ'ল বৈশিষ্ট্যের সমস্ত ব্যবহারগুলি অপসারণের পূর্বে অপসারণের আগে অপসারণের আগে মুছে ফেলা। এটি আপনাকে কাজ করার সময় কোড বিল্ডিং রাখতে সহায়তা করে।
জুলিউস

11
@ ডেড এমজি: এটি অদ্ভুত বলে মনে হচ্ছে: আপনি এমন একটি বৈশিষ্ট্য অপসারণ করছেন যা আপনার প্রয়োজন অনুসারে আর প্রয়োজন নেই। তবে অন্যদিকে, আপনি লিখেছেন "প্রকল্পটি সম্পূর্ণ অ-কার্যকরী হয়ে ওঠে" - যা বাস্তবে মনে হয় বৈশিষ্ট্যটি একেবারে প্রয়োজন। পরিষ্কার করে বলো.
ডক ব্রাউন

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

12

ভবিষ্যতে আমি এই ধরণের ক্যাসকেডিং রিফ্যাক্টরটি কীভাবে এড়াতে পারি?

ইচ্ছুক চিন্তাভাবনা নকশা

লক্ষ্যটি হ'ল নতুন বৈশিষ্ট্যটির জন্য ওও ডিজাইন এবং বাস্তবায়ন। এড়ানো refactoring একটি লক্ষ্য।

স্ক্র্যাচ থেকে শুরু করুন এবং নতুন বৈশিষ্ট্যটির জন্য একটি নকশা তৈরি করুন যা আপনার ইচ্ছা অনুযায়ীই। এটি ভালভাবে করার জন্য সময় নিন।

তবে এখানে কীটি "একটি বৈশিষ্ট্য যুক্ত করুন" তা উল্লেখ করুন। নতুন স্টাফ আমাদের কোড বেসের বর্তমান কাঠামোকে বৃহত্তর উপেক্ষা করতে দেয়। আমাদের ইচ্ছুক চিন্তার নকশাটি স্বাধীন। তবে আমাদের তখন আরও দুটি জিনিস দরকার:

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

হিউরিস্টিকস, শিখানো পাঠ ইত্যাদি

রিফ্যাক্টরিং একটি বিদ্যমান পদ্ধতি কলটিতে একটি ডিফল্ট প্যারামিটার যোগ করার মতোই সহজ; বা স্ট্যাটিক ক্লাস পদ্ধতিতে একটি কল call

বিদ্যমান ক্লাসগুলির এক্সটেনশন পদ্ধতিগুলি নতুন ডিজাইনের গুণমানকে সর্বনিম্ন ঝুঁকির সাথে রাখতে সহায়তা করতে পারে।

"স্ট্রাকচার" সবই। কাঠামোটি একক দায়বদ্ধতার নীতিবোধের উপলব্ধি; নকশা যা কার্যকারিতা সহজ করে তোলে। শ্রেণি শ্রেণিবিন্যাস সমস্তভাবেই কোড সংক্ষিপ্ত এবং সরল থাকবে। লিগ্যাসি কোড জঙ্গলের মাধ্যমে পরীক্ষার, পুনরায় কাজ করার এবং হ্যাকিং এড়ানোর সময় নতুন ডিজাইনের সময় তৈরি হয়।

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

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


9

মাইকেল পালক দ্বারা লিগ্যাসি কোড সহ কার্যকরভাবে কাজ করা (দুর্দান্ত) বই থেকে :

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

পরে যদি আপনি নির্ভরতাগুলি ভেঙে দিয়ে পয়েন্টের চারপাশে কোডটি কভার করতে পারেন তবে আপনি সেই দাগটিও নিরাময় করতে পারেন।


6

দেখে মনে হচ্ছে (বিশেষ করে মন্তব্যে আলোচনার মাধ্যমে) আপনি নিজেকে চাপিয়ে দিয়েছিলেন স্ব-আরোপিত নিয়মের সাথে যার অর্থ এই যে "নাবালিক" পরিবর্তনটি সফ্টওয়্যারটির সম্পূর্ণ পুনর্লিখনের সমান পরিমাণ কাজ।

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

নির্দিষ্ট কোড ব্যতীত নির্দিষ্ট পরামর্শ দেওয়া শক্ত।


3

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

আমি এই বইগুলিও সুপারিশ করতাম।

  • লিগ্যাসি কোড , পালকের সাথে কার্যকরভাবে কাজ করা
  • রিফ্যাক্টরিং , ফাউলার
  • বর্ধমান অবজেক্ট-ওরিয়েন্টড সফ্টওয়্যার, টেস্ট , ফ্রিম্যান এবং প্রাইস দ্বারা পরিচালিত
  • ক্লিন কোড , মার্টিন

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

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

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

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

3
@ ডেড এমজি সেই ক্ষেত্রে, আমি মনে করি আপনি যা করছেন তা যুক্তিসঙ্গতভাবে রিফ্যাক্টরিং বলা যায় না, যার মূল বিষয়টি হ'ল ডিজাইনের পরিবর্তনগুলি খুব সাধারণ পদক্ষেপের একটি সিরিজ হিসাবে প্রয়োগ করা।
জুলাই

3

একে অপরের উপর খুব দৃly়তার সাথে নির্ভর করে এটি কি আমার পূর্ববর্তী ক্লাসগুলির একটি লক্ষণ?

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

ভবিষ্যতে আমি কীভাবে এই জাতীয় ক্যাসকেডিং রিফ্যাক্টরিংগুলি এড়াতে পারি?

উত্তরাধিকারের কোডটিতে কাজ করা বন্ধ করা ছাড়াও, আমি ভয় করতে পারি না। তবে আপনি যা করতে পারেন তা এমন একটি পদ্ধতি ব্যবহার করছে যা দিন, সপ্তাহ বা এমনকি কয়েক মাস ধরে ওয়ার্কিং কোড বেস না রাখার প্রভাব এড়ায়।

এই পদ্ধতিটির নাম দেওয়া হয়েছে "মিকাদো মেথড" এবং এটি এর মতো কাজ করে:

  1. আপনি কাগজের টুকরোয় যে উদ্দেশ্যটি অর্জন করতে চান তা লিখুন

  2. সবচেয়ে সহজ পরিবর্তন করুন যা আপনাকে সেই দিকে নিয়ে যায়।

  3. এটি সংকলক এবং আপনার পরীক্ষার স্যুটটি ব্যবহার করে তা পরীক্ষা করে দেখুন। যদি এটি step ধাপের সাথে অবিরত থাকে তবে অন্যথায় পদক্ষেপ 4 দিয়ে চালিয়ে যান।

  4. আপনার কাগজের উপর আপনার বর্তমান পরিবর্তনের কাজটি করার জন্য যে জিনিসগুলি পরিবর্তন করতে হবে তা নোট করুন। আপনার বর্তমান কাজ থেকে নতুনগুলিতে তীর আঁকুন।

  5. আপনার পরিবর্তনগুলি ফিরিয়ে দিন এটি গুরুত্বপূর্ণ পদক্ষেপ। এটি শুরুর দিকে স্বজ্ঞাত এবং শারীরিকভাবে ব্যথাযুক্ত, তবে যেহেতু আপনি কেবল একটি সহজ জিনিস চেষ্টা করেছেন, এটি আসলে তেমন খারাপ নয়।

  6. একটি কাজ বেছে নিন, এতে কোনও বহির্গমন ত্রুটি নেই (কোনও পরিচিত নির্ভরতা নেই) এবং 2 এ ফিরে যান।

  7. পরিবর্তনটি প্রতিশ্রুতিবদ্ধ করুন, কাগজে টাস্কটি সরিয়ে ফেলুন, এমন কোনও কাজ বেছে নিন যাতে কোনও বহির্গমন ত্রুটি নেই (কোনও পরিচিত নির্ভরতা নেই) এবং 2 এ ফিরে যান।

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


2

রিফ্যাক্টরিং হ'ল একটি কাঠামোগত শৃঙ্খলা code শুরু করার আগে আপনার ইউনিট পরীক্ষাগুলি লেখা থাকতে হবে এবং প্রতিটি পদক্ষেপে একটি নির্দিষ্ট রূপান্তর থাকতে হবে যা আপনি জানেন যে কার্যকারিতাটিতে কোনও পরিবর্তন করা উচিত নয়। ইউনিট পরীক্ষা প্রতিটি পরিবর্তনের পরে পাস করা উচিত।

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


2

... আমি বৈশিষ্ট্য যুক্ত করতে প্রকল্পটি রিফেক্টর করেছি।

@ জুলস হিসাবে বলা হয়েছে, রিফ্যাক্টরিং এবং বৈশিষ্ট্যগুলি যুক্ত করা দুটি খুব আলাদা জিনিস।

  • রিফ্যাক্টরিং প্রোগ্রামটির আচরণের পরিবর্তন না করেই এর কাঠামো পরিবর্তন করার বিষয়ে changing
  • অন্যদিকে কোনও বৈশিষ্ট্য যুক্ত করা এটির আচরণকে বাড়িয়ে তুলছে।

... তবে প্রকৃতপক্ষে, কখনও কখনও আপনার জিনিসগুলি যুক্ত করার জন্য আপনাকে অভ্যন্তরীণ কাজগুলি পরিবর্তন করতে হবে তবে আমি এটিকে রিফ্যাক্টরিংয়ের পরিবর্তে পরিবর্তিত বলব।

এটিকে সামঞ্জস্য করার জন্য আমার একটি ছোটখাটো ইন্টারফেস পরিবর্তন করা দরকার

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

তারপরে গ্রাহক শ্রেণীর বর্তমানের ইন্টারফেসটি নতুনের সাথে প্রয়োগ করা যায় না, সুতরাং এটির জন্য একটি নতুন ইন্টারফেসও প্রয়োজন।

এই ইন্টারফেসের জন্য একটি পরিবর্তন দরকার ঠিক আছে ... এটি অন্যটিতে ছড়িয়ে পড়ে তা আরও ছড়িয়ে পড়ে এমন পরিবর্তনকে বোঝায়। দেখে মনে হচ্ছে কিছু ইনপুট / ডেটার জন্য চেইনটি দিয়ে প্রবাহিত হওয়া দরকার। এটাই কি?


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

... আসলে সবচেয়ে ভালো উপায় কোড পরিবর্তন ক্যাসকেডিং এড়াতে অবিকল হয় ভাল ইন্টারফেস। ;)


-1

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


1
এই কিছু সারগর্ভ প্রস্তাব উপর পয়েন্ট হয়েছে এবং পূর্বে 9 উত্তর ব্যাখ্যা বলে মনে হচ্ছে না
মশা

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