Monkeypatching ভাল প্রোগ্রামিং অনুশীলন হিসাবে বিবেচনা করা হয়?


15

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

তবে, আমি এই কৌশলটি দেখেছি মূলধারার প্রকল্পগুলিতে "সাধারণ উপায়" হিসাবে ব্যবহৃত, উদাহরণস্বরূপ জেন্টের gevent.monkeyমডিউলে

মানকিপ্যাচিং মূলধারার, স্বাভাবিক, গ্রহণযোগ্য প্রোগ্রামিং অনুশীলনে পরিণত হয়েছে?

আরও দেখুন: জেফ আতউড রচিত "মনকিপাচিং ফর হিউম্যানস"


13
আমি বলব যে বানরের প্যাচিং নামক কিছুটিকে প্রোগ্রামিংয়ের ভাল অনুশীলন বলে মনে করা হয় না । এমনকি এটি না জেনেও এটি কেবল নামেই।
লিটলডিভি

তৃতীয় পক্ষ যদি আপনার প্রয়োজনীয় ফিক্সটি করতে না চায় তবে কী হবে?

1
@ থরবজর্ন: ভাল প্রশ্ন, একদিকে আমি বানকিপ্যাচিং পছন্দ করি না, অন্যদিকে আমি প্রকল্পের ক্লোনিং করা এবং স্থানীয় প্যাচগুলি সামান্য বিষয় হিসাবে রাখার ধারণা পছন্দ করি না don't
ভের্টেক

1
@ লিটলএডিভি: ... তারপরে এটিকে "হট ফিক্স" / "অন-দ্য ফ্লাই ফিক্স" বা "রানটাইম ফিক্স" বলুন এবং এটি ভাল লাগছে? ;) ইহা সব একই রকম.
ড্যাগলিনিজ

3
জাভাস্ক্রিপ্টটি ধারণাটির চারপাশে বেশ নির্মিত
জেডজেআর

উত্তর:


19

না, তবে কখনও কখনও মনকিপ্যাচ কম মন্দ (খারাপ ভাঙা কোড থাকার চেয়ে) is রুবিতে বানর প্যাচগুলির জন্য আমার সাধারণ নিয়মগুলি হ'ল:

  • বানর-প্যাচের জন্য সত্যিই ভাল কারণ রয়েছে (অস্থায়ী সমালোচনামূলক হটফিক্স একটি ভাল কারণ to অ্যাক্টিভসপোর্টে কাজ না করা পর্যন্ত To_s পদ্ধতির সুন্দর বিন্যাস নয়)

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

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


11

হ্যাঁ, মনকিপাচিং খুব দরকারী!

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

স্বতন্ত্রভাবে, আমি মনে করি রানটাইম সময় পদ্ধতি / বৈশিষ্ট্য / ফাংশন পরিবর্তন করার ক্ষমতা একটি খুব দরকারী জিনিস। এমনকি জাভাস্ক্রিপ্ট লোকেরা সম্ভবত এটি না জেনে সারা দিন এটি ব্যবহার করে।

এই ক্ষেত্রে:

button.onclick = function(e) { ...}

এই সরল রেখাটি আপনি যে বোতামের আচরণ পরিবর্তন করেছেন তা চিত্রিত করে। এটি সেভাবে ডিজাইন করা হয়েছিল। তেমনি, আপনি অন্য প্রতিটি ক্রিয়াকলাপ পরিবর্তন করতে পারেন তবে এটি করা বোকামি হবে।

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

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

অবশ্যই, শেষ পর্যন্ত এবং অন্য সমস্ত কিছুর মতো, আপনি এটি কীভাবে ব্যবহার করেন তা বিষয়। আপনি দুর্দান্ত ওও স্টাফ তৈরি করতে পারেন এবং এটি খুব সুন্দর it

সম্পাদনা করুন:

আপনি নিজের লাইব্রেরি বা তৃতীয় পক্ষের প্যাচ করছেন কিনা তা আমাকে কিছু ক্ষেত্রে পার্থক্য যুক্ত করতে দিন।

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

এখন, অবশ্যই যদি আপনি কোনও প্যাচ ব্যবহার করেন কোনও ofষধের আচরণের পরিবর্তন করতে এবং এর উদ্দেশ্য / কাজের উপায়কে পৃথক করতে, তবে অবশ্যই এটি বিপর্যয়ের একটি রেসিপি। এমনকি একটি বানরও দেখতে পাবে ... ভাল, আমি আশা করি। ;)


1
কেউ বলে না এটি কার্যকর নয়। তবে এটি সাধারণভাবে একটি ভাল অনুশীলন নয়। এবং "হটফিক্স" এবং "দ্য ফ্লাই ফিক্স" আমার কাছে এর চেয়ে ভাল লাগে না।
লুকাস স্টেজস্কাল

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

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

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

... আমি পরবর্তী ক্ষেত্রে কিছু মন্তব্য যুক্ত করেছি।
ডাগলিনিস

8

আমি বিশ্বাস করি যে সমস্ত প্যাচগুলি তাদের রান-টাইম প্রকৃতির কারণে এবং নকশাকালীন সময়ে ধরা পড়ার অক্ষমতার কারণে স্বভাবগতভাবে ঝুঁকিপূর্ণ।

তারা রানটাইম ব্যতিক্রমগুলি স্বাগত জানায় এবং কেবল অনুসরণ করতে জটিল ডিবাগার এবং ঘড়ির প্রয়োজন require

লোকেরা যখন সিল ক্লাস করে তখন এগুলি ব্যবহার করা হয় এবং সুতরাং উত্তরাধিকার অসম্ভব। যাইহোক, বস্তুগুলিকে ক্ষতি না করেই প্রসারিত করার আরও ভাল উপায় রয়েছে।

আমার দুই সেন্ট


4

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

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

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


3

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

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

বিটিডাব্লু, আপনি কি কখনও বানরের প্যাচের জন্য ইউনিট পরীক্ষা লিখেছিলেন?


আমি মনে করি না আপনি এখানে এলএসপি প্রয়োগ করতে পারবেন। এটি সাব টাইপ সম্পর্কিত একটি খুব নির্দিষ্ট সংজ্ঞা আছে।
কনরাড রুডল্ফ

@ কনরাডরুডল্ফ বানর কোনও বস্তুর প্যাচ করে তার ধরণের পরিবর্তন করে। গতিশীলভাবে টাইপ করা ভাষায় প্রতি টাইপ একই ধরণের ইন্টারফেসের সাথে টাইপ ইউ হ'ল একটি ইউ টাইপ। যদি এটি হাঁসের মতো হাঁটে ...
স্কার্ফ্রিজ

"... এর ধরণের পরিবর্তন করে" - যথেষ্ট যথেষ্ট। বোধ হয়।
কনরাড রুডল্ফ

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