বাহ্যিক আচরণ পরিবর্তন না করে আমি কতদূর রিফ্যাক্টরিংয়ে ঠেলাতে পারি?


27

মার্টিন ফোলারের মতে , কোড রিফ্যাক্টরিং হ'ল (জোর দেওয়া খনি):

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

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

সুতরাং, আমি কোন মুহূর্তে পরিবর্তনটি রিফ্যাক্টর হওয়া বন্ধ করে এবং আরও কিছু হয়ে ওঠে তা জানার আগ্রহী। "রিফ্যাক্টরিং" শব্দটি বৃহত্তর পরিবর্তনের জন্য অপব্যবহার করা যেতে পারে: এর জন্য কি আলাদা শব্দ আছে?

হালনাগাদ. ইন্টারফেস সম্পর্কে অনেক আকর্ষণীয় উত্তর, কিন্তু পদ্ধতি রিফ্যাক্টরিং ইন্টারফেস পরিবর্তন না?


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

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

2
রিফ্যাক্টরিংয়ের সীমানা হ'ল ইউনিট পরীক্ষা। আপনার যদি তাদের দ্বারা আঁকানো কোনও স্পেসিফিকেশন থাকে তবে আপনি যে কোনও কিছু পরিবর্তন করেন যা পরীক্ষাগুলি ভাঙ্গেন না তা পুনরুদ্ধারকারী?
জর্জ সিলভা

1
তাই একই প্রশ্ন stackoverflow.com/questions/1025844/...
sylvanaar

আপনি যদি আরও জানতে চান তবে এই বিষয়টিও একটি সক্রিয় গবেষণা ক্ষেত্র। এই বিষয়ে অনেক বৈজ্ঞানিক প্রকাশনার আছে, যেমন, informatik.uni-trier.de/~ley/db/indices/a-tree/s/...
Skarab

উত্তর:


25

এই প্রসঙ্গে "বাহ্যিক" এর অর্থ "ব্যবহারকারীদের কাছে পর্যবেক্ষণযোগ্য"। ব্যবহারকারীরা কোনও অ্যাপ্লিকেশন বা পাবলিক এপিআইর ক্ষেত্রে অন্যান্য প্রোগ্রামের ক্ষেত্রে মানুষ হতে পারে।

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

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

যে কোনও কোডের পুনর্নির্মাণকে রিফ্যাক্টরিং হিসাবে কল করার প্রবণতা রয়েছে যা আমার ধারণা, ভুল।

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

তাহলে বাহ্যিক আচরণ পরিবর্তন করে এমন প্রতারণার জন্য সঠিক শব্দটি কী?

আমি এটিকে আবার নতুন ডিজাইন বলব ।

হালনাগাদ

ইন্টারফেস সম্পর্কে অনেক আকর্ষণীয় উত্তর, কিন্তু পদ্ধতি রিফ্যাক্টরিং ইন্টারফেস পরিবর্তন না?

কি? নির্দিষ্ট ক্লাস, হ্যাঁ। কিন্তু এই শ্রেণিগুলি কোনওভাবেই বাইরের বিশ্বের প্রত্যক্ষ দৃশ্যমান? যদি তা না হয় - কারণ তারা আপনার প্রোগ্রাম ভিতরে, আর না বাইরের ইন্টারফেসের (API / গুই) অংশ প্রোগ্রাম (যদি না পরিবর্তন বিরতি কিছু, অবশ্যই) কোন পরিবর্তনটি করে সেখানে বহিরাগত পক্ষ দ্বারা পর্যবেক্ষণযোগ্য হয় -।

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

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

সম্প্রতি আমি এই ক্লাসটি রিফ্যাক্ট করে এর বেশিরভাগ ক্ষেত্র এবং পদ্ধতিগুলির নাম পরিবর্তন করেছিলাম (আমাদের পূর্বসূরীদের দ্বারা সম্পূর্ণ অবহেলিত স্ট্যান্ডার্ড জাভা নামকরণ কনভেনশন অনুসরণ করতে)। আমি আরও যথাযথ এবং প্রকারের সাথে প্রতিস্থাপন Stringএবং charক্ষেত্রগুলি আরও সংশোধন করার পরিকল্পনা করি plan এগুলি অবশ্যই ক্লাসের ইন্টারফেসকে বদলে দেবে, তবে (যদি আমি আমার কাজটি সঠিকভাবে করি) তবে এটির কোনও কিছুই আমাদের অ্যাপের ব্যবহারকারীদের কাছে দৃশ্যমান হবে না। তাদের মধ্যে কেউই পৃথক চার্জ কীভাবে উপস্থাপন করা হয় তা বিবেচনা করে না, যদিও তারা অবশ্যই চার্জের ধারণাটি জানেনenumboolean। আমি উদাহরণস্বরূপ আরও একশত অন্যান্য শ্রেণি নির্বাচন করতে পারতাম যে কোনও ডোমেইন ধারণাকে উপস্থাপন করে না, তাই শেষ ব্যবহারকারীদের কাছে এমনকি ধারণাগতভাবে অদৃশ্য হয়েও আমি ধারণা করেছি যে ধারণা স্তরে কমপক্ষে কিছু দৃশ্যমানতা রয়েছে এমন উদাহরণ বেছে নেওয়া আরও আকর্ষণীয়। এটি দুর্দান্তভাবে দেখায় যে শ্রেণি ইন্টারফেসগুলি কেবল ডোমেন ধারণাগুলির (সর্বোত্তমভাবে) উপস্থাপনা হয়, আসল জিনিস নয় *। উপস্থাপনা ধারণা প্রভাবিত না করে পরিবর্তন করা যেতে পারে। এবং ব্যবহারকারীদের কেবল ধারণাটি রয়েছে এবং তা বোঝে; ধারণা এবং উপস্থাপনের মধ্যে ম্যাপিং করা আমাদের কাজ।

* এবং যে কোনওটি সহজেই যুক্ত করতে পারেন যে ডোমেন মডেলটি, যা আমাদের শ্রেণি প্রতিনিধিত্ব করে, এটি কেবল কিছু "আসল জিনিস" এর আনুমানিক উপস্থাপনা ...


3
নাইটপিকিং করে আমি বলব 'ডিজাইন চেঞ্জ' আবার ডিজাইন করা হবে না। পুনরায় নকশার শব্দটি খুব যথেষ্ট।
ব্যবহারকারী 606723

4
আকর্ষণীয় - আপনার উদাহরণে ক্লাস এ 'কোডের একটি বিদ্যমান দেহ', এবং পদ্ধতি এম যদি প্রকাশ্য হয় তবে এ এর ​​বাহ্যিক আচরণ পরিবর্তন করা হচ্ছে। সুতরাং আপনি সম্ভবত বলতে পারবেন যে ক্লাস এ পুনরায় নকশা করা হয়েছে, যেখানে সামগ্রিক ব্যবস্থাটি পুনঃসংশ্লিষ্ট হচ্ছে
সস

আমি ব্যবহারকারীদের কাছে পর্যবেক্ষণযোগ্য পছন্দ করি। একারণে আমি বলব না ইউনিট পরীক্ষাগুলি ভাঙ্গা একটি চিহ্ন, বরং শেষের শেষ বা ইন্টিগ্রেশন পরীক্ষার চিহ্ন হবে।
অ্যান্ডি উইসেন্ডেঞ্জার

8

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


1
আমি এটি একটি ভাল উত্তর মনে করি না। রিফ্যাক্টরিং এপিআই পরিবর্তনগুলি বোঝাতে পারে। তবে এটি শেষ-ব্যবহারকারী বা ইনপুট / ফাইলগুলি পড়ার / উত্পন্ন করার উপায়ে প্রভাব ফেলবে না।
আরডিএস

3

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

  • এই সীমানাগুলি আমাকে সুরক্ষিত বোধ করার জন্য যথেষ্ট দৃ are় হয় যে আমি মাঝে মাঝে পার হয়ে গেলে এটি খুব শীঘ্রই সনাক্ত করা হবে যাতে পুনরুদ্ধার করতে আমাকে অনেকগুলি পরিবর্তন করতে হবে না। অন্যদিকে, এগুলি অপ্রাসঙ্গিক আচরণ পরিবর্তনের বিষয়ে চিন্তা না করে কোডের উন্নতি করতে পর্যাপ্ত প্রবণতা দেয়।

  • আমি বিশেষত যে জিনিসটি পছন্দ করি তা হ'ল এই জাতীয় সীমানাগুলি তাই বলার জন্য অভিযোজিত । আমি বলতে চাইছি, 1) আমি পরিবর্তনটি করি এবং যাচাই করে / পরীক্ষা করে যা এটি মেনে চলে। তারপরে, ২) এটি কিউএ বা ব্যবহারকারী পরীক্ষায় পাস করা হয়েছে - এখানে নোট করুন, এটি এখনও ব্যর্থ হতে পারে কারণ কিছুটা পরীক্ষা / পরীক্ষায় অনুপস্থিত। ঠিক আছে, 3 এ) টেস্টিং পাস হলে, আমি ঠিক করেছি, ঠিক আছে। অন্যথায়, যদি 3 বি) টেস্টিং ব্যর্থ হয় তবে আমি 4) পরিবর্তনটি রোল-ব্যাক করব এবং 5) পরীক্ষা যুক্ত করবো বা স্পষ্টভাবে স্পষ্ট করবো যাতে পরের বারের মতো এই ভুলটির পুনরাবৃত্তি না ঘটে। মনে রাখবেন যে পরীক্ষায় পাস বা ব্যর্থ হওয়া সত্ত্বেও, আমি কিছু অর্জন করি - কোড / টেস্ট / স্পিকের কোনওটি উন্নত হয় - আমার প্রচেষ্টা মোট বর্জ্যতে পরিণত হয় না।

অন্যান্য ধরণের সীমানা হিসাবে - এখনও পর্যন্ত, আমার খুব ভাগ্য হয়নি।

"ব্যবহারকারীর কাছে পর্যবেক্ষণযোগ্য" হ'ল যদি এটি অনুসরণ করার শৃঙ্খলা থাকে তবে এটি আমার পক্ষে নিরাপদ বাজি which যা আমার কাছে বিদ্যমান / নতুন পরীক্ষা তৈরির বিশ্লেষণে সর্বদা প্রচুর পরিমাণে জড়িত - সম্ভবত খুব বেশি প্রচেষ্টা। এই পদ্ধতির বিষয়ে আমি অন্যটি পছন্দ করি না এটি হ'ল অন্ধভাবে অনুসরণ করা খুব সীমাবদ্ধ হতে পারে। - এই পরিবর্তনটি নিষিদ্ধ করা হয়েছে কারণ এর সাথে লোড হওয়া ডেটা 2 এর পরিবর্তে 3 সেকেন্ড নেবে - উহম ভালভাবে ব্যবহারকারী / ইউএক্স বিশেষজ্ঞের সাথে কীভাবে এটি পরীক্ষা করা প্রাসঙ্গিক কিনা তা চেক করবেন? - কোনও উপায় নেই, পর্যবেক্ষণযোগ্য আচরণের কোনও পরিবর্তন নিষিদ্ধ, পিরিয়ড। সেফ? আপনি বাজি! উৎপাদনশীল? আসলে তা না.

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


3

Refactoring বই তার বার্তায় চমত্কার শক্তিশালী যে আপনি করতে পারেন শুধুমাত্র refactoring যখন আপনি ইউনিট পরীক্ষা কভারেজ আছে সঞ্চালন

সুতরাং, আপনি বলতে পারেন যে আপনি যতক্ষণ না আপনার ইউনিট পরীক্ষাগুলির কোনওটি ভঙ্গ করছেন না, আপনি পুনরায় সংশোধন করছেন । আপনি যখন পরীক্ষাগুলি ভঙ্গ করেন, আপনি আর রিফ্যাক্টর করছেন না।

তবে: ক্লাস বা সদস্যদের নাম পরিবর্তন করার মতো সাধারণ রিফ্যাক্টরিংগুলি সম্পর্কে কীভাবে? তারা কি পরীক্ষা ভঙ্গ করে না?

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

তবে, প্রায়ই এটি বিবেচনা করুন, পরীক্ষাগুলি ভেঙে যায় না কারণ আপনি যে আচরণটি বদলেছিলেন তা বদলেছে, তবে পরীক্ষাগুলি ভঙ্গুর টেস্ট


3

এই প্রসঙ্গে "বাহ্যিক আচরণ" সংজ্ঞায়নের সেরা উপায় হতে পারে "পরীক্ষার ক্ষেত্রে"।

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

অন্ততপক্ষে, বিষয়টিতে প্রকাশিত বিভিন্ন বই সম্পর্কে এটি আমার বোঝা (যেমন, ফওলারের)।


2

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

সুতরাং ক্লাসগুলির মধ্যে ফাংশনগুলি সরিয়ে নেওয়া ঠিক হবে যতক্ষণ না তারা ব্যবহারকারীরা দেখেন না।

যতক্ষণ না কোড রিওভার বাহ্যিক আচরণগুলি পরিবর্তন করে না, নতুন ফাংশন যুক্ত করে বা বিদ্যমান ফাংশনগুলি সরিয়ে দেয় না, আমি অনুমান করি যে রিওয়ার্কটিকে রিফ্যাক্টরিং বলা ঠিক আছে is


একমত নন। যদি আপনি আপনার সম্পূর্ণ ডেটা অ্যাক্সেস কোডটিকে হাইবারনেট দিয়ে প্রতিস্থাপন করেন তবে এটি বাহ্যিক আচরণ পরিবর্তন করে না তবে এটি ফোলারের "শৃঙ্খলাবদ্ধ কৌশলগুলি" অনুসরণ করে না। এটি পুনর্নবীকরণ হবে এবং এটিকে রিফ্যাক্টরিং বলার সাথে জড়িত ঝুঁকির কারণগুলি লুকিয়ে থাকবে।
পিডিআর

1

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

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

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

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


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

@ জব: ​​আপনি নতুন চশমা পূরণের জন্য প্রোগ্রামটি পরিবর্তন করেছেন।
jmoreno

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

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

আইএমএইচও - এই পুরো প্রশ্নটি প্রোগ্রামারদের জন্য কোনও কার্যকর মূল্য হতে খুব রমনীয় হতে পারে।
জেক হ্যানসেল

1

"বাহ্যিক আচরণ" দ্বারা তিনি মূলত পাবলিক ইন্টারফেসের কথা বলছেন তবে এটি সিস্টেমের আউটপুট / শৈল্পিকাগুলিও অন্তর্ভুক্ত করে। (যেমন আপনার কাছে এমন একটি পদ্ধতি রয়েছে যা কোনও ফাইল উত্পন্ন করে, ফাইলের ফর্ম্যাট পরিবর্তন করা বাহ্যিক আচরণ পরিবর্তন করবে)

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

e2: "তাহলে বাহ্যিক আচরণ পরিবর্তন করে এমন প্রতারণার জন্য সঠিক শব্দটি কী?" - এপিআই রিফ্যাক্টরিং, ব্রেকিং পরিবর্তন ইত্যাদি ... এটি এখনও রিফ্যাক্টরিং, এটি কেবলমাত্র ক্লায়েন্টদের সাথে বন্যের মধ্যে থাকা একটি পাবলিক ইন্টারফেসের রিফ্যাক্টর করার সেরা অনুশীলনগুলি অনুসরণ করে না।


তবে তিনি যদি কোনও পাবলিক ইন্টারফেসের কথা বলছেন তবে "মুভ মেথড" রিফ্যাক্টরিংয়ের কী হবে?
সাইবেরিয়ানগুই

@ ইডসা আপনার প্রশ্নের উত্তর দেওয়ার জন্য আমার প্রতিক্রিয়া সম্পাদনা করেছেন।

@ কোকেলা, তবে এখনও এই বিষয়টি আমার কাছে অস্পষ্ট যে এই "রিফ্যাক্টরিং" জিনিসটি কোথায় শেষ হয়
সাইবেরিয়ানগুই

@idsa আপনি যে সংজ্ঞা পোস্ট করেছেন সে অনুসারে আপনি কোনও সর্বজনীন ইন্টারফেস পরিবর্তন করার মুহুর্তে এটি রিফ্যাক্টরিং হয়ে যায়। (পাবলিক পদ্ধতিটি এক শ্রেণি থেকে অন্য শ্রেণিতে স্থানান্তর করা এর উদাহরণ হতে পারে)

0

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

আপনি বলতে পারেন যে ক্লাসের প্রসঙ্গে "রিফ্যাক্টরিং" ব্যবহৃত হয়, এর অর্থ "রিফ্যাক্টরিং কৌশল", সুতরাং "মুভ মেথড" রিফ্যাক্টরিং-দ্য প্রক্রিয়াটির সংজ্ঞাটি ভঙ্গ করে না। একই পৃষ্ঠায়, নকশার প্রসঙ্গে "রিফ্যাক্টরিং" কোডের বিদ্যমান বৈশিষ্ট্যগুলিকে ভেঙে দেয় না, এটি কেবল নকশাকে "বিরতি" দেয় (যা যাইহোক এটির উদ্দেশ্য)।

উপসংহারে, প্রশ্নের মধ্যে উল্লিখিত "সীমানা" পার হয়ে যায় যদি আপনি রিফেক্টরিং-দ্য প্রক্রিয়াটির সাথে কৌশলটি (মিশ্রণ: ডি) রিফ্যাক্টরিং-কৌশলটি বিভ্রান্ত করেন তবে crossed

পিএস: ভাল প্রশ্ন, বিটিডব্লিউ।


এটি বেশ কয়েকবার পড়ুন, তবে এখনও তা পাবেন না
সাইবারিয়ানগুই

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

0

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


0

রিফ্যাক্টরিংয়ের সীমানা প্রদত্ত রিফ্যাক্টরিংয়ের জন্য নির্দিষ্ট specific কেবল একটি উত্তর হতে পারে না এবং সবকিছুকে ঘিরে থাকে। একটি কারণ শোধনাগার শব্দটি নিজেই অ-নির্দিষ্ট।

আপনি চুল্লী করতে পারেন:

  • সোর্স কোড
  • প্রোগ্রাম আর্কিটেকচার
  • ইউআই ডিজাইন / ব্যবহারকারীর ইন্টারঅ্যাকশন

এবং আমি নিশ্চিত যে আরও কয়েকটি জিনিস।

সম্ভবত রিফ্যাক্টর হিসাবে সংজ্ঞায়িত করা যেতে পারে

"একটি ক্রিয়া বা ক্রিয়াগুলির একটি সেট যা কোনও নির্দিষ্ট সিস্টেমে এনট্রপি হ্রাস করে"


0

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

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

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


0

আপনি "বাহ্যিক" অর্থটি ভাবতে পারেন

বাইরের দৈনিক দাঁড়ানো।

সুতরাং সিস্টেমে যে কোনও পরিবর্তন যা কোনওটি শূকরকে প্রভাবিত করে না, এটি পুনরুদ্ধারকারী হিসাবে বিবেচিত হতে পারে।

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

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