কেন অনেক সফ্টওয়্যার বিকাশকারী উন্মুক্ত / বদ্ধ নীতি লঙ্ঘন করে?


74

কেন অনেক সফ্টওয়্যার বিকাশকারী ফাংশন নামকরণের মতো অনেক কিছু সংশোধন করে উন্মুক্ত / বদ্ধ নীতি লঙ্ঘন করে যা আপগ্রেড করার পরে অ্যাপ্লিকেশনটি ভেঙে দেবে?

প্রতিক্রিয়া লাইব্রেরিতে দ্রুত এবং অবিচ্ছিন্ন সংস্করণগুলির পরে এই প্রশ্নটি আমার মাথায় আসে ।

প্রতি সংক্ষিপ্ত সময়ে আমি সিনট্যাক্স, উপাদানগুলির নাম, ইত্যাদি ইত্যাদিতে অনেক পরিবর্তন লক্ষ্য করি

প্রতিক্রিয়াটির আসন্ন সংস্করণে উদাহরণ :

নতুন অবচয় সতর্কতা

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

এই সতর্কতাগুলি আপনার আবেদনের আচরণকে প্রভাবিত করবে না। তবে আমরা বুঝতে পারি যে তারা কিছুটা হতাশার কারণ হতে পারে, বিশেষত যদি আপনি একটি পরীক্ষার কাঠামো ব্যবহার করেন যা কনসোল.অররারের সাথে ব্যর্থতা হিসাবে বিবেচনা করে।


  • এই পরিবর্তনগুলি কি সেই নীতির লঙ্ঘন হিসাবে বিবেচিত হয়?
  • প্রতিক্রিয়ার মতো কোনও কিছুর শিক্ষানবিস হিসাবে , আমি লাইব্রেরিতে এই দ্রুত পরিবর্তনগুলি (এটি এত হতাশার) সাথে কীভাবে শিখব?

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

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

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

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

4
কারণ সত্যিকারের শূন্য "নীতিগুলি" এবং "নকশার ধরণগুলি" রয়েছে যা বাস্তব জীবনে 100% সময় কাজ করে।
ম্যাটি ভির্ককুনেন

উত্তর:


148

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

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

ওসিপি হ'ল মডিউলটি কীভাবে লিখবেন [...], এমন কোনও পরিবর্তন ব্যবস্থাপনা প্রক্রিয়া প্রয়োগের বিষয়ে নয় যা মডিউলগুলিকে কখনই পরিবর্তন করতে দেয় না advice

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


14
ওসিপিকে "লঙ্ঘন" করার সবচেয়ে বড় কারণ আইএমও হ'ল এটি সঠিকভাবে মেনে চলতে প্রচুর প্রচেষ্টা গ্রহণ করে। .NET ফ্রেমওয়ার্ক ক্লাসগুলির বেশিরভাগই OCP লঙ্ঘন করে বলে মনে হচ্ছে এরিক একটি দুর্দান্ত ব্লগ পোস্ট রয়েছে।
বিজে মাইয়ার্স

2
@ বিজেমারস: লিঙ্কটির জন্য ধন্যবাদ। সুরক্ষিত তারতম্যের ধারণার সাথে অনুরূপ হওয়ায় ওসিপি সম্পর্কে জোন স্কিটের একটি দুর্দান্ত পোস্ট রয়েছে
ডক ব্রাউন 21

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

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

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

67

উন্মুক্ত / বদ্ধ নীতিটির সুবিধাগুলি রয়েছে তবে এর কিছু গুরুতর ত্রুটিও রয়েছে।

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

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

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

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

.NET ফ্রেমওয়ার্কের মতো কিছু নিন - এটি এখনও এক দশকেরও বেশি আগে জেনেরিকগুলি প্রবর্তনের আগে নকশাকৃত সংগ্রহের ক্লাসগুলির সেটগুলির আশেপাশে বহন করে। এটি অবশ্যই পিছনের সামঞ্জস্যের জন্য একটি वरदान (কোনও কিছু আবার না লিখেই আপনি ফ্রেমওয়ার্ক আপগ্রেড করতে পারেন) তবে এটি ফ্রেমওয়ার্কটি ফুলে যায় এবং অনেকগুলি অপ্রচলিত বিকল্পগুলির একটি বৃহত সেট সহ বিকাশকারীদের উপস্থাপন করে।

আপাতদৃষ্টিতে প্রতিক্রিয়ার বিকাশকারীরা অনুভব করেছেন যে খোলা / বন্ধ নীতিটি কঠোরভাবে অনুসরণ করা জটিলতা এবং কোড-ব্লাটের জন্য ব্যয়যোগ্য নয়।

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

(নীতিটির আমার ব্যাখ্যাটি রবার্ট সি মার্টিনের খোলা-বন্ধ নীতিমালার উপর ভিত্তি করে )


37
"মূলনীতিটি মূলত বলেছে আপনি কোনও উপাদানটির আচরণ পরিবর্তন করতে পারবেন না Instead পরিবর্তে আপনাকে পছন্দসই আচরণের সাথে উপাদানটির একটি নতুন বৈকল্পিক সরবরাহ করতে হবে এবং পিছনের সামঞ্জস্যের জন্য পুরানো সংস্করণটি অপরিবর্তিত রাখতে হবে।" - আমি এর সাথে একমত নই নীতিটি বলে যে আপনার উপাদানগুলি এমনভাবে ডিজাইন করা উচিত যাতে এর আচরণ পরিবর্তন করার প্রয়োজন হয় না কারণ আপনি যা চান তা করতে এটি প্রসারিত করতে পারেন। সমস্যাটি হ'ল আমরা কীভাবে এটি করব তা এখনও বের করতে পারি নি, বিশেষত বর্তমানে যে ভাষাগুলি ব্যাপকভাবে ছড়িয়ে পড়েছে তা নিয়ে। এক্সপ্রেশন সমস্যাটির একটি অংশ ...
Jörg ডব্লু মিতাগ

8
… উদাহরণস্বরূপ জাভা বা সি-র উভয়েরই মত প্রকাশের সমাধান নেই। হাস্কেল এবং স্কালা করে তবে তাদের ব্যবহারকারীর সংখ্যা অনেক ছোট।
Jörg ডব্লু মিটাগ

1
@ জর্জিও: হাস্কেলের ক্ষেত্রে সমাধানটি টাইপ ক্লাস। স্কালায়, সমাধানটি ইমপ্লিটস এবং অবজেক্টস। দুঃখিত, বর্তমানে আমার কাছে লিঙ্কগুলি নেই। হ্যাঁ, মাল্টিমোথডস (আসলে, তাদের "মাল্টি" হওয়ার দরকার নেই, এটি বরং লিপ্পের পদ্ধতিগুলির "উন্মুক্ত" প্রকৃতি যা প্রয়োজনীয়) এটিও একটি সম্ভাব্য সমাধান are দ্রষ্টব্য যে এক্সপ্রেশন সমস্যার একাধিক বাক্য রয়েছে, কারণ সাধারণত কাগজগুলি এমনভাবে লেখা হয় যে লেখকটি এক্সপ্রেশন সমস্যাটিতে একটি বিধিনিষেধ যুক্ত করে যার ফলস্বরূপ বর্তমানে বিদ্যমান বিদ্যমান সমাধানগুলি অবৈধ হয়ে যায়, তারপরে দেখায় যে কীভাবে তার নিজের…
Jörg W Mittag

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

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

20

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

গল্পের অন্য দিকটি গোল্ডেন হ্যান্ডকফস হিসাবে পরিচিত। সর্বাধিক খোলা / বন্ধ নীতিতে নিজেকে গোলাম করার সময় গোল্ডেন হ্যান্ডকফগুলি আপনি যা পান তা হ'ল গোল্ডেন হ্যান্ডকফগুলি তখন ঘটে যখন আপনার পণ্যটি কখনই পিছনের দিকে সামঞ্জস্যতা ভাঙে না কারণ অতীতের অনেকগুলি ভুল হয়েছে।

এর একটি বিখ্যাত উদাহরণ উইন্ডোজ 95 মেমরি ম্যানেজারে পাওয়া যায়। উইন্ডোজ 95 এর বিপণনের অংশ হিসাবে বলা হয়েছিল যে সমস্ত উইন্ডোজ 3.1 অ্যাপ্লিকেশন উইন্ডোজ 95 এ কাজ করবে। মাইক্রোসফ্ট আসলে হাজার হাজার প্রোগ্রামের উইন্ডোজ 95 এ পরীক্ষা করার জন্য লাইসেন্স অর্জন করেছিল। সমস্যাগুলির মধ্যে একটি ছিল সিম সিটি। সিম সিটিতে আসলে একটি ত্রুটি ছিল যা এটি অনিবন্ধিত মেমোরিতে লিখেছিল। উইন্ডোজ ৩.১-এ, "যথাযথ" মেমরি ম্যানেজার ব্যতীত, এটি একটি ছোটখাটো ভুল প্যাস ছিল। যাইহোক, উইন্ডোজ 95-এ, মেমরি পরিচালক এইটিকে ধরতে পারে এবং সেগমেন্টেশন ত্রুটি ঘটায়। সমাধান? উইন্ডোজ 95-এ, যদি আপনার অ্যাপ্লিকেশনটির নাম হয় simcity.exe, তবে ডিভাইসটির ত্রুটি রোধ করতে ওএস মেমরি ম্যানেজারের সীমাবদ্ধতাগুলি রিল্যাক্স করবে!

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

বেশিরভাগ সফ্টওয়্যার, বিশেষত ওপেন সোর্স, মুক্ত / বদ্ধ নীতিটির একটি সাধারণ শিথিল সংস্করণ অনুসরণ করে। অপ্রাপ্তবয়স্ক রিলিজের জন্য খোলা / বন্ধ স্বচ্ছন্দভাবে অনুসরণ করা দেখতে খুব সাধারণ, তবে বড় রিলিজের জন্য পরিত্যাজ্য। উদাহরণস্বরূপ, পাইথন ২.7 এ পাইথন ২.০ এবং ২.১ দিন থেকে অনেকগুলি "খারাপ পছন্দ" রয়েছে তবে পাইথন 3.0 এগুলি সমস্তকে সরিয়ে ফেলে। (এছাড়াও, উইন্ডোজ এনটি কোডবেস যখন তারা উইন্ডোজ 2000 প্রকাশিত উইন্ডোজ 95 কোডবেস থেকে স্থানান্তর জিনিস সমস্ত প্রকারের কপর্দকশূন্য, কিন্তু এটা হয়নি মানে আমরা একটি মেমরি ম্যানেজার আবেদন নাম পরীক্ষণ আচরণ সিদ্ধান্ত নিতে সাথে মোকাবিলা করতে হবে না!)


এটি সিমসিটি সম্পর্কে একটি দুর্দান্ত দুর্দান্ত গল্প। তোমার কি কোন উত্স আছে?
বিজে মাইয়ার্স

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

1
@ বিজেমারস: আমি নিশ্চিত যে তারা কয়েক ডজন জনপ্রিয় অ্যাপ্লিকেশনের জন্য একই রকমের সামঞ্জস্যতা "হ্যাক" পেয়েছিল pretty
ডক ব্রাউন 21

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

2
95-> এনটি ট্রানজিশনে এমনকি খুব কম জিনিসই ভেঙেছে। উইন্ডোজ জন্য মূল সিমসিটি এখনও উইন্ডোজ 10 (32-বিট) এ দুর্দান্ত কাজ করে। এমনকি ডস গেমস এখনও পুরোপুরি সূক্ষ্মভাবে কাজ করে তবে শোনায় অক্ষম করুন বা কনসোল সাবসিস্টেমটিকে সঠিকভাবে অডিও হ্যান্ডেল করার জন্য VDMSound এর মতো কিছু ব্যবহার করুন। মাইক্রোসফ্ট সামনের দিকের সামঞ্জস্যতাটিকে খুব গুরুত্ব সহকারে নিয়েছে এবং তারা কোনও "আসুন এটি ভার্চুয়াল মেশিনে রাখি" শর্টকাট গ্রহণ করছে না। এটি কখনও কখনও একটি workaround প্রয়োজন, কিন্তু এটি এখনও বেশ চিত্তাকর্ষক, বিশেষত আপেক্ষিক ক্ষেত্রে।
লুয়ান

11

ডক ব্রাউন এর উত্তর সঠিকের নিকটে, অন্যান্য উত্তরগুলি ওপেন ক্লোজড নীতিমালার ভুল বোঝাবুঝির চিত্র তুলে ধরে।

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

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

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

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

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

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

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


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

1
@ জ্যাকউসবি পিপল এবং এমনকি কোড পরিবর্তনগুলি ওসিপি লঙ্ঘন করে না, উপাদানগুলি (যেমন কোডের প্রকৃত অংশ) do (এবং পুরোপুরি পরিষ্কারভাবে বোঝার জন্য, এর অর্থ উপাদানটি ওসিপি নিজেই বাঁচতে ব্যর্থ হয়েছে, এটি অন্য কোনও উপাদানগুলির ওসিপি লঙ্ঘন করে না)) আমার উত্তরের পুরো বক্তব্যটি ওসিপি কোড পরিবর্তন সম্পর্কে কথা বলছে না , ভাঙ্গা বা অন্যথায়। কোনও উপাদান হয় এক্সটেনশনের জন্য উন্মুক্ত এবং পরিবর্তনের জন্য বন্ধ, বা এটি যেমন নেই, যেমন কোনও পদ্ধতি হতে পারে privateবা নাও হতে পারে । যদি কোনও লেখক পরে কোনও privateপদ্ধতি তৈরি publicকরে, তার অর্থ এই নয় যে তারা অ্যাক্সেস নিয়ন্ত্রণ লঙ্ঘন করেছে, (১/২)
ডেরেক এলকিন্স

2
... বা এর অর্থ এই নয় যে পদ্ধতিটি আসলে privateআগে ছিল না । "একটি প্রকাশিত উপাদান অপসারণ স্পষ্টভাবে একটি ব্রেকিং পরিবর্তন," একটি নন সিকুইটার is হয় নতুন সংস্করণের উপাদানগুলি OCP কে সন্তুষ্ট করে না তারা তা করে না, এটি নির্ধারণ করার জন্য আপনার কোডবেসের ইতিহাসের দরকার নেই। আপনার যুক্তি অনুসারে, আমি কখনই এমন কোড লিখতে পারিনি যা ওসিপিকে সন্তুষ্ট করে। আপনি পিছনের দিকের সামঞ্জস্যতা, কোড পরিবর্তনের একটি সম্পত্তি, ওসিপি দিয়ে কোডের সম্পত্তি conf আপনার মন্তব্যটি কুইকোর্টের পিছনে সামঞ্জস্যপূর্ণ নয় বলে যতটা অনুভূতি তৈরি করে। (2/2)
ডেরেক এলকিন্স 12

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

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