মুক্ত / বন্ধ নীতিটি স্পষ্ট করুন


25

যেমনটি আমি এটি ব্যাখ্যা করেছি, মুক্ত / বদ্ধ নীতিতে বলা হয়েছে যে একবার লিখিত কোডটি পরিবর্তন করা উচিত নয় (বাগ ফিক্সগুলি বাদ দিয়ে)। কিন্তু যদি আমার ব্যবসায়ের নিয়ম পরিবর্তন হয় তবে আমি কি এই পরিবর্তনগুলি প্রয়োগ করে কোডটি সংশোধন করব না? আমার সন্দেহ হয় যে নীতিটি আমার কাছে বোধগম্য হয় না সে সম্পর্কে আমি কিছু বুঝতে পারছি না।

উত্তর:


22

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

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

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

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


1
যদি ব্যবসায়ের নিয়ম পরিবর্তন হয় তবে কোনও বাগ সহ পুরোপুরি কাজ করার কোনও অনুমান নেই, সুতরাং উন্মুক্ত / ঘনিষ্ঠ নীতিটি প্রয়োগ হয় না?
জেফো

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

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

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

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

13

আপনি কি অবজেক্টমেন্টারে আঙ্কেল ববসের পালস দ্বারা খোলা-ক্লোজড প্রিন্সিপাল নিবন্ধটি পড়েছেন? আমি মনে করি এটি সেখানকার আরও ভাল ব্যাখ্যা।

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

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

সফ্টওয়্যার এন্টি (ক্লাস, মডিউল, ফাংশনস, ইত্যাদি) খোলার জন্য খোলা উচিত, তবে পরিবর্তনের জন্য বন্ধ করা উচিত।

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

বিবরণ

মুক্ত-বদ্ধ নীতি অনুসারে মডিউলগুলির দুটি প্রাথমিক বৈশিষ্ট্য রয়েছে।

  1. তারা "এক্সটেনশনের জন্য উন্মুক্ত" are
    এর অর্থ মডিউলটির আচরণ প্রসারিত হতে পারে। অ্যাপ্লিকেশন পরিবর্তনের প্রয়োজনীয়তা হিসাবে বা নতুন অ্যাপ্লিকেশনগুলির চাহিদা পূরণের জন্য আমরা মডিউলটিকে নতুন এবং বিভিন্ন উপায়ে আচরণ করতে পারি।
  2. এগুলি "পরিবর্তনের জন্য বন্ধ" ”
    এই জাতীয় মডিউলটির উত্স কোডটি চালিত। এটিতে উত্স কোড পরিবর্তন করার জন্য কাউকে অনুমতি নেই।

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

বিমূর্ততা মূল ...


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

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

@ মিশেল - সম্পূর্ণরূপে সম্মত হন, এটি পরীক্ষার যোগ্য আদর্শ করার জন্য কোডটি রিফ্যাক্টর করার মতো প্রায় almost
মার্টিজ ভার্বার্গ

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

1
কি দারুন. কোডটি চালিত হয়? আমি কখনই আঙ্কেল বব এর বড় ভক্ত হইনি। এই অধ্যক্ষটি পেডেন্টিক, অত্যন্ত অ-বাস্তববাদী এবং বাস্তবতার সাথে সীমাবদ্ধ সংযোগ রয়েছে।
ব্যবহারকারী 4949300

12

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

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


2
হ্যাঁ, কারণ অনুশীলনে, এমন কোনও শ্রেণি তৈরি করা সম্ভব নয় যা সমস্ত সম্ভাব্য ফিউচারের উপযোগী করে তোলা যেতে পারে, যদি না আপনি সমস্ত পদ্ধতি সুরক্ষিত করেন (যা YAGNI নীতিটি চূড়ান্ত করে এবং লঙ্ঘন করে যা O / C এর চেয়ে অনেক বেশি ইনপোর্টান্টেন্ট) Dito)।
মার্টিন উইকম্যান

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

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

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

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

6

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

বিমূর্ততা কী, এই বিষয়টিকে ঘিরে আমার মাথা পেতে খুব অসুবিধা হয়। মূলত যদি বিমূর্ততাটি ভুল হত তবে কী হবে? যদি ব্যবসায়ের কার্যকারিতা উল্লেখযোগ্যভাবে পরিবর্তিত হয়?

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

আপনার কোডের ভাল পরীক্ষার কভারেজ থাকার কারণে আপনার কোড বেসকে বাতাসের পুনরুদ্ধার করা উচিত। এর অর্থ হল যে জিনিসগুলিকে ভুল করা ঠিক আছে - আপনার পরীক্ষাগুলি আপনাকে আরও ভাল ডিজাইনের দিকে পরিচালিত করতে সহায়তা করবে।

বলছেন যে, যদি কোনও পরীক্ষা না হয় তবে এই নীতিটি যথাযথ।

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