নেস্টেড ক্লাসগুলি কি রেট করা হয়?


9

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

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

এখানে দুটি উদাহরণ রয়েছে যা আমি তাদের জন্য স্রেফ ব্যবহার করেছি: https://gist.github.com/3975581 - প্রথমটি আমাকে উত্তরাধিকারসূত্রে দৃ tight়ভাবে সম্পর্কযুক্ত জিনিসগুলিকে একসাথে রাখতে সহায়তা করেছে, দ্বিতীয়টি আমাকে কর্মীদের সুরক্ষিত সদস্যদের অ্যাক্সেস দিতে দেয় ...


আমি কেবল উত্তর / অন্তর্দৃষ্টিগুলির জন্য ধন্যবাদ বলতে চাই - আমি কীভাবে কোনও উত্তর বেছে নেব তা নিশ্চিত নই যাতে আমি যে পরামর্শ পেয়েছি এবং পুনর্বিবেচনা করতে গিয়েছিলাম তা ছেড়ে দিয়ে আমি তা ছেড়ে যাব ...
অ্যারন আনোডিড

উত্তর:


6

আমি এটিকে "খুব কম ব্যবহৃত ডিজাইনের মেকানিজম" বলব না - কমপক্ষে, সর্বজনীন নয়: যদিও এমন কিছু দোকান রয়েছে যেখানে কিছু অবদানকারী নেস্টেড ক্লাসগুলি ব্যবহার করে ভ্রান্ত হতে পারে, এটি মোটেও অস্পষ্ট বৈশিষ্ট্য নয়।

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


* জাভাতে অনুরূপ বৈশিষ্ট্যের ব্যবহার অনেক বেশি, কারণ সি # তে উপলব্ধ অন্যান্য বিকল্প জাভাতে নেই।


তাহলে ওওপি ডিজাইনের সারমর্ম অনুযায়ী অন্য শ্রেণিতে পুরোপুরি কোনও শ্রেণি গোপন করা ভাল?
ম্যাক্সুড

1
@ ম্যাক্সুড আপনি যদি কোনও ক্লাসটি আড়াল করতে পারেন তবে এটি লুকিয়ে রাখা ভাল। আপনার API টির ব্যবহারকারীর আপনার API প্রয়োগ করার পদ্ধতি সম্পর্কে যত তাড়াতাড়ি সম্ভব জানা উচিত।
dasblinkenlight

3

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

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

নেস্টেড ক্লাসগুলি ব্যবহার করে একটি দরকারী সফ্টওয়্যার প্যাটার্নের জন্য, এখানে দেখুন


10
আমি পুনঃব্যবহারযোগ্য জিনিসটি কখনও কিনিনি, এটি সাধারণত রাখার মতো নয়। (1) বিদ্যমান কোড / ক্লাসগুলিতে কল করা (যার বিষয়ে আপনি কথা বলছেন বলে মনে হয় এবং যা আমি সাধারণত পুনঃব্যবহারের সংজ্ঞা হিসাবে দেখি) ওওপি-র সাথে একেবারেই কিছু করার নেই, এটি কেবলমাত্র মৌলিক পরিমিতি। (২) সাব টাইপ পলিমারফিজম, যা ওওপি-র একটি নির্দিষ্ট বৈশিষ্ট্য, নির্দিষ্ট প্রয়োগকরণকে অপ্রাসঙ্গিক করে ক্লায়েন্ট কোডের পুনরায় ব্যবহারের অনুমতি দেয় , অর্থাৎ এটি কংক্রিট শ্রেণীর অ্যাক্সেসযোগ্য কি না তা ঠিক একইভাবে কাজ করে। IOW এর পুনরায় ব্যবহার আমি কিনেছি তবে এটি নেস্টেড ক্লাসগুলির সাথেও কাজ করে।

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

@ অ্যারোনআনোডাইড এটি নেস্টেড ক্লাসগুলি ব্যবহার করার ভাল উপায় সম্পর্কে একটি উত্তর হতে হবে। এটি ঠিক কীভাবে / কেন আমি সেগুলি ব্যবহার করি এটি কোডটি সংগঠিত করতে সহায়তা করে।
ইজকাটা

2

am I going down an inherintly bad path

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

ব্যক্তিগত সদস্যদের অ্যাক্সেসের জন্য নেস্টেড ক্লাসগুলির ব্যবহার একটি বৈধ ব্যবহার হিসাবে দেখা যাচ্ছে (আমি ব্যক্তিগতভাবে এটি কখনও করি নি) তবে আপনার নির্দিষ্ট ক্ষেত্রে এখানে কাজ করে না।

যেমন শরীরের অংশ উদাহরণ। কারণ নেস্টেড ক্লাসগুলির সবগুলিই সর্বজনীন আপনি নেমস্পেসিং বাদে সত্যই বেশি কিছু করছেন না। যদি এই শ্রেণিগুলি আরও কার্যকারিতা অন্তর্ভুক্ত করে তবে আপনি কেবল দেখতে পাবেন যে নেস্টেড ক্লাসগুলি কেবল ইন্টারফেসগুলিকে বিশৃঙ্খলা করে এবং নির্দিষ্ট কিছু সন্ধান করার জন্য আপনি কোডের মধ্য দিয়ে চলেছেন। আমি আরও লক্ষ্য করেছি যে আপনি ক্লাসে নেস্ট করেছেন বলে আপনি নামকরণের কনভেনশনগুলি ভেঙে ফেলতে এবং আপনার ক্লাসের নাম লোয়ার কেস (সম্ভবত এটি একটি পছন্দ ছিল) দিয়ে নাম লেখাতে বাধ্য হন। তবে এই যুক্তিগুলি আসলে যে কোনও ভুলের চেয়ে বেশি सतर्क রয়েছে।

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

arm newArm = new Body.torso.side.arm("");

1

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


1

আমার অভিজ্ঞতা, নেস্ট ক্লাস

  • আমাকে হতাশ করতে ফিরে এসেছিল
  • যখন আমি কোণগুলি কাটাতে চেয়েছিলাম তখন ব্যবহার করা হয়েছে
  • একটি দুঃস্বপ্ন পরীক্ষা করা
  • উদ্বেগ এবং সামগ্রিক নকশা পৃথকীকরণ নেতিবাচক প্রভাব ছিল

আপনার ক্লাসে একটি সংক্ষিপ্ত নজর রেখেছিল এবং এখনই আমার মনে হয়:

  • এটি দেখতে বেদনাদায়ক কারণ শ্রেণিটি বিশাল
  • পুরো শরীর তৈরি না করে আমি "আঙ্গুলগুলি" পরীক্ষা করতে পারি না
  • আমার ধড়ের একাধিক বাস্তবায়ন থাকতে পারে না। "মানবদেহ" প্রসঙ্গে এটি সুস্পষ্ট বলে মনে হয় না, তবে ভিন্ন দৃশ্যে এটি সুস্পষ্ট হয়ে উঠবে।

কেন আপনার ক্লাসটি একাধিক ক্লাসে আলাদা করবেন না এবং তাদের পৃথক নেমস্পেস দিন। যেমন

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