কেন রেফারেন্স দ্বারা অবজেক্টগুলি পাস করা হয়?


31

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

আমি তার পক্ষে ভাল উত্তর পাই না।

এই নকশা সিদ্ধান্তের জন্য প্রেরণা কি? এই ভাষাগুলির বিকাশকারীরা প্রতিবার পয়েন্টার এবং টাইপিডফ তৈরি করতে ক্লান্ত হয়ে পড়েছিলেন?


2
আপনি কি জিজ্ঞাসা করছেন কেন জাভা এবং সি # আপনি মানের পরিবর্তে রেফারেন্স দ্বারা পয়েন্টার বা পয়েন্টারের পরিবর্তে রেফারেন্স দিয়ে পাস করেছেন?
রবার্ট

@ রবার্ট, উচ্চ স্তরে "পয়েন্টার পরিবর্তে রেফারেন্স" এর মধ্যে কোনও পার্থক্য রয়েছে? আপনি কি মনে করেন যে শিরোনামটি এমন কিছুর বদলে দেওয়া উচিত 'কেন বস্তু সর্বদা রেফারেন্স হয়? "?
গুস্তাভো কার্ডোসো

রেফারেন্স পয়েন্টার হয়।
কমমান

2
@ এন্টো: একটি জাভা রেফারেন্সটি সমস্ত উপায়ে সঠিকভাবে ব্যবহৃত সি পয়েন্টারটির অনুরূপ (সঠিকভাবে ব্যবহৃত: টাইপ-কাস্ট নয়, অবৈধ মেমরিতে সেট নয়, আক্ষরিক দ্বারা সেট নয়)।
ঝ্যান লিংস

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

উত্তর:


15

এর মূল কারণগুলি এ:

  • পয়েন্টারগুলি সঠিক হওয়ার জন্য প্রযুক্তিগত
  • নির্দিষ্ট ডেটা স্ট্রাকচার বাস্তবায়নের জন্য আপনার পয়েন্টার দরকার
  • মেমরির ব্যবহারে দক্ষ হতে আপনাকে পয়েন্টার দরকার
  • আপনি যদি সরাসরি হার্ডওয়্যার ব্যবহার না করে থাকেন তবে কাজ করার জন্য আপনার ম্যানুয়াল মেমরি সূচকের প্রয়োজন হবে না ।

সুতরাং, তথ্যসূত্র।


32

সহজ উত্তর:

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


আমি আপনাকে সম্মত করি, তবে আমি মনে করি এইগুলির পাশাপাশি কিছু নান্দনিক বা OO নকশার প্রেরণাও রয়েছে।
গুস্তাভো কার্ডোসো

9
@ গুস্তাভো কার্ডোসো: "কিছু নান্দনিক বা ওও ডিজাইনের প্রেরণা"। না। এটি কেবল একটি অপ্টিমাইজেশন।
এস .লট

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

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

14

সি ++ এ আপনার দুটি প্রধান বিকল্প রয়েছে: মান অনুসারে প্রত্যাবর্তন বা পয়েন্টার দিয়ে ফিরে আসা। প্রথমটি দেখুন:

MyClass getNewObject() {
    MyClass newObj;
    return newObj;
}

আপনার সংকলকটি রিটার্ন মান অপ্টিমাইজেশন ব্যবহার করার জন্য যথেষ্ট স্মার্ট নয় বলে ধরে নিচ্ছেন, এখানে যা ঘটে তা হ'ল:

  • newObj একটি অস্থায়ী বস্তু হিসাবে নির্মিত হয় এবং স্থানীয় স্ট্যাকের উপর স্থাপন করা হয়।
  • NewObj এর একটি অনুলিপি তৈরি এবং ফিরে দেওয়া হয়।

আমরা অর্থহীনভাবে বস্তুর একটি অনুলিপি তৈরি করেছি। এটি প্রক্রিয়াজাতকরণের সময় নষ্ট করা।

পরিবর্তে রিটার্ন বাই পয়েন্টারটি দেখুন:

MyClass* getNewObject() {
    MyClass newObj = new MyClass();
    return newObj;
}

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

MyClass someObj = getNewObject();
delete someObj;

এইভাবে বরাদ্দ হওয়া কোনও জিনিস মুছে ফেলার জন্য দায়ী কে জেনে এমন কিছু যা কেবল মন্তব্য বা কনভেনশন দ্বারা যোগাযোগ করা যেতে পারে। এটি সহজেই স্মৃতি ফাঁসির দিকে নিয়ে যায়।

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

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


রিটার্ন-বাই-ভ্যালু যথেষ্ট খারাপ, তবে বস্তুগুলির ক্ষেত্রে পাস-বাই-ভ্যালু আরও খারাপ হয় এবং আমি মনে করি যে এটাই আসল সমস্যা যা তারা এড়াতে চাইছিল।
ম্যাসন হুইলার

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

10

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

রেফারেন্স ব্যবহার স্মার্ট। জিনিসগুলি অনুলিপি করা বিপজ্জনক।

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

গভীর অনুলিপিগুলি তাদের নিজস্ব একটি সমস্যা - আপনি সত্যিই কত গভীর যান? আপনি স্থিতিশীল এমন কোনও কিছু অনুলিপি করতে পারবেন না (কোনও Classবস্তু সহ )

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


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


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

2
@ ইঙ্কা - আপনি আমাকে ভুল বুঝছেন। ইচ্ছাকৃতভাবে প্রয়োগ cloneকরা ঠিক আছে। "উইলি-নিলি" বলতে আমার অর্থ সমস্ত বৈশিষ্ট্য অনুলিপি করা - উদ্দেশ্যমূলক উদ্দেশ্য ছাড়াই ying জাভা ভাষার ডিজাইনারগণ ব্যবহারকারী দ্বারা নির্মিত তৈরি প্রয়োগকরণের প্রয়োজনের দ্বারা এই উদ্দেশ্যটি বাধ্য করেছিল clone
নিকোল

অপরিবর্তনীয় বস্তুর রেফারেন্স ব্যবহার করা স্মার্ট। তারিখকে পরিবর্তনযোগ্য হিসাবে সাধারণ মান তৈরি করা এবং তারপরে তাদের একাধিক উল্লেখ তৈরি করা ঠিক নয় isn't
কেভিন cline

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

গভীর অনুলিপি দিকটি একটি গুরুত্বপূর্ণ বিষয়। অনুলিপি করা অবজেক্টগুলি যখন অন্য বস্তুর রেফারেন্স ধারণ করে তখন বিশেষত যদি বস্তুর গ্রাফে পরিবর্তনীয় অবজেক্ট থাকে।
কালেব

4

বস্তুগুলি সর্বদা জাভাতে রেফারেন্স করা হয়। এগুলি কখনই নিজের কাছাকাছি যায় না।

একটি সুবিধা হ'ল এটি ভাষাটি সরল করে। একটি সি ++ অবজেক্টকে কোনও মান বা রেফারেন্স হিসাবে উপস্থাপন করা যেতে পারে, যাতে সদস্যকে অ্যাক্সেস করতে দুটি পৃথক অপারেটর ব্যবহার করার প্রয়োজন তৈরি হয়: .এবং ->। (সেখানে কেন এই একীকৃত করা যাবে না হয়; উদাহরণস্বরূপ, স্মার্ট পয়েন্টার মান যে রেফারেন্স হয়, এবং যারা স্বতন্ত্র রাখতে হবে।) জাভা শুধুমাত্র প্রয়োজন .

আরেকটি কারণ হ'ল বহুমূলকতাটি রেফারেন্স দিয়ে করতে হয়, মান দিয়ে নয়; মান দ্বারা চিকিত্সা একটি অবজেক্ট ঠিক সেখানে, এবং একটি নির্দিষ্ট টাইপ আছে। এটি সি ++ এ স্ক্রু করা সম্ভব।

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


আপনি যখন '(* অবজেক্ট) ->' ব্যবহার করেন তখন কখনও কখনও এটি সত্যই কুশ্রী হয়ে যায়
গুস্তাভো কার্ডোসো

1
এটি লক্ষণীয় যে সি ++ পয়েন্টার, উল্লেখ এবং মানগুলির মধ্যে পার্থক্য করে। সামার ক্লাস * কোনও বস্তুর পয়েন্টার। সামারক্লাস & একটি বস্তুর রেফারেন্স। সামার ক্লাস একটি মান ধরণ।
পিঁপড়া

আমি প্রাথমিক প্রশ্নে @ রবারকে ইতিমধ্যে জিজ্ঞাসা করেছি, তবে আমি এটি এখানেও করব: * এবং সি ++ এর মধ্যে পার্থক্যটি কেবল একটি নিম্ন স্তরের প্রযুক্তিগত জিনিস, তাই না? তারা কি উচ্চ স্তরের, শব্দার্থভাবে তারা একই রকম?
গুস্তাভো কার্ডোসো

3
@ গুস্তাভো কার্ডোসো: পার্থক্যটি সিনমেটিক; একটি নিম্ন প্রযুক্তিগত স্তরে তারা সাধারণত অভিন্ন। একটি পয়েন্টার একটি অবজেক্টের দিকে নির্দেশ করে, বা হ'ল নুল (সংজ্ঞায়িত খারাপ মান)। যতক্ষণ না const, এর মানটি অন্য অবজেক্টের দিকে নির্দেশ করতে পরিবর্তিত হতে পারে। একটি রেফারেন্স কোনও জিনিসের অপর নাম, নুল হতে পারে না এবং পুনরায় সেট করা যায় না। এটি সাধারণত পয়েন্টারগুলির সাধারণ ব্যবহার দ্বারা কার্যকর করা হয় তবে এটি বাস্তবায়নের বিশদ।
ডেভিড থর্নলি

"বহুবিজ্ঞানটি রেফারেন্সের মাধ্যমে করতে হবে for" এটি একটি অবিশ্বাস্যরূপে গুরুত্বপূর্ণ বিবরণ যা অন্য বেশিরভাগ উত্তর উপেক্ষা করেছে।
ডোভাল

4

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

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


3

দ্রুত উত্তর

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

অতিরিক্ত বর্ধিত বিরক্তিকর মন্তব্য

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

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

প্রোগ্রামার জানে কখন পয়েন্টার সিনট্যাক্সের প্রয়োজন হয় এবং কখন প্রয়োজন হয় না তবে জাভা এবং একই ভাষাতে এটি বিভ্রান্তিকর।

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

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


3

জাভা এবং সি # আপনার কাছ থেকে নিম্ন-স্তরের মেমরির নিয়ন্ত্রণ নেয়। আপনি যে বস্তুগুলি তৈরি করেন এটি "স্তূপ" তার নিজস্ব জীবনযাপন করে; উদাহরণস্বরূপ, আবর্জনা সংগ্রহকারী যখনই পছন্দসই জিনিসগুলি কাটাচ্ছেন।

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

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


2

আমি কয়েকটি কারণ সম্পর্কে চিন্তা করতে পারি:

  • আদিম ধরণের অনুলিপি করা তুচ্ছ, এটি সাধারণত একটি মেশিনের নির্দেশে অনুবাদ করে।

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

  • রেফারেন্স সহ অবজেক্টগুলি পাস করা সস্তা এবং আপনি যখন বস্তুর একাধিক ক্লায়েন্টের মধ্যে অবজেক্টের তথ্য ভাগ / আপডেট করতে চান তখন তা কার্যকরও হয়ে যায়।

  • জটিল তথ্য কাঠামো (বিশেষত যা পুনরাবৃত্ত হয়) পয়েন্টার প্রয়োজন require রেফারেন্স দ্বারা অবজেক্টগুলি পাস করা পয়েন্টারগুলি পাস করার কেবল একটি নিরাপদ উপায়।


1

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


এটি কি কেবল অগভীর অনুলিপি করতে পারে এবং প্রকৃত মান এবং পয়েন্টারগুলিকে অন্য বস্তুর কাছে রাখতে পারে?
গুস্তাভো কার্ডোসো

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

0

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

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

এখানে একটি তুচ্ছ সি ++ প্রোগ্রাম যা সমস্যাটি দেখায়:

#include <iostream> 
class Parent 
{ 
public: 
   int a;
   int b;
   int c;
   Parent(int ia, int ib, int ic) { 
      a = ia; b = ib; c = ic;
   };
   virtual void doSomething(void) { 
      std::cout << "Parent doSomething" << std::endl;
   }
};

class Child : public Parent {
public:
   int d;
   int e;
   Child(int id, int ie) : Parent(1,2,3) { 
      d = id; e = ie;
   };
   virtual void doSomething(void) {
      std::cout << "Child doSomething : D = " << d << std::endl;
   }
};

void foo(Parent a) {
   a.doSomething();
}

int main(void)
{
   Child c(4, 5);
   foo(c);
   return 0;
}

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


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

ওও পয়েন্টার ছাড়া সত্যই ঠিক কাজ করে না
গুস্তাভো কার্ডোসো

-1.000000000000
পি

5
জাভা হ'ল পাস-বাই-ভ্যালু (এটি মান অনুসারে অবজেক্ট রেফারেন্সগুলি পাস করে, তবে আদিমগুলি নির্ভুলভাবে মান দ্বারা পাস হয়) এটি মনে রাখা গুরুত্বপূর্ণ ।
নিকোল

3
@ পাভেল শেভড - "একজনের চেয়ে দু'জন ভাল!" অথবা, অন্য কথায় নিজেকে আরও ফাঁসানোর জন্য আরও দড়ি।
নিকোল

0

কারণ অন্যথায় পলিমারফিজম হবে না।

ওও প্রোগ্রামিংয়ে আপনি একটি Derivedথেকে একটি বৃহত্তর শ্রেণি তৈরি করতে পারেন Baseএবং তারপরে এটির প্রত্যাশায় ফাংশনগুলিতে পাস করতে পারেন Base। বেশ তুচ্ছ এহ?

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

এখন, এখানে একটি টুকরো তথ্য রয়েছে যা একটি কম্পিউটারে সংজ্ঞায়িত করা হয়: একটি মেমরি সেলটির ঠিকানা, সাধারণত এক বা দুটি "শব্দ" হিসাবে প্রকাশ করা হয়। এটি প্রোগ্রামিং ভাষায় পয়েন্টার বা রেফারেন্স হিসাবে দৃশ্যমান।

সুতরাং যথেচ্ছ দৈর্ঘ্যের বস্তুগুলি পাস করার জন্য, সবচেয়ে সহজ কাজটি হ'ল এই অবজেক্টের পয়েন্টার / রেফারেন্সটি পাস করা।

এটি ওও প্রোগ্রামিংয়ের প্রযুক্তিগত সীমাবদ্ধতা।

তবে যেহেতু বড় ধরণের জন্য, আপনি অনুলিপি এড়ানোর জন্য সাধারণত যেভাবেই রেফারেন্সগুলি পাস করা পছন্দ করেন, এটি সাধারণত একটি বড় ধাক্কা বলে মনে করা হয় না :)

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


-1

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


-2

ঠিক আছে তাই আমি এই কথাটি বলছি না কেন অবজেক্টগুলি রেফারেন্সের ধরণের বা রেফারেন্সের মাধ্যমে পাস করা হয় তবে আমি কেন একটি দীর্ঘকালীন সময়ে এটি একটি খুব ভাল ধারণা হয় তার একটি উদাহরণ দিতে পারি।

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

সুতরাং এর অর্থ হ'ল আপনার শিশু শ্রেণির ডেটার মোট আকার হ'ল পিতামাত্ত শ্রেণীর স্টাফ এবং উত্পন্ন শ্রেণীর সংমিশ্রণ।

ইজি: # অন্তর্ভুক্ত করুন

class Top 
{   
    int arrTop[20] = {1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1};
};  

class Middle : Top 
{   
    int arrMiddle[20] = {1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1};
};  

class Bottom : Middle
{   
    int arrBottom[20] = {1,2,3,4,5,6,7,8,9,9,8,7,6,5,4,3,2,1};
};  

int main()
{   
    using namespace std;

    int arr[20];
    cout << "Size of array of 20 ints: " << sizeof(arr) << endl;

    Top top;
    Middle middle;
    Bottom bottom;

    cout << "Size of Top Class: " << sizeof(top) << endl;
    cout << "Size of middle Class: " << sizeof(middle) << endl;
    cout << "Size of bottom Class: " << sizeof(bottom) << endl;

}   

যা আপনাকে দেখায়:

Size of array of 20 ints: 80
Size of Top Class: 80
Size of middle Class: 160
Size of bottom Class: 240

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

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

এই কারণেই রেফারেন্সগুলি ব্যবহার করা এটির জন্য আরও পছন্দনীয় পদ্ধতি হবে।


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