বাস্তব-বিশ্ব মানের প্রতিনিধিত্ব করে একটি ধ্রুবক আপডেট করা কি ওপেন-ক্লোজড নীতি লঙ্ঘন করে?


10

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

এই ধ্রুবকটিকে স্থির করার কাজটি কি ওপেন-ক্লোজড নীতি লঙ্ঘনের ইঙ্গিত দেয় , যেহেতু এটি পোস্ট করে যে কোনও শ্রেণি সংশোধন করে বন্ধ করা উচিত?


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

4
আমি রিচার্ডের সাথে পুরোপুরি একমত এই "ধ্রুবক" সমাধানের জন্য আপনার যদি কোডটি পরিবর্তন করতে হয় তবে ওসিপি আপনার সমস্যাগুলির মধ্যে সর্বনিম্ন।
রবার্ট হার্ভে

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

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

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

উত্তর:


14

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

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

  • শ্রেণিকে উত্তরাধিকারী করে তোলা (সাধারণত টেম্পলেট পদ্ধতির প্যাটার্ন বা কৌশল প্যাটার্নের সাথে একত্রে)

  • নির্ভরতা ইনজেকশনের জন্য "ইনজেকশন পয়েন্ট" সরবরাহ করে

  • শ্রেণি বা উপাদানটির জন্য কনফিগারেশন প্যারামিটার সরবরাহ করে (উদাহরণস্বরূপ, আপনার ক্ষেত্রে যেমন কনস্ট্রাক্টর প্যারামিটার "ট্যাক্স শতাংশ" রয়েছে, বা অন্য কোনও কনফিগারেশন প্রক্রিয়া ব্যবহার করে)

  • প্রোগ্রামিং ভাষা বা বাস্তুতন্ত্রের উপর নির্ভর করে অন্য উপায় হতে পারে

পাঠ্য বইয়ে আপনি যে আদর্শ উদাহরণগুলি খুঁজে পান তা প্রায়শই প্রথম বা দ্বিতীয় ধরণের হয় (আমার ধারণা কারণ সেই বইয়ের লেখকদের দৃষ্টিতে তৃতীয় প্রকারটি খুব তুচ্ছ mentioned

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

সুতরাং অন্যেরা আপনাকে এখানে যা বলা হচ্ছে তা সত্ত্বেও, উত্তরটি পরিষ্কারভাবে "হ্যাঁ" , এটি ওসিপি লঙ্ঘন হবে।

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


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

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

1
আমার ধারণা আমি যদি একই প্রশ্নটি জিজ্ঞাসা করি তবে একটি প্রশ্নের উত্তর আমার জিজ্ঞাসা করা উচিত: "এমন আচরণ কি কোনওভাবে বাড়ানো বা কনফিগার করা উচিত?"। যদি হ্যাঁ - তবে কোনও শ্রেণীর সরাসরি পরিবর্তনের চেয়ে ওসিপি লঙ্ঘন। যদি না হয় - ওসিপি-র চেয়ে সহজেই সেই পরিস্থিতিতে প্রযোজ্য না।
ভাদিম সামোখিন

1
@ জাপাডলো: আমি মনে করি যদি কোনও উপাদান প্রয়োজনীয় শ্রেণীর জন্য ওসিপি পূরণ করে তবে খুব বেশি বিষয়গত না হয় - বেশিরভাগ ক্ষেত্রে যদি কোনও নতুন প্রয়োজনের সাথে কোনও উপাদানটির উত্স কোডের সংশোধন প্রয়োজন হয়, বা উপাদানটি এই প্রয়োজনীয়তা সমর্থন করে তবে এটি বেশ স্পষ্টভাবে স্পষ্ট is । "সম্ভব পন্থা বাস্তবায়ন এটি প্রথম 3 অর্থ আমি তালিকাভুক্ত অবধি সীমিত করা হয় না, আমার সম্পাদন করা দেখতে কারণ OCP শুধু একটি বিভ্রান্তিকর নাম এবং বেশ খারাপ পাঠ্যবই প্রচুর ব্যাখ্যা করা হয় আত্মনিষ্ঠা আপনার ধারণা সৃষ্ট হতে পারে।।
ডক ব্রাউন 21

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

4

অন্যরা যেমন বলছেন, আদর্শভাবে শ্রমিক আয়ের শ্রেণি ধ্রুবকের প্যারামিটারাইজেশন করার অনুমতি দেবে, এই শ্রেণিকে সেই মান থেকে স্বাধীন করে তুলবে।

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

দীর্ঘমেয়াদী, আপনি দেখতে পাবেন যে করের সমস্যাগুলির জন্য মাত্র এক শতাংশের বেশি প্রয়োজন - উদাহরণস্বরূপ, একদিন কর আইন আরও জটিল এবং এর জন্য বেশ কয়েকটি শতাংশ এবং কিছু স্থির প্রয়োজন (যেমন% 10k এর অধীনে পরিমাণটি X% এ আরোপিত হয়, যখন বাকিগুলি Y% এ শুল্কযুক্ত)।

এটি মূলত একটি কৌশল প্যাটার্ন ব্যবহার করার পরামর্শ দেয়, যেখানে এখানে প্রশ্নবিদ্ধ প্রধান শ্রেণি করের গণনার জন্য কোনও কৌশল অবজেক্ট গ্রহণ করে।

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

প্রতিটি কৌশল কীভাবে প্রকৃত ট্যাক্স গণনা করতে পারে তার সাথে তার নিজস্ব বাহ্যিক কনফিগারেশন যুক্তিগুলি পার্স / ব্যাখ্যা করতে পারে।

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


আরো দেখুন নির্ভরতা ইনজেকশন , যেখানে আমরা এই জিনিস explictly পরিচালনা করুন।


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

1

যদি করের মান পরিবর্তন করতে আপনার ক্লাসটি পরিবর্তন করতে হয় তবে এর নকশাটি অবশ্যই ওসিপি লঙ্ঘন করছে। আপনি এখন পর্যন্ত যা বর্ণনা করেছেন তার জন্য উপযুক্ত নকশা হ'ল ক্যালকুলেটর শ্রেণীর জন্য করের মানটিকে প্যারামিটার হিসাবে নেওয়া।

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

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


0

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


-2

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


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