ব্যক্তিগত ক্ষেত্রগুলি কেন ব্যক্তিগত ধরণের ক্ষেত্রে, উদাহরণটি নয়?


153

সি # (এবং অন্যান্য অনেক ভাষায়) একই ধরণের অন্যান্য উদাহরণগুলির ব্যক্তিগত ক্ষেত্রগুলিতে অ্যাক্সেস করা পুরোপুরি বৈধ। উদাহরণ স্বরূপ:

public class Foo
{
    private bool aBool;

    public void DoBar(Foo anotherFoo)
    {
        if (anotherFoo.aBool) ...
    }
}

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

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


18
বিকল্পের জন্য কী কী সুবিধা রয়েছে?
জন স্কিটে

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

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

4
আপনি সর্বদা সংগ্রহকারী / সেটার বন্ধ একজোড়া, কন্সট্রাকটর মধ্যে ইনিশিয়ালাইজ মধ্যে পরিবর্তনশীল করতে পারেন, যা যদি ব্যর্থ হবে এই না একই যেমন initialisation সময় ছিল ... হয়
মার্টিন Sojka

8
স্কালা উদাহরণস্বরূপ ব্যক্তিগত সদস্যদের সরবরাহ করে - জাভা, সি # এবং অন্যান্য অনেক ভাষায় পাওয়া যায় না এমন অনেকগুলি অ্যাক্সেস স্তরের পাশাপাশি। এটি পুরোপুরি বৈধ প্রশ্ন।
ব্রুনো রিস

উত্তর:


73

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

public class Foo
{
    private int bar;

    public void Baz(Foo other)
    {
        other.bar = 2;
    }

    public void Boo()
    {
        Baz(this);
    }
}

কম্পাইলার অগত্যা চিন্তা করতে পারেন যে otherহয় আসলে this? সব ক্ষেত্রে নয়। যে কেউ তর্ক করতে পারে যে এটি ঠিক তখনই সংকলন করা উচিত নয়, তবে এর অর্থ আমাদের কাছে একটি কোড পাথ রয়েছে যেখানে সঠিক উদাহরণটির ব্যক্তিগত কোনও সদস্য অ্যাক্সেসযোগ্য নয়, যা আমার মনে হয় আরও খারাপ।

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

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

যাইহোক, আমি বিশ্বাস করি যে সমস্যাটি হওয়া দরকারের চেয়ে আরও বিভ্রান্তিকর করে তোলে। উপরের কোডটি কাজ না করলে বেশিরভাগ ব্যবহারকারী (নিজেকে অন্তর্ভুক্ত) এটিকে অনিবার্যভাবে সীমাবদ্ধ দেখতে পাবেন: সর্বোপরি, এটি আমার ডেটা যা আমি অ্যাক্সেস করার চেষ্টা করছি! আমাকে কেন যেতে হবে this?

সংক্ষেপে, আমি মনে করি সংকলকটির জন্য এটি "কঠিন" হওয়ায় আমি মামলাটিকে অত্যুক্তি করেছি। আমি আসলে যা করতে চাইছিলাম তা হ'ল উপরের পরিস্থিতিটি ডিজাইনারদের কাজ করা পছন্দ করবে বলে মনে হয়।


33
আইএমএইচও, এই যুক্তিটি প্রায় ভুল উপায়। সংকলক ভাষার নিয়ম প্রয়োগ করে। এটি তাদের তৈরি করে না। অন্য কথায়, যদি ব্যক্তিগত সদস্যরা "উদাহরণ বেসরকারী" থাকতেন এবং "প্রাইভেট প্রাইভেট" না থাকতেন তবে সংকলকটি অন্য উপায়ে প্রয়োগ করা হত, যেমন কেবল অনুমতি দেওয়া this.bar = 2কিন্তু না other.bar = 2, কারণ otherএটি অন্যরকম উদাহরণ হতে পারে।
ড্যানিয়েল হিলগারথ

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

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

2
@ ড্যানিয়েল পয়েন্ট নেওয়া হয়েছে। আমি এখনও মনে করি এটি একটি বৈধ বিবেচ্য বিষয়, যদিও আপনি অবশ্যই সঠিক যে শেষ পর্যন্ত ভাষা ডিজাইনাররা তারা কী চান তা নির্ধারণ করে এবং সংকলক লেখকরা এটি মেনে চলে।
dlev

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

61

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

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

যাইহোক, এনক্যাপসুলেশন সম্পর্কে এই সমস্ত তত্ত্বটি প্রপার্টি তৈরি করার সাথে সাথেই ব্যর্থ হয় (বা জাভাতে জুড়ি পেতে / সেট করুন) এবং সমস্ত ক্ষেত্র সরাসরি উন্মোচন করে, যা ক্লাসগুলি এমনভাবে তৈরি করে তোলে যেন তারা যেভাবেই ক্ষেত্রগুলিতে অ্যাক্সেস করছে।

* বিভিন্ন ধরণের এনক্যাপসুলেশনের বিষয়ে স্পষ্টতার জন্য হাবেলের দুর্দান্ত উত্তর দেখুন।


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

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

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

1
"কারণ এনক্যাপসুলেশনের উদ্দেশ্য হ'ল কোডের বিভিন্ন অংশের পারস্পরিক নির্ভরতা কম করা" >> না no এনক্যাপসুলেশন বলতে উদাহরণস্বরূপ-এনক্যাপসুলেশনকেও বোঝাতে পারে, এটি ভাষা বা স্কুল-চিন্তার উপর নির্ভর করে। ওওর অন্যতম নির্দিষ্ট কণ্ঠস্বর বার্ট্র্যান্ড মায়ার এটিকে এমনকি ডিফল্ট হিসাবে বিবেচনা করে private। আপনি যদি পছন্দ করেন তবে জিনিসগুলিতে আমার দৃষ্টিভঙ্গির জন্য আমার উত্তর পরীক্ষা করতে পারেন;)।
আবেল

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

49

বেশ কয়েকটি উত্তর ইতিমধ্যে এই আকর্ষণীয় থ্রেডে যুক্ত করা হয়েছে, তবে কেন এই আচরণটি এরকম হওয়ার কারণটির সঠিক কারণ আমি খুব একটা খুঁজে পাইনি । আমাকে একবার চেষ্টা করে দেখুন:

দিনগুলোতে ফিরে যাও

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

বেসরকারী দৃশ্যমানতার ক্ষেত্রে

মায়ারের মতে একটি পদ্ধতি ক্লাসের একটি সংজ্ঞায়িত সেট (1922-23 পৃষ্ঠা) এ উপলব্ধ করা উচিত। এটি স্পষ্টতই তথ্য গোপনের খুব উচ্চতর গ্রানুলারিটি দেয়, নিম্নলিখিত বৈশিষ্ট্যটি ক্লাসএ এবং ক্লাসবি এবং তাদের সমস্ত বংশধরদের জন্য উপলব্ধ:

feature {classA, classB}
   methodName

privateতিনি নিম্নলিখিত ক্ষেত্রে বলেছেন: কোনও প্রকারটিকে তার নিজস্ব শ্রেণীর কাছে দৃশ্যমান হিসাবে স্পষ্টভাবে ঘোষণা না করে আপনি কোনও যোগ্য কলটিতে সেই বৈশিষ্ট্যটি (পদ্ধতি / ক্ষেত্র) অ্যাক্সেস করতে পারবেন না। অর্থাৎ যদি xপরিবর্তনশীল হয় তবে এটি x.doSomething()অনুমোদিত নয়। অযোগ্য অ্যাক্সেস অনুমোদিত, অবশ্যই শ্রেণীর মধ্যেই।

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

প্রোগ্রামিং ভাষায় ইনস্ট্যান্স-প্রাইভেট

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

ভাষা নকশা জন্য পছন্দ

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

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

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

কেন সি # কেবল শ্রেণীর এনক্যাপসুলেশনকে মঞ্জুরি দেয় এবং এনক্যাপসুলেশন নয় instance

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

তবে, সি # এর ভাষা নকশার জন্য C ++ এবং জাভাতে দৃly়ভাবে দেখেছেন। আইফেল এবং মডিউলা -3 ছবিতে ছিলাম, আইফেলের নিখোঁজ হওয়া বহু বৈশিষ্ট্য বিবেচনা করে (একাধিক উত্তরাধিকার) আমি বিশ্বাস করি যে যখন এটি ব্যক্তিগত অ্যাক্সেস মডিফায়ারে আসে তখন তারা জাভা এবং সি ++ হিসাবে একই পথটি বেছে নিয়েছিল।

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


1
এটি অনেক পটভূমির সাথে একটি সুন্দর উত্তর, খুব আকর্ষণীয়, একটি (তুলনামূলক) পুরানো প্রশ্নের জবাব দেওয়ার জন্য সময় দেওয়ার জন্য ধন্যবাদ
রিচকে

1
@ রিচ: আপনি স্বাগত, আমার ধারণাটি খুব দেরী করেই ধরা পড়েছিল, তবে কিছু গভীরতার সাথে সাড়া দেওয়ার মতো বিষয়টি উদ্বেগজনকভাবে খুঁজে পেয়েছে :)
অ্যাবেল

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

2
দুর্দান্ত উত্তর। ওপিকে এই প্রশ্নের উত্তরটি চিহ্নিত করার বিষয়টি বিবেচনা করা উচিত।
গ্যাভিন ওসোর্ন

18

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


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

@ অ্যাকুইনাস: এটি বেশ আলাদা different সমস্ত কিছু জনসমক্ষে করা ভয়াবহ প্রোগ্রামিং অনুশীলনের দিকে পরিচালিত করবে। নিজের মতো করে অন্যান্য দৃষ্টান্তের ব্যক্তিগত ক্ষেত্র দেখার জন্য কোনও প্রকারের অনুমতি দেওয়া খুব সরু একটি ঘটনা।
ইগবি লার্জম্যান

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

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

3
আমার প্রশ্নটি আসলে বিশ্বাসের নয়, প্রয়োজনের বেশি more বিশ্বাস সম্পূর্ণরূপে অপ্রাসঙ্গিক হয় যখন আপনি ব্যক্তিগতকে জঘন্য জিনিসের প্রতিচ্ছবি ব্যবহার করতে পারেন। আমি ভাবছি কেন, ধারণাগতভাবে, আপনি ব্যক্তিগতগুলি অ্যাক্সেস করতে পারেন। আমি ধরে নিয়েছিলাম যে সর্বোত্তম-অনুশীলনের পরিস্থিতিটির চেয়ে যুক্তিযুক্ত কারণ রয়েছে।
রিচকে

13

কারণটির কারণ হ'ল সাম্যতা চেক, তুলনা, ক্লোনিং, অপারেটর ওভারলোডিং ... উদাহরণস্বরূপ জটিল সংখ্যায় অপারেটর + প্রয়োগ করা খুব জটিল হবে।


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

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

আমি @ অ্যারোনচট এর সাথে একমত: প্রতিটি নতুন বৈশিষ্ট্য বাস্তবায়নের সাথে সংকলকটিতে পরিবর্তনের জন্য একটি ব্যয় রয়েছে। একটি সেট দৃশ্যের জন্য, ক্লোন পদ্ধতিটি বিবেচনা করুন। অবশ্যই, আপনি এটি একটি বেসরকারী নির্মাণকারীর সাথে উপলব্ধি করতে চাইতে পারেন, তবে সম্ভবত কিছু পরিস্থিতিতে এটি সম্ভব / পরামর্শ দেওয়া সম্ভব নয়।
Lorenzo Dematté

1
সি # টিম? আমি কেবল কোনও ভাষায় সম্ভব তাত্ত্বিক ভাষার পরিবর্তনের বিষয়ে বিতর্ক করছি। "যদি কোনও বাধ্যতামূলক সুবিধা না হয় ..." আমি মনে করি কোনও সুবিধা হতে পারে। যে কোনও সংকলক গ্যারান্টি সহ, কারওর পক্ষে গ্যারান্টি দেওয়া কার্যকর হতে পারে যে কোনও শ্রেণি কেবল তার নিজস্ব রাষ্ট্রকে পরিবর্তন করে।
অ্যাকুইনাস

@ অ্যাকুইনাস: বৈশিষ্ট্যগুলি কার্যকর করা হয় কারণ এগুলি অনেক বা বেশিরভাগ ব্যবহারকারীর জন্য দরকারী - কারণ এটি কিছু বিচ্ছিন্ন ক্ষেত্রে কার্যকর হতে পারে।
অ্যারোনআট

9

প্রথমত, বেসরকারী স্থিতিশীল সদস্যদের কী হবে? এগুলি কি কেবল স্থির পদ্ধতি দ্বারা অ্যাক্সেস করা যায়? আপনি অবশ্যই এটি চাইবেন না, কারণ তখন আপনি নিজের অ্যাক্সেস করতে সক্ষম হবেন নাconst

আপনার স্পষ্ট প্রশ্ন হিসাবে, এ এর ​​ক্ষেত্রে বিবেচনা করুন StringBuilder , যা নিজের উদাহরণগুলির একটি লিঙ্কযুক্ত তালিকা হিসাবে প্রয়োগ করা হয়:

public class StringBuilder
{
    private string chunk;
    private StringBuilder nextChunk;
}

আপনি যদি নিজের শ্রেণীর অন্যান্য দৃষ্টান্তের ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে না পারেন তবে আপনাকে প্রয়োগ করতে হবে ToString এই জাতীয় :

public override string ToString()
{
    return chunk + nextChunk.ToString();
}

এটি কাজ করবে, তবে এটি ও (n ^ 2) - খুব দক্ষ নয়। আসলে, এটি সম্ভবত StringBuilderপ্রথম স্থানে একটি ক্লাস থাকার পুরো উদ্দেশ্যকে পরাস্ত করে । আপনি যদি নিজের শ্রেণীর অন্যান্য দৃষ্টান্তের ব্যক্তিগত সদস্যদের অ্যাক্সেস করতে পারেন তবে আপনি ToStringযথাযথ দৈর্ঘ্যের একটি স্ট্রিং তৈরি করে এবং তারপরে স্ট্রিংয়ের প্রতিটি অংশের একটি অনিরাপদ অনুলিপি যথাযথ স্থানে করে প্রয়োগ করতে পারেন :

public override string ToString()
{
    string ret = string.FastAllocateString(Length);
    StringBuilder next = this;

    unsafe
    {
        fixed (char *dest = ret)
            while (next != null)
            {
                fixed (char *src = next.chunk)
                    string.wstrcpy(dest, src, next.chunk.Length);
                next = next.nextChunk;
            }
    }
    return ret;
}

এই বাস্তবায়নটি হ'ল (এন), যা এটি খুব দ্রুত করে তোলে এবং আপনার ক্লাসের অন্যান্য দৃষ্টান্তের ব্যক্তিগত সদস্যদের অ্যাক্সেস থাকলেই তা সম্ভব


হ্যাঁ তবে এর আশেপাশে অন্য কোনও উপায় নেই যেমন কিছু ক্ষেত্রকে অভ্যন্তরীণ হিসাবে প্রকাশ করা?
মাইককুলস 10:25

2
@ মাইক: ক্ষেত্রটিকে এক্সপোজ internalকরা কম ব্যক্তিগত হিসাবে! আপনি আপনার ক্লাসের ইন্টার্নালগুলি এর সমাবেশের সমস্ত কিছুর কাছে প্রকাশ করবেন।
গাবে

3

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

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

এখানেও একই রকম আলোচনা রয়েছে


1

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

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

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

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


0

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

বিটিডাব্লু .... এই একই সমস্যাটি "সুরক্ষিত" সদস্যদের জন্যও প্রযোজ্য। :(

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

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


-1

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

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

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