সি # তে "অভ্যন্তরীণ" কীওয়ার্ডের ব্যবহারিক ব্যবহার


419

আপনি কি দয়া করে ব্যাখ্যা করতে পারবেন যে internalসি # তে কীওয়ার্ডের জন্য ব্যবহারিক ব্যবহার কী ?

আমি জানি যে internalসংশোধকটি বর্তমান সমাবেশে অ্যাক্সেস সীমাবদ্ধ করে, তবে কখন এবং কোন পরিস্থিতিতে আমার এটি ব্যবহার করা উচিত?

উত্তর:


379

ইউটিলিটি বা সহায়ক ক্লাস / পদ্ধতিগুলি যা আপনি একই সমাবেশের মধ্যে অন্যান্য অনেক ক্লাস থেকে অ্যাক্সেস করতে চান তবে আপনি অন্যান্য সম্মেলনে কোডটি অ্যাক্সেস করতে পারবেন না তা নিশ্চিত করতে চান।

এমএসডিএন থেকে (আর্কাইভ.অর্গের মাধ্যমে):

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

InternalsVisibleToটার্গেট অ্যাসেম্বলি অভ্যন্তরীণ ক্লাসগুলিতে বিশেষ অ্যাক্সেস প্রাপ্ত এমন "বন্ধু" সমাবেশগুলি তৈরি করতে আপনি সমাবেশ স্তরের বৈশিষ্ট্য সহ অভ্যন্তরীণ সংশোধকও ব্যবহার করতে পারেন ।

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


8
ইন্টার্নালভিজিবলটো বৈশিষ্ট্যটি একটি দুর্দান্ত সহায়তা। ধন্যবাদ.
21 21

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

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

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

13
আমি মনে করি অভ্যন্তরীণ উপায় জনসাধারণের চেয়ে বেশি কার্যকর। আপনি যখন সর্বজনীন ব্যবহার করবেন তখনই আপনি যখন স্পষ্টভাবে বলবেন "এখানে, ব্যবহারকারী - আমি আপনাকে ব্যবহার করার জন্য একটি দরকারী ফাংশন সরবরাহ করছি"। আপনি যদি কোনও ব্যবহারকারী গ্রন্থাগারের পরিবর্তে কোনও অ্যাপ্লিকেশন লিখছেন তবে সবকিছু অভ্যন্তরীণ হওয়া উচিত কারণ আপনি বাহ্যিকভাবে কল করার জন্য লোকদের কোনও ফাংশন দেওয়ার চেষ্টা করছেন না। আপনি যদি কোনও ব্যবহারকারীর গ্রন্থাগারটি লিখছেন, তবে কেবলমাত্র দরকারী কার্যকারিতা যা আপনি ব্যবহারকারীকে প্রদান, বজায় রাখা, সমর্থন এবং সময় শেষ না হওয়া অবধি सार्वजनिक রাখার প্রত্যাশা করেন। অন্যথায়, এটি অভ্যন্তরীণ করুন।
ড্যারেল প্ল্যাঙ্ক

85

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

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

অভ্যন্তরীণ বিষয়টি এটি নয় যে এটি ববকে জীবনকে কঠিন করে তোলে। এটি এটি আপনাকে প্রকল্প কী বৈশিষ্ট্যগুলি, আজীবন, সামঞ্জস্যতা এবং এগুলি সম্পর্কে ব্যয়বহুল প্রতিশ্রুতি দেয় তা নিয়ন্ত্রণ করতে দেয়।


5
নিখুঁত জ্ঞান তোলে। কেবল ইচ্ছে করে যে আমাদের অভ্যন্তরীণ সদস্যদের ওভাররাইড করার ক্ষমতা ছিল, কারণ আমরা সকলেই এখানে প্রাপ্তবয়স্কদের সম্মতি দিই।
cwallenpoole

6
পছন্দ করেছেন যদি আমি সংকলিত কোডটির উত্তরাধিকারী হয়ে থাকি যাতে এতে "অভ্যন্তরীণ" থাকে তবে আমি আটকে আছি, তাই না? "না, অন্য বিকাশকারী আপনাকে মিথ্যা বলেছে এই সংকলকটি সহজভাবে বলার কোনও উপায় নেই instead পরিবর্তে আপনার প্রতি আমার বিশ্বাস করা উচিত" যদি না আমি প্রতিবিম্ব ব্যবহার করি।
cwallenpoole

11
@ কেওয়ালেনপুল: আপনি যদি মিথ্যাবাদীদের দ্বারা লিখিত কোডগুলি ব্যবহার করেন যদি আপনি পছন্দ করেন না এমন কোড লেখেন তবে তাদের কোডটি ব্যবহার বন্ধ করুন এবং আপনার নিজের পছন্দ মতো কোডটি লিখুন যা আপনার ভাল।
এরিক লিপার্ট

2
@ এরিকলিপার্ট যে গালে জিহ্বা হওয়ার কথা ছিল, তা আমি আপত্তি জানাতে চাইনি। (আমি বেশিরভাগ ক্ষেত্রেই নিশ্চিত হয়েছি যে আমি এ জাতীয় ক্ষেত্রে এসএল আছি)।
cwallenpoole

5
@ কোয়ালেনপুল: আমি মোটেই ক্ষুব্ধ নই। আমি আপনাকে এই দুর্ভাগ্যজনক পরিস্থিতিতে আটকে থাকা উচিত বলে ভাল পরামর্শ দিচ্ছি।
এরিক লিপার্ট

60

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


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

28
সুতরাং আপনি যখন ঘুমোবেন তখন আপনি আপনার দরজাটি লক করবেন না, কারণ আপনি কখনও চোরের তালা দিয়ে থামার কথা শুনেছেন না?
সার্জিও

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

32

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

হাইডিং জটিলতা (ওরফে এনক্যাপসুলেশন) মানসম্পন্ন সফ্টওয়্যার ইঞ্জিনিয়ারিংয়ের প্রধান ধারণা।


20

অভ্যন্তরীণ কীওয়ার্ডটি ভারী ব্যবহৃত হয় যখন আপনি অ-পরিচালিত কোডের উপরে একটি মোড়ক তৈরি করেন।

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

আপনি মনোঃ কায়রো একবার দেখে নিতে পারেন, এটি কায়রো লাইব্রেরির চারপাশে একটি মোড়ক যা এই পদ্ধতির ব্যবহার করে।


12

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

যেহেতু অ্যাসেম্বলি ইন্টারফেসটি সাধারণত তার ক্লাস ইন্টারফেসের যোগফলের চেয়ে বেশি সংকীর্ণ হয় তাই আমি এটি ব্যবহার করি এমন অনেকগুলি জায়গা রয়েছে।


3
আপনি যদি "যথাসম্ভব কঠোর সংশোধক ব্যবহার করেন" তবে ব্যক্তিগত কেন নয়?
আর মার্টিনহো ফার্নান্দেস

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

11

আমি অভ্যন্তরীণ অনেক বেশি অপ্রয়োজনীয় বলে মনে করি। আপনার সত্যিকারের নির্দিষ্ট ফাংশনটি কেবল নির্দিষ্ট শ্রেণীর কাছে প্রকাশ করা উচিত নয় যা আপনি অন্যান্য গ্রাহকদের কাছে করবেন না।

এটি আমার মতে ইন্টারফেসটি ভেঙে দেয়, বিমূর্ততাটি ভেঙে দেয়। এটি কখনও ব্যবহার করা উচিত নয় এটি বলার অপেক্ষা রাখে না, তবে আরও ভাল সমাধান হ'ল কোনও ভিন্ন শ্রেণীর রিফ্যাক্টর বা সম্ভব হলে ভিন্ন উপায়ে ব্যবহার করা। তবে এটি সর্বদা সম্ভব নাও হতে পারে।

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

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

তবে এর কয়েকটি বিষয়গত হতে পারে এবং আমি বলছি না এটি কখনই ব্যবহার করা উচিত নয়। দরকার হলে শুধু ব্যবহার করুন।


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

8

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

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

নেমস্পেস বেস .অসাধারণ
{
  জনসাধারণের বিমূর্ত ক্লাস প্যারেন্ট
  {
    অভ্যন্তরীণ অ্যাবস্ট্রাক্ট শূন্যরূপী সামমথোদ ();
  }

  // এটি একই সমাবেশে আসার পরে এটি ঠিকঠাক কাজ করে।
  পাবলিক ক্লাস চাইল্ড উইথিন: পিতা বা মাতা
  {
    অভ্যন্তরীণ ওভাররাইড শূন্যস্থান সোমথথ ()
    {
    }
  }
}

নেমস্পেস আরেকটি। অসম্পূর্ণ
{
  // কাবুম, কারণ আপনি কোনও অভ্যন্তরীণ পদ্ধতি ওভাররাইড করতে পারবেন না
  পাবলিক ক্লাস চাইল্ড আউটসাইড: পিতা বা মাতা
  {
  }

  পাবলিক ক্লাস পরীক্ষা 
  { 

    //শুধুই সুন্দর
    প্রাইভেট প্যারেন্ট _ প্যারেন্ট;

    পাবলিক টেস্ট ()
    {
      // এখনও ঠিক আছে
      _ পিতামাতা = নতুন চাইল্ডবিথিন ();
    }
  }
}

আপনি দেখতে পাচ্ছেন, এটি কার্যকরভাবে কাউকে উত্তরাধিকার সূত্রে সক্ষম না হয়ে পিতামাতার শ্রেণিটি ব্যবহার করার অনুমতি দেয়।


7

এই উদাহরণে দুটি ফাইল রয়েছে: এসেম্বলি 1 সি এবং এসেম্বলি 2 সিএস। প্রথম ফাইলটিতে একটি অভ্যন্তরীণ বেস শ্রেণি রয়েছে, বেসক্লাস। দ্বিতীয় ফাইলটিতে বেসক্লাস ইনস্ট্যান্ট করার একটি প্রচেষ্টা ত্রুটি তৈরি করবে will

// Assembly1.cs
// compile with: /target:library
internal class BaseClass 
{
   public static int intM = 0;
}

// Assembly1_a.cs
// compile with: /reference:Assembly1.dll
class TestAccess 
{
   static void Main()
   {  
      BaseClass myBase = new BaseClass();   // CS0122
   }
}

এই উদাহরণে, উদাহরণস্বরূপ আপনি একই ফাইলগুলি ব্যবহার করুন 1 এবং বেসক্লাসের অ্যাক্সেসযোগ্যতার স্তরটিকে জনসাধারণে পরিবর্তন করুন । অভ্যন্তরীণ সদস্য সদস্য এর অ্যাক্সেসযোগ্যতা স্তর পরিবর্তন করুন । এই ক্ষেত্রে, আপনি ক্লাসটি ইনস্ট্যান্ট করতে পারেন, তবে আপনি অভ্যন্তরীণ সদস্যকে অ্যাক্সেস করতে পারবেন না।

// Assembly2.cs
// compile with: /target:library
public class BaseClass 
{
   internal static int intM = 0;
}

// Assembly2_a.cs
// compile with: /reference:Assembly1.dll
public class TestAccess 
{
   static void Main() 
   {      
      BaseClass myBase = new BaseClass();   // Ok.
      BaseClass.intM = 444;    // CS0117
   }
}

উত্স : http://msdn.microsoft.com/en-us/library/7c5ka91b(VS.80).aspx


6

যখন আপনার কাছে এমন পদ্ধতি, ক্লাস ইত্যাদি রয়েছে যা বর্তমান সমাবেশের ক্ষেত্রের মধ্যে অ্যাক্সেসযোগ্য হওয়া দরকার এবং এর বাইরে কখনও নয়।

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


6

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

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

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


5

থাম্বের নিয়ম হিসাবে দুই ধরণের সদস্য রয়েছে:

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

4

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


4

অভ্যন্তরীণ ক্লাসগুলি আপনাকে আপনার সমাবেশের এপিআই সীমাবদ্ধ করতে সক্ষম করে। আপনার সুবিধাগুলি বোঝার জন্য আপনার এপিআইকে সহজ করার মতো এর সুবিধা রয়েছে benefits

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

আমি ক্লাস পর্যায়ে এবং অ্যাসেম্বলি পর্যায়ে এনক্যাপসুলেশন পছন্দ করি। এমন কেউ কেউ আছেন যারা এর সাথে দ্বিমত পোষণ করেন তবে কার্যকারিতাটি উপলব্ধ কিনা তা জেনে আনন্দিত।


2

আমার কাছে একটি প্রকল্প রয়েছে যা ডেটা ব্যাক-এন্ডের জন্য লিনিক-টু-এসকিউএল ব্যবহার করে। আমার দুটি প্রধান নেমস্পেস রয়েছে: বিজ এবং ডেটা। লিনকিউ ডেটা মডেল ডেটাতে থাকে এবং "অভ্যন্তরীণ" হিসাবে চিহ্নিত হয়; বিজ নেমস্পেসে সার্বজনীন ক্লাস রয়েছে যা লিনকুই ডেটা ক্লাসকে ঘিরে রাখে।

সুতরাং আছে Data.Client, এবং Biz.Client; পরবর্তীকালে ডেটা অবজেক্টের সমস্ত প্রাসঙ্গিক বৈশিষ্ট্য প্রকাশ করা হয়, যেমন:

private Data.Client _client;
public int Id { get { return _client.Id; } set { _client.Id = value; } }

বিজ অবজেক্টগুলির একটি ব্যক্তিগত নির্মাণকারী রয়েছে (কারখানার পদ্ধতি ব্যবহারের জন্য বাধ্য করতে), এবং একটি অভ্যন্তরীণ নির্মাতা যা দেখতে এটি দেখতে:

internal Client(Data.Client client) {
    this._client = client;
}

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

এই প্রথম আমি সত্যিই internalঅনেক বেশি ব্যবহার করেছি এবং এটি বেশ কার্যকর প্রমাণিত হচ্ছে।


2

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

তবে আমি internalনির্দিষ্ট কারণ ছাড়াই ক্লাস বা সদস্য তৈরির সাথে কোনও বক্তব্য দেখতে পাচ্ছি না , কেবল তাদের নির্দিষ্ট করা publicবা privateনির্দিষ্ট কারণ ছাড়াই বোধগম্য ।


1

আমি কেবলমাত্র অভ্যন্তরীণ কীওয়ার্ডটি ব্যবহার করেছি যা আমার পণ্যের লাইসেন্স-চেকিং কোড ;-)


1

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

যদি আপনার কারখানা বা অন্য কোনও কেন্দ্রীয় অবস্থান অবজেক্টগুলি তৈরির জন্য থাকে তবে আপনার সমাবেশের ব্যবহারকারীর কেবল পাবলিক ইন্টারফেস বা বিমূর্ত বেস শ্রেণীর সাথে ডিল করতে হবে।

এছাড়াও, অভ্যন্তরীণ নির্মাতারা আপনাকে কখন এবং কখন অন্যথায় সরকারী শ্রেণি ইনস্ট্যান্ট করা হয় তা নিয়ন্ত্রণ করতে দেয়।


1

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

মন্তব্যগুলি এই পদ্ধতির বিষয়ে স্বাগত।


@ সামিক - আপনি কি দয়া করে বিশদটি বর্ণনা করতে পারেন, "সাধারণত এটি সুপারিশ করা হয় যে আপনি কোনও সমাবেশের বহিরাগত ব্যবহারকারীদের কাছে কোনও তালিকা অবজেক্টটি প্রকাশ করবেন না, বরং একটি আইনামেবলকে প্রকাশ করুন" " কেন অগণিত পছন্দ হয়?
হাওইক্যাম্প

1
@ হাউইইক্যাম্প: প্রায়শই আইনুনামেবল তালিকায় কেবল পঠনযোগ্য অ্যাক্সেস দেয় কারণ যেখানে আপনি সরাসরি তালিকাটি প্রকাশ করেন, ক্লায়েন্টরা (যেমন উপাদানগুলি মুছুন ইত্যাদি) দ্বারা এটি পরিবর্তন করা যেতে পারে যা অনিচ্ছাকৃত হতে পারে।
সামিক আর

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

1

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

যদি আপনার Big_Important_Classপ্রকল্পের জন্য আপনার প্রকল্পটি বাইরে ব্যবহারের উদ্দেশ্যে করা হয়, তবে আপনার এটি চিহ্নিত করা উচিত নয় internal

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


তার পরিবর্তে ব্যক্তিগত ব্যবহার করবেন না কেন?
কয়েদি জিরো

1
privateশব্দ শুধুমাত্র শ্রেণী structs যে অন্য বর্গ বা struct মধ্যে সংজ্ঞায়িত করা হয় ব্যবহার করা যেতে পারে। একটি নেমস্পেসের মধ্যে সংজ্ঞায়িত শ্রেণি কেবলমাত্র ঘোষিত হতে পারে publicবা internal
ম্যাট ডেভিস

1

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

  1. ভবিষ্যতের প্রকাশে পরিবর্তনের সম্ভাবনা রয়েছে (তারা প্রকাশ্যে থাকলে আপনি ক্লায়েন্ট কোডটি ভেঙে ফেলতেন)
  2. ক্লায়েন্টের পক্ষে অকেজো এবং বিভ্রান্তির কারণ হতে পারে
  3. নিরাপদ নয় (যাতে অনুপযুক্ত ব্যবহার আপনার গ্রন্থাগারটিকে বেশ খারাপভাবে ভেঙে দিতে পারে)

প্রভৃতি

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


-7

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

public class DangerousClass {
    public void SafeMethod() { }
    internal void UpdateGlobalStateInSomeBizarreWay() { }
}

তুমি কি বলতে চাচ্ছ? এটা খুব পরিষ্কার নয়। কমপক্ষে আমার কাছে না।
pqsk

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