জাভায় সলিড নীতিমালা সম্পর্কে আপনার যা জানা দরকার



এই নিবন্ধে আপনি উদাহরণ সহ জাভায় সলড নীতিগুলি এবং বাস্তব জীবনের উদাহরণ সহ তাদের গুরুত্ব সম্পর্কে বিস্তারিত জানবেন।

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

জাভা মধ্যে নল নীতি ইতিহাস

রবার্ট সি মার্টিন পাঁচটি অবজেক্ট-ভিত্তিক নকশার নীতি দিয়েছেন এবং এর জন্য সংক্ষেপিত 'S.O.L.I.D' সংক্ষিপ্তসার ব্যবহৃত হয়। আপনি যখন যৌথ পদ্ধতিতে S.O.L.I.D এর সমস্ত নীতি ব্যবহার করেন, সহজেই পরিচালনা করা যায় এমন সফ্টওয়্যার বিকাশ করা আপনার পক্ষে সহজ হয়ে যায়। S.O.L.I.D ব্যবহারের অন্যান্য বৈশিষ্ট্যগুলি হ'ল:





  • এটি কোডের গন্ধ এড়ায়।
  • দ্রুত রিফ্র্যাক্টর কোড।
  • অভিযোজিত বা চটপটে সফ্টওয়্যার বিকাশ করতে পারে।

আপনি যখন আপনার কোডিংয়ে S.O.L.I.D নীতিটি ব্যবহার করেন, আপনি কোডটি লিখতে শুরু করেন যা দক্ষ এবং কার্যকর উভয়ই।



S.O.L.I.D এর অর্থ কী?

সলিড জাভা পাঁচটি নীতি প্রতিনিধিত্ব করে যা:

  • এস : একক দায়িত্বের নীতি
  • বা : উন্মুক্ত নীতি
  • এল : লিসকভ প্রতিস্থাপনের নীতি
  • আমি : ইন্টারফেস বিভাজন নীতি
  • ডি : নির্ভরতা বিপরীত নীতি

এই ব্লগে আমরা জাভায় পাঁচটি সলাইড নীতি আলোচনা করব।



জাভা মধ্যে একক দায়িত্বের নীতি

এটা কি বলে?

রবার্ট সি মার্টিন এটিকে বর্ণনা করেছেন যে এক শ্রেণীর একমাত্র এবং একমাত্র দায়িত্ব থাকা উচিত।

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

একটি উদাহরণ দিয়ে নীতিটি ভালভাবে বোঝা যায়। কল্পনা করুন যে এমন কোনও শ্রেণি রয়েছে যা নিম্নলিখিত ক্রিয়াকলাপ সম্পাদন করে।

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

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

এই নীতিটি কেন প্রয়োজনীয়?

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

এই নীতিটি স্পষ্ট করার একটি উদাহরণ:

মনে করুন আপনাকে এমন একটি ব্যবহারকারীসেটিং পরিষেবা প্রয়োগ করতে বলা হয়েছে যেখানে ব্যবহারকারী সেটিংস পরিবর্তন করতে পারে তবে তার আগে ব্যবহারকারীকে প্রমাণীকরণ করতে হবে। এটি প্রয়োগের একটি উপায় হ'ল:

পাবলিক ক্লাস ইউজারসেটিং সার্ভিসিং {পাবলিক অকার্যকর পরিবর্তন ইমেল (ব্যবহারকারী ব্যবহারকারী) {যদি (চেকএ্যাক্সেস (ব্যবহারকারী)) {// পরিবর্তনের গ্রান্ট অপশন}} পাবলিক বুলিয়ান চেকঅ্যাক্সেস (ব্যবহারকারী ব্যবহারকারী) {// ব্যবহারকারী বৈধ কিনা তা যাচাই করুন। }}

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

পাবলিক ক্লাস ইউজারসেটিং সার্ভিসিং {পাবলিক অকার্যকর পরিবর্তন ইমেল (ব্যবহারকারী ব্যবহারকারী) {যদি (সিকিউরিটিসোর্সেস.সিএকএকস্যাকস (ইউজার)) {// class}} পাবলিক ক্লাস সিকিউরিটি সার্ভিসেস {পাবলিক স্ট্যাটিক বুলিয়ান চেকঅ্যাক্সেস (ইউজার ব্যবহারকারী) {// অ্যাক্সেস পরীক্ষা করে। }}

জাভাতে বদ্ধ নীতি খুলুন

রবার্ট সি মার্টিন এটিকে বর্ণনা করেছেন কারণ সফ্টওয়্যার উপাদানগুলি এক্সটেনশনের জন্য উন্মুক্ত হওয়া উচিত, তবে পরিবর্তনের জন্য বন্ধ ছিল।

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

  • ক্লাস থেকে উত্তরাধিকারী

  • শ্রেণি থেকে প্রয়োজনীয় আচরণগুলি ওভাররাইটিং করা

  • শ্রেণীর নির্দিষ্ট আচরণগুলি প্রসারিত করা

মুক্ত-বদ্ধ নীতিটির একটি দুর্দান্ত উদাহরণ ব্রাউজারগুলির সাহায্যে বোঝা যায়। আপনার ক্রোম ব্রাউজারে এক্সটেনশানগুলি ইনস্টল করার কথা মনে আছে?

ক্রোম ব্রাউজারের বেসিক ফাংশনটি বিভিন্ন সাইট সার্ফ করা। আপনি যখন ক্রোম ব্রাউজার ব্যবহার করে কোনও ইমেল লিখছেন, আপনি কি ব্যাকরণ পরীক্ষা করতে চান? হ্যাঁ, আপনি কেবল ব্যাকরণী এক্সটেনশন ব্যবহার করতে পারেন, এটি আপনাকে সামগ্রীতে ব্যাকরণ চেক সরবরাহ করে।

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

কেন এই নীতি প্রয়োজন?

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

বলুন আমাদের বিভিন্ন আকারের অঞ্চলগুলি গণনা করতে হবে। আমরা আমাদের প্রথম আকারের আয়তক্ষেত্রের জন্য একটি বর্গ তৈরি শুরু করিযার 2 টি বৈশিষ্ট্য দৈর্ঘ্য রয়েছে& প্রস্থ।

পাবলিক বর্গ আয়তক্ষেত্র {পাবলিক ডাবল দৈর্ঘ্য পাবলিক ডাবল প্রস্থ}

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

পাবলিক ক্লাস এরিয়া ক্যালকুলেটর {পাবলিক ডাবল ক্যালকুলেট রেক্টেঙ্গেল আরিয়া (আয়তক্ষেত্র আয়তক্ষেত্র) {রিটার্ন আয়তক্ষেত্র.দৈর্ঘ্য * আয়তক্ষেত্র w th}

এ পর্যন্ত সব ঠিকই. এখন ধরা যাক আমরা আমাদের দ্বিতীয় আকারের বৃত্তটি পাই। সুতরাং আমরা তাত্ক্ষণিকভাবে একটি নতুন শ্রেণির বৃত্ত তৈরি করিএকক বৈশিষ্ট্য ব্যাসার্ধের সাথে।

পাবলিক ক্লাস সার্কেল {পাবলিক ডাবল ব্যাসার্ধ}

তারপরে আমরা আরিয়াক্যালকুলেটরটি সংশোধন করবএকটি নতুন পদ্ধতির গণনা সার্কেলআরিয়া () এর মাধ্যমে বৃত্ত গণনা যোগ করার ক্লাস

পাবলিক ক্লাস এরিয়া ক্যালকুলেটর {পাবলিক ডাবল ক্যালকুলেট রেক্টাঙ্গেলআরিয়া (আয়তক্ষেত্র আয়তক্ষেত্র) {রিটার্ন আয়তক্ষেত্র le দৈর্ঘ্য angle আয়তক্ষেত্র w প্রস্থ} পাবলিক ডাবল ক্যালকুলেট সার্কেলআরিয়া (সার্কেল সার্কেল) {রিটার্ন (22/7) * সার্কেল.রেডিয়াস * সার্কেল।আড়িয়াস}}

তবে নোট করুন যে আমরা উপরে আমাদের সমাধানটি যেভাবে ডিজাইন করেছি তাতে কিছু ত্রুটি ছিল।

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

এরিয়া ক্যালকুলেটরকে আরও নতুন পদ্ধতিতে তাদের গণনার যুক্তি যুক্ত করা প্রয়োজন। আমরা প্রকৃতপক্ষে আকারের ক্ষেত্রটি প্রসারণ করছি না বরং যুক্ত প্রতিটি আকারের জন্য আমরা কেবল খণ্ড-খাবার (বিট-বিট) সমাধান করছি।

খোলা / বন্ধ নীতি মেনে উপরোক্ত নকশা পরিবর্তন:

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

পাবলিক ইন্টারফেস শেপ {পাবলিক ডাবল ক্যালকুলেট আরিয়া ()} সার্বজনীন বর্গক্ষেত্র আয়তক প্রয়োগ করে {ডাবল দৈর্ঘ্য ডাবল প্রস্থ পাবলিক ডাবল ক্যালকুলেট আরিয়া () {রিটার্ন দৈর্ঘ্য * প্রস্থ}} পাবলিক ক্লাস সার্কেল শেপ প্রয়োগ করে {পাবলিক ডাবল রেডিয়াস পাবলিক ডাবল ক্যালকুলেট আরিয়া () 22 (22) / 7) * ব্যাসার্ধ * ব্যাসার্ধ}

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

পাবলিক ক্লাস এরিয়া ক্যালকুলেটর {পাবলিক ডাবল গণনা শাপআরিয়া (শেপ শেপ) {রিটার্ন শেপ.ক্যালকুলেট আরিয়া ()}}

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

জাভায় লিসকভ সাবস্টিটিউশন নীতি

রবার্ট সি মার্টিন এটিকে বর্ণনা করেছেন যেহেতু ডেরাইভড প্রকারগুলি অবশ্যই তাদের বেস ধরণের জন্য পুরোপুরি পরিবর্তনযোগ্য হতে পারে।

লিসকোভের প্রতিস্থাপনের নীতিটি Q (x) কে একটি সম্পত্তি হিসাবে ধরে নিয়েছে, টি-এর সাথে সম্পর্কিত x এর সত্তা সম্পর্কে প্রমাণযোগ্য Now এখন, এই নীতি অনুসারে, Q (y) এখন s টাইপের y এর সাথে সম্পর্কিত বস্তুর জন্য প্রমাণযোগ্য হওয়া উচিত, এবং এস আসলে টি এর একটি সাব টাইপ you আপনি এখন বিভ্রান্ত হয়ে পড়েছেন এবং জানেন না যে লিসকভের প্রতিস্থাপন নীতিটি আসলে কী বোঝায়? এটির সংজ্ঞাটি কিছুটা জটিল হতে পারে তবে বাস্তবে এটি বেশ সহজ। একমাত্র জিনিস হ'ল প্রতিটি উপক্লাস বা উত্পন্ন শ্রেণি তাদের পিতামাতাদের বা বেস শ্রেণীর জন্য পরিবর্তনযোগ্য হতে হবে।

আপনি বলতে পারেন যে এটি একটি অনন্য বস্তু-ভিত্তিক নীতি। কোনও জটিলতা তৈরি না করে বা জিনিস উড়িয়ে দিয়ে বাচ্চাদের ধরণের কোনও নির্দিষ্ট প্রকারের মাধ্যমে নীতিটি আরও সরল করা যায় parent সেই পিতামাতার পক্ষে দাঁড়ানোর ক্ষমতা থাকা উচিত his এই নীতিটি লিসকভ সাবস্টিটিউশন নীতিটির সাথে নিবিড়ভাবে সম্পর্কিত।

কেন এই নীতি প্রয়োজন?

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

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

পাবলিক বর্গ আয়তক্ষেত্র {বেসরকারী অভ্যন্তরীণ দৈর্ঘ্য বেসরকারী দৈর্ঘ্য পাবলিক INT getLength () {রিটার্ন দৈর্ঘ্য} পাবলিক শূন্য সেটলেন্থ (int দৈর্ঘ্য) {এই দৈর্ঘ্য = দৈর্ঘ্য} পাবলিক int getBreadth () {রিটার্ন প্রস্থ} পাবলিক শূন্য সেট সেট (প্রস্থ) this.breadth = প্রস্থ} পাবলিক INT getArea () this এই ফিরে করুন ngth দৈর্ঘ্য * this.breadth} {

স্কোয়ারের জন্য কোডটি নীচে। নোট করুন যে স্কোয়ারটি আয়তক্ষেত্র প্রসারিত করে।

পাবলিক ক্লাস স্কয়ার আয়তক্ষেত্র প্রসারিত {পাবলিক অকার্যকর সেটব্রেথ (ইন প্রস্থ) {সুপার.সেটব্রেথ (প্রস্থ) সুপার.সেইল দৈর্ঘ্য (প্রস্থ)} পাবলিক অকার্যকর সেটলেন্থ (ইনট দৈর্ঘ্য) {সুপার.সেটলেন্থ (দৈর্ঘ্য) সুপার.সেটব্রেথ (দৈর্ঘ্য)}}

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

পাবলিক ক্লাস এলএসপিডেমো {পাবলিক অকার্যকর গণনাআরিয়া (আয়তক্ষেত্র আর) {r.setBreadth (2) r.setLength (3) assert r.getArea () == 6: printError ('علائقي', r) assert r.getLength () == 3: printError ('দৈর্ঘ্য', আর) assert r.getBreadth () == 2: printError ('প্রস্থ', আর)} ব্যক্তিগত স্ট্রিং প্রিন্টেরর (স্ট্রিং ত্রুটিআইডেন্টিফার, আয়তক্ষেত্র r) {'অপ্রত্যাশিত মান + ত্রুটিপরিবর্তক +' উদাহরণস্বরূপ '+ r.getClass ()। getName ()} পাবলিক স্ট্যাটিক শূন্য মূল (স্ট্রিং [] আরগস) {LSPDemo lsp = new LSPDemo () // আয়তক্ষেত্রের একটি উদাহরণ পাস হয়েছে lsp.calculateArea (নতুন আয়তক্ষেত্র ()) // স্কোয়ারের একটি উদাহরণ lsp.calculateArea (নতুন স্কয়ার ()) কেটে গেছে}}

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

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

  1. পদ্ধতিতে ইনপুট হিসাবে সেট দৈর্ঘ্যের দৈর্ঘ্য সর্বদা সমান হতে হবে
  2. মেথড, সেটব্রেথের ইনপুট হিসাবে প্রস্থের সর্বমোট প্রস্থের সমান হওয়া উচিত
  3. ক্ষেত্রফল দৈর্ঘ্য এবং প্রস্থের সমান হতে হবে

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

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

ইন্টারফেস বিভাজন নীতি

রবার্ট সি মার্টিন এটিকে বর্ণনা করেছেন কারণ ক্লায়েন্টরা অপ্রয়োজনীয় পদ্ধতি প্রয়োগ করতে বাধ্য করা উচিত নয় যা তারা ব্যবহার করবেন না।

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

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

কেন এই নীতি প্রয়োজন?

আমাদের বলি যে একটি রেস্তোঁরা ইন্টারফেস রয়েছে যাতে অনলাইন গ্রাহকদের কাছ থেকে আদেশ গ্রহণের জন্য ডায়াল-ইন বা টেলিফোন গ্রাহকরা এবং ওয়াক-ইন গ্রাহকদের জন্য পদ্ধতি রয়েছে। এটিতে অনলাইন পেমেন্টগুলি (অনলাইন গ্রাহকদের জন্য) পরিচালনা করার এবং ব্যক্তিগতভাবে প্রদানের ব্যবস্থা রয়েছে (ওয়াক-ইন গ্রাহকদের পাশাপাশি টেলিফোনের গ্রাহকদের জন্য যখন তাদের অর্ডার ঘরে পৌঁছে দেওয়া হয়) methods

এখন আসুন আমরা রেস্তোঁরাটির জন্য একটি জাভা ইন্টারফেস তৈরি করি এবং এটি রেস্তোঁরাInterface.java হিসাবে নামকরণ করি।

পাবলিক ইন্টারফেস রেস্তোঁরাত ইন্টারফেস {পাবলিক অকার্যকর গ্রহণযোগ্যতাঅনলাইন অর্ডার () পাবলিক শূন্যপদ গ্রহণ করুন টেলিফোন অর্ডার () পাবলিক শূন্য পেওঅনলাইন () পাবলিক শূন্য পদচারণা ইনকাস্টমারের অর্ডার () পাবলিক শূন্য পেইনপারসন ()

রেস্তোঁরাত ইন্টারফেসে 5 টি পদ্ধতি সংজ্ঞায়িত করা হয়েছে যা অনলাইন অর্ডার গ্রহণ, টেলিফোনিক অর্ডার গ্রহণ, ওয়াক-ইন গ্রাহকের কাছ থেকে আদেশ গ্রহণ, অনলাইন পেমেন্ট গ্রহণ এবং ব্যক্তিগতভাবে অর্থ গ্রহণের জন্য রয়েছে।

আসুন অনলাইন গ্রাহকদের জন্য অনলাইনক্লিয়েন্টআইপল.জভা হিসাবে রেস্তোঁরা রেস্তোঁরাটি প্রয়োগ করে শুরু করি

পাবলিক ক্লাস অনলাইনক্লিয়েন্টআইম্পল রেস্তোঁরাত ইন্টারফেস প্রয়োগ করে {পাবলিক শূন্য গ্রহনযোগ্যতাঅনলাইন অর্ডার () {// অনলাইন অর্ডার দেওয়ার জন্য যুক্তি} পাবলিক শূন্যপদ টেলিটোন অর্ডার () {// অনলাইন অর্ডারের জন্য প্রযোজ্য নয় নতুন অসমর্থিত অপেশান এক্সেকশন () paying পাবলিক শূন্য পেওনলাইন () paying // লজিক প্রদান অনলাইন} সর্বজনীন শূন্য পদচারণা কাস্টমোর্ডার অর্ডার () {// অনলাইন অর্ডারের জন্য প্রযোজ্য নয় নতুন অসমর্থিত অপারেশন এক্সেক্সশন ()} পাবলিক শূন্যপদ পেইনপ্রসন () {// অনলাইনের আদেশের জন্য প্রযোজ্য নয় নতুন অসমর্থিত অপারেটিং এক্সেকশন ()}}
  • যেহেতু উপরের কোডটি (অনলাইনক্লিয়েন্টআইপল.জভা) অনলাইন আদেশের জন্য, তাই অসমর্থিত অপারেশন এক্সেক্সশনটি নিক্ষেপ করুন।

  • অনলাইন, টেলিফোনিক এবং ওয়াক-ইন ক্লায়েন্টরা তাদের প্রত্যেকের জন্য সুনির্দিষ্ট রেস্তোঁরাযুক্ত ইন্টারফেস বাস্তবায়ন ব্যবহার করে।

  • টেলিফোনের ক্লায়েন্ট এবং ওয়াক-ইন ক্লায়েন্টের বাস্তবায়ন ক্লাসগুলিতে অসমর্থিত পদ্ধতি থাকবে।

  • যেহেতু 5 টি পদ্ধতি রেস্তোরাঁর অন্তর্গত অংশ, তাই বাস্তবায়ন ক্লাসগুলিকে তাদের 5 টিই বাস্তবায়ন করতে হবে।

  • প্রতিটি বাস্তবায়ন ক্লাসগুলি যে পদ্ধতিগুলি অসমর্থিত অপারেশন এক্সেক্সশনটি ফেলে দেয়। আপনি পরিষ্কারভাবে দেখতে পাচ্ছেন - সমস্ত পদ্ধতি প্রয়োগ করা অদক্ষ।

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

    স্নাতকোত্তর সার্টিফিকেট বনাম মাস্টার্স
  • রেস্তোঁরাআইন্টারফেস.জভা একক দায়বদ্ধতার নীতি ভঙ্গ করে কারণ অর্থ প্রদানের পাশাপাশি যুক্তি দেওয়ার জন্য যুক্তি একটি একক ইন্টারফেসে একত্রে গোষ্ঠীযুক্ত।

উল্লিখিত সমস্যাগুলি কাটিয়ে ওঠার জন্য, আমরা উপরের ডিজাইনের রিফ্যাক্টরের জন্য ইন্টারফেস বিভাজন নীতি প্রয়োগ করি।

  1. অর্থ প্রদান ও অর্ডার স্থাপনের কার্যকারিতা দুটি পৃথক দুর্বল ইন্টারফেস, পেমেন্টইন্টারফেস.জাভা এবং অর্ডারআইন্টারফেস.জভাতে আলাদা করুন।

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

  3. একক দায়িত্বের নীতি এখন পেমেন্ট ইন্টারফেস (পেমেন্টইন্টারফেস.জাভা) এবং অর্ডারিং ইন্টারফেস (অর্ডার ইন্টারফেস) হিসাবে সংযুক্ত রয়েছে।

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

আইএসপি প্রয়োগের পরে

নির্ভরতা বিপরীতে নীতি

রবার্ট সি মার্টিন এটিকে বর্ণনা করেছেন কারণ এটি কনস্ট্রাকশনগুলির উপর নির্ভর করে না বিমূর্তির উপর নির্ভর করে it এটি অনুসারে, উচ্চ-স্তরের মডিউলটি কখনই কোনও নিম্ন-স্তরের মডিউলের উপর নির্ভর করতে পারে না। উদাহরণ স্বরূপ

আপনি কিছু কেনার জন্য স্থানীয় দোকানে যান এবং আপনি নিজের ডেবিট কার্ড ব্যবহার করে এর জন্য অর্থ প্রদানের সিদ্ধান্ত নেন। সুতরাং, যখন আপনি অর্থ প্রদানের জন্য আপনার কার্ডটি কেরানিকে দেন, তখন কেরানি আপনি কী ধরনের কার্ড দিয়েছিলেন তা যাচাই করতে বিরত হন না।

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

কেন এই নীতি প্রয়োজন?

এটি কোনও প্রোগ্রামারকে হার্ডকোডযুক্ত নির্ভরতা অপসারণ করতে দেয় যাতে অ্যাপ্লিকেশনটি আলগাভাবে মিলিত হয় এবং প্রসারিত হয়।

পাবলিক ক্লাস শিক্ষার্থী {ব্যক্তিগত ঠিকানা ঠিকানা পাবলিক শিক্ষার্থী () {ঠিকানা = নতুন ঠিকানা ()}}

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

এটির সাহায্যে আমরা জাভাতে এই সলিড নীতিমালাটি শেষ করি।

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

আমাদের জন্য একটি প্রশ্ন আছে? দয়া করে এটি 'জাভাতে সলড নীতিমালা' ব্লগের মন্তব্য বিভাগে উল্লেখ করুন এবং আমরা যত তাড়াতাড়ি সম্ভব আপনার কাছে ফিরে আসব।