কেন ব্যক্তিগত ভেরিয়েবলগুলি সর্বজনীনভাবে অ্যাক্সেসযোগ্য হেডার ফাইলটিতে বর্ণিত হয়?


11

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

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

অবজেক্টিভ-সি তে এসগুলি @interfaceএকই কাজ করুন, আপনাকে আপনার ব্যক্তিগত সদস্যদের তালিকা তৈরি করতে বাধ্য করুন (অন্তত, প্রয়োগকারী ফাইলটিতে ব্যক্তিগত পদ্ধতি পাওয়ার উপায় আছে) way

আমি যা বলতে পারি তা থেকে, জাভা এবং সি # আপনাকে একটি ইন্টারফেস / প্রোটোকল সরবরাহ করার অনুমতি দেয় যা সমস্ত প্রকাশ্যে অ্যাক্সেসযোগ্য বৈশিষ্ট্য / পদ্ধতিগুলি ঘোষণা করতে পারে এবং কোডারকে বাস্তবায়ন ফাইলে সমস্ত বাস্তবায়ন বিবরণ গোপন করার ক্ষমতা দেয় ।

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

ধন্যবাদ,


4
আমি তোমার কষ্টটা অনুভব করতে পারছি. আমি C ++ থেকে প্রথমবার চিৎকার করে পালিয়ে এসেছি যখন আমি কোনও ক্লাসে একটি ব্যক্তিগত ক্ষেত্র যুক্ত করেছি এবং এটি ব্যবহৃত সমস্ত কিছু পুনরায় সংকলন করতে হয়েছিল।
ল্যারি কোলেম্যান

@ ল্যারি, আমি এটিকে অত্যধিকভাবে আপত্তি করি না তবে এটি একটি দুর্দান্ত ওও ভাষা হিসাবে বর্ণিত বলে মনে হয়, তবে এটি "সঠিকভাবে" encapsulateও করতে পারে না।
স্টিফেন ফুরলানি

2
হাইপ বিশ্বাস করবেন না। স্থির এবং গতিশীল টাইপিং ক্যাম্পগুলিতে ওও করার আরও ভাল উপায় রয়েছে।
ল্যারি কোলেম্যান

এটি কিছু উপায়ে দুর্দান্ত ভাষা, তবে এটির ওও দক্ষতার কারণে নয়, যা সি
ডেভিড থর্নলি

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

উত্তর:


6

প্রশ্নটি এই যে সংকলকটি জানতে হবে যে কোনও বস্তু কত বড়। যদি তাই হয়, তবে সংকলকটি ব্যক্তিগত সদস্যদের তাদের গণনা করার জন্য জানতে হবে।

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

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

কখনও কখনও এটি শ্রেণীর কার্যকারিতাটিকে পাবলিক ইন্টারফেসে এবং ব্যক্তিগত সমস্ত কিছুর মধ্যে বিভক্ত করা বাঞ্ছনীয় এবং সেখানেই পিআইএমপিএল (আইএমপিএলমেন্টেশন পয়েন্টার) কৌশল আসে class ক্লাসটির একটি বেসরকারী বাস্তবায়ন শ্রেণীর নির্দেশক থাকে এবং পাবলিক ক্লাসের পদ্ধতিগুলি কল করতে পারে যে।


সংকলক এই তথ্যটি পেতে অবজেক্ট লাইব্রেরির দিকে তাকাতে পারে না? এই তথ্যটি কেন মানব-পঠনযোগ্যের পরিবর্তে মেশিন-পঠনযোগ্য হতে পারে না?
স্টিফেন ফুরলানি

@ স্টেফেন: সংকলনের সময়, কোনও অধ্যায় লাইব্রেরি অগত্যা নেই। যেহেতু বস্তুর আকার সংকলিত কোডকে প্রভাবিত করে, তাই এটি কেবল সংযোগের সময় নয়, সংকলন সময়ে জানতে হবে। আরও, আহের পক্ষে ক্লাস এ সংজ্ঞা দেওয়া, ভি ক্লাস বি সংজ্ঞায়িত করা এবং এ সি পিপ্পে ফাংশন সংজ্ঞা বি শ্রেণীর অবজেক্ট এবং তার বিপরীতে ব্যবহার করা সম্ভব। সেক্ষেত্রে অবজেক্ট কোড থেকে অবজেক্ট সাইজ নিলে একে একে অন্যের আগে A.cpp এবং B.cpp সংকলন করা প্রয়োজন।
ডেভিড থর্নলি

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

1
@ স্টিফেন: সংযোগের সময় লিঙ্কিং কেবল তখনই করা যেতে পারে যদি সমস্ত উপযুক্ত উপাদান থাকে। তারপরেও, এটি একটি জটিল প্রক্রিয়া হবে, আংশিক সংকলন (বস্তুর আকারগুলি ছাড়াও সমস্ত কিছু), আংশিক সংযোগ (বস্তুর আকার পেতে), তারপরে চূড়ান্ত সংকলন এবং লিঙ্ক যুক্ত। সি এবং সি ++ অপেক্ষাকৃত পুরানো ভাষাগুলি দেওয়া সত্ত্বেও এটি কেবল ঘটেনি। সম্ভবত কেউ কেউ শিরোনাম ফাইল ছাড়াই একটি নতুন ভাষা ডিজাইন করতে পারে, তবে এটি সি ++ হবে না।
ডেভিড থর্নলি

14

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

উদাহরণস্বরূপ আপনি যদি একটি শ্রেণি সংজ্ঞায়িত করেন

class Foo {
    public int a;
    private int b;
};

তারপর sizeof(Foo)হয় sizeof(a) + sizeof(b)। যদি ব্যক্তিগত ক্ষেত্রগুলি আলাদা করার জন্য কোনও ব্যবস্থা ছিল, তবে শিরোনামটি থাকতে পারে

class Foo {
    public int a;
};

সঙ্গে sizeof(Foo) = sizeof(a) + ???

আপনি যদি সত্যিই ব্যক্তিগত ডেটা আড়াল করতে চান তবে পিম্পল আইডিয়ামটি দিয়ে চেষ্টা করুন

class FooImpl;
class Foo {
    private FooImpl* impl;
}

শিরোনামে এবং FooImplকেবলমাত্র Fooপ্রয়োগকারী ফাইলের জন্য একটি সংজ্ঞা ।


উহু. আমি জানি না এই ঘটনাটি ছিল। জাভা, সি #, এবং ওবজে-সি-র মতো ভাষাগুলিতেই কি "ক্লাস অবজেক্টস" রয়েছে তাই তারা ক্লাসকে জিজ্ঞাসা করতে পারে যে বস্তুটি কত বড় হওয়া উচিত?
স্টিফেন ফুরলানি

4
একটি বেসরকারী বাস্তবায়নের জন্য একটি পিম্পল, একটি পয়েন্টার ব্যবহার করার চেষ্টা করুন। যেহেতু সমস্ত শ্রেণি নির্দেশক একই আকারে আপনাকে বাস্তবায়ন শ্রেণীর সংজ্ঞা দিতে হবে না, কেবল এটি ঘোষণা করুন।
স্কট ওয়েলস

আমি মনে করি এটি একটি মন্তব্যের পরিবর্তে একটি উত্তর হওয়া উচিত।
ল্যারি কোলেম্যান

1

এই সমস্ত নকশা পছন্দ নেমে আসে।

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

কারণ ব্যক্তিগত ভেরিয়েবল হেডার ফাইল / বর্গ ঘোষণা / @ ইন্টারফেসে উন্মুক্ত আপনার বর্গ একটি ভোক্তা এটি একটি নতুন দৃষ্টান্ত এবং একটি তৈরি করতে হবে পারে new MyClass()বা [[MyClass alloc]init]ক্লায়েন্ট কোডে কম্পাইলার দরকার কিভাবে বড় একটি MyClass বুঝতে অবজেক্টটি বরাদ্দ করতে হয়।

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

সি ++ এবং অবজেক্টিভ-সি তে অতিরিক্ত ইন্টারফেস / @ প্রোটোকল ফাইল লেখার এবং রক্ষণাবেক্ষণের তুলনায় শিরোনাম ফাইল হস্তান্তর করা কম কাজ। এটি এমন একটি কারণ যা আপনি প্রায়শই ব্যক্তিগত বাস্তবায়ন উন্মুক্ত দেখতে পান।

সি ++ এর আরেকটি কারণ হ'ল টেমপ্লেটগুলি - সরবরাহকারীর পরামিতিগুলির ক্ষেত্রে বিশেষত শ্রেণীর একটি সংস্করণ তৈরি করার জন্য সংকলকটির ক্লাসের বিশদ জানতে হবে। প্যারামিটারাইজেশন সহ শ্রেণীর সদস্যদের আকার পৃথক হবে, সুতরাং এর এই তথ্য থাকা দরকার।

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