বার্তা এবং পদ্ধতির মধ্যে পার্থক্য?


13

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

তবে সূক্ষ্ম পার্থক্য ঠিক কী ? আমার কোড সম্পর্কে চিন্তা করার সময় আমি কীভাবে বার্তাগুলি চিন্তা করব?

দ্রষ্টব্য: এখানে কিছুটা পটভূমি, আমি সি # / জাভা বিকাশকারী উদ্দেশ্য সি সম্পর্কে কিছু ধারণা বোঝার চেষ্টা করছি


2
যেহেতু এগুলি সমস্ত ভিন্ন ভাষা, তাত্পর্যগুলি সূক্ষ্ম নয়। তারা বিভিন্ন ভাষা। "আমার কোড সম্পর্কে চিন্তা করা যখন"? কি কোড? জাভা বা সি # সম্পর্কে চিন্তা করার সময়, আপনি বার্তাগুলি সম্পর্কে ভাবেন না। আপনি পদ্ধতি সম্পর্কে চিন্তা। আপনি কী স্পষ্ট করতে পারেন যে সম্পর্কহীন ধারণার সাথে সম্পর্কিত সম্পর্কযুক্ত ভাষাগুলিতে কীভাবে "সূক্ষ্ম" পার্থক্য থাকতে পারে?
এস .লট

1
দয়া করে আপনাকে stackoverflow.com এ প্রশ্ন জিজ্ঞাসা করুন
আমির রেজায়ে

1
এই প্রশ্নটি কি সত্যই স্ট্যাকওভারফ্লোতে থাকা উচিত? এটি প্রোগ্রামিং ধারণা সম্পর্কে একটি প্রশ্ন যা আমার কাছে পাওয়া কিছু কোড সম্পর্কে সমস্যা নয় problem হতে পারে আমি ভুল, আমি ডুনো
গণ্ডিগুলি

1
@ বিদার, প্রশ্নটি বিষয়গত নয়। আপনি একটি পাঠ্যপুস্তকের সংজ্ঞা খুঁজছেন। প্রোগ্রামাররা মতামত, অভিজ্ঞতা এবং বিষয়গত প্রশ্নের জন্য আরও বেশি।
স্টিফেন ফুরলানি

1
ঠিক আছে - এই প্রশ্নটিকে স্ট্যাকওভারফ্লোতে স্থানান্তরিত করার জন্য কি মধ্যস্থতা পাওয়ার কোনও উপায় আছে?
ভিডার

উত্তর:


10

একটি বার্তা একটি নির্বাচকের নাম এবং সেই নির্বাচকটির পরামিতি।

একটি নির্বাচক একটি প্রতীক।

একটি পদ্ধতি নির্বাচক দ্বারা চিহ্নিত শ্রেণিতে কোডের একটি অংশ।

অন্য কথায়, [foo bar: baz]" @selector(bar:)প্যারামিটার সহ কল ​​করা বার্তাটি bazবস্তুটি প্রেরণ করুন says fooআপনি সেই বার্তাটি বিভিন্ন বিভিন্ন বস্তুর কাছে প্রেরণ করতে পারেন could

বিপরীতে, একটি পদ্ধতি bar: জন্য Fooচেহারা মত হতে পারে

-(int)bar:(int)n {
  return n + 1;
}

তবে একটি FooTwoচেহারা মত হতে পারে

-(int)bar:(int)n {
  return n + 2;
}

(আমি আশা করি আমার সিনট্যাক্সটি ঠিক আছে; আমি অবজেক্টিভ-সি স্পর্শ করে কিছুক্ষণ হয়ে গেলাম।)

আপনি যখন বার্তাটি প্রেরণ করেন, অবজেক্টিভ-সি কার্নেল বার্তাটি প্রেরণ করে fooযা ম্যাসেজটি বোঝে কিনা তা স্থির করে। এটি নির্বাচক দ্বারা চিহ্নিত কোনও পদ্ধতি খুঁজে পেতে পারে কিনা তার ভিত্তিতে এটি সিদ্ধান্ত নেয়।

একই নাম সহ দুটি পদ্ধতি এবং একটি বার্তা।

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


সুতরাং ... একটি বার্তা যখন আপনি একটি ডিসিন্টারফেসে কল করেন (a.invoke নির্বাচক, আরগস) এবং আপনি যখন কোনও ইন্টারফেস (a.methodName) কল করেন তখন কোনও পদ্ধতি হয়? যা জাভা, জাভাস্ক্রিপ্ট তৈরি করবে না, সমস্ত গতিশীল ভাষাগুলিতে বার্তা রয়েছে কারণ সমস্ত কিছু ডুয়াল ইন্টারফেসের পরিবর্তে সরাসরি লাফানো এবং ভিটিবেল জাম্পে অফসেটের মাধ্যমে ঘটে)?
দিমিত্রি

4

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

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

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


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

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

1

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


0

সাধারণত পদ্ধতি কলগুলি সংকলনের সময়ে সমাধান করা হয় (আপনি যদি জাভাতে প্রতিবিম্ব ব্যবহার না করেন), তবে উদ্দেশ্য সিতে থাকা বার্তাগুলি রান সময়ে প্রেরণ করা হয়।


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

2
হ্যাঁ. তবে তবুও আপনি কেবল এমন কিছু পদ্ধতির বিরুদ্ধে কোড প্রয়োগ করতে পারেন (জাভাতে) যা সংকলন সময়ে সুপরিচিত। মাইওবজেক্ট.ফু () কল করলে ত্রুটি ঘটবে যদি মাইবজেক্ট বা মাইআইন্টারফেসের কোনও পদ্ধতি foo () সংজ্ঞায়িত না হয়। ওবজেসি আপনাকে মাইওবজেক্টটিকে আপত্তি জানাতে 'foo' বার্তা প্রেরণের অনুমতি দেবে - এবং মাইওবজেক্টের যদি 'foo' না থাকে তবে এটি রান টাইমে বোমা ফেলবে।
হাইকো রুপ

আমি ভাবলাম অবজেক্টিভ সি একটি সংকলিত ভাষা ছিল?
ভিদার

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

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

-1

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

উদাহরণস্বরূপ, লিনাক্স কার্নেলে, বার্তাগুলি সিস্টেম কল / ফাংশন দ্বারা সম্পন্ন হয়: আপনি ইউনিক্স সিস্টেম প্রোগ্রামিং সম্পর্কে সন্ধান করলে আপনি সেগুলি সম্পর্কে জানতে পারেন।

একটি পদ্ধতি কল এবং একটি বার্তার মধ্যে মূল পার্থক্য হ'ল:

  • একটি পদ্ধতি কল কেবল আপনার কোডে ঘটে: এএসএম-এ এটি পাস হওয়া আর্গুমেন্টের পুশ দ্বারা অনুবাদ করা হয়।

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


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