ওওতে কী বার্তা যাচ্ছে?


35

আমি ও ও প্রোগ্রামিং অধ্যয়ন করছি, প্রাথমিকভাবে সি ++, সি # এবং জাভাতে। আমি ভেবেছিলাম এঙ্ক্যাপসুলেশন, উত্তরাধিকার এবং পলিমারফিজম (সেইসাথে এই সাইটে প্রচুর প্রশ্ন পড়ার পাশাপাশি) বোঝার সাথে আমার এটি সম্পর্কে ভাল উপলব্ধি রয়েছে।

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

আমার প্রশ্নগুলি হ'ল:

  • মেসেজ কী পাস হচ্ছে? (কেউ কি ব্যবহারিক উদাহরণ দিতে পারেন?)
  • সি ++, সি # বা জাভাতে এই "বার্তাটি পাস করার" জন্য কোনও সমর্থন আছে কি?

4
: আমি একটি সময় আগে তাই এই প্রশ্নের উত্তর stackoverflow.com/a/3104741/10259
ফ্রাঙ্ক Shearar


4
আমার বিনীত মতে, উদ্দেশ্য-সি মূলধারার ভাষা হিসাবে যোগ্য হবে। কমপক্ষে যতটা সি # তে হবে।
mouviciel

আমি এর সাথে একমত, আমি আমার অভিজ্ঞতা থেকে "মূলধারার" ভাষাগুলি উল্লেখ করছি
টম

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

উত্তর:


60

মেসেজ কী পাস হচ্ছে? (কেউ কি ব্যবহারিক উদাহরণ দিতে পারেন?)

বার্তাটি পাস করার অর্থ হ'ল (খুব বিমূর্ত স্তরে) প্রোগ্রাম কার্যকর করার মৌলিক প্রক্রিয়াটি একে অপরকে বার্তা প্রেরণকারী বস্তু। গুরুত্বপূর্ণ বিষয়টি হ'ল এই বার্তাগুলির নাম এবং কাঠামো উত্স কোডে আগেই ঠিক করা হয়নি এবং নিজেই অতিরিক্ত তথ্য হতে পারে। এটি অ্যালান কে মূলত "অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং" হিসাবে কল্পনা করেছিলেন এর একটি গুরুত্বপূর্ণ অংশ।

সি ++, সি # বা জাভাতে এই "বার্তাটি পাস করার" জন্য কোনও সমর্থন আছে কি?

এই ভাষা পদ্ধতি কলগুলির মধ্য দিয়ে মেসেজের সীমিত সংস্করণ প্রয়োগ করে। সীমাবদ্ধ কারণ পাঠানো যেতে পারে এমন বার্তাগুলির সেটটি কোনও শ্রেণিতে ঘোষিত পদ্ধতিগুলির মধ্যে সীমাবদ্ধ। এই পদ্ধতির সুবিধাটি হ'ল এটি খুব দক্ষতার সাথে প্রয়োগ করা যেতে পারে এবং এটি খুব বিশদ স্ট্যাটিক কোড বিশ্লেষণ সক্ষম করে (যার ফলে কোড সমাপ্তির মতো সমস্ত ধরণের কার্যকর সুবিধা পাওয়া যায়)।

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

গ্রোভির একটি উদাহরণ যা এই ধারণার শক্তি প্রদর্শন করে:

def xml = new MarkupBuilder(writer)
xml.records() {
  car(name:'HSV Maloo', make:'Holden', year:2006) {
    country('Australia')
    record(type:'speed', 'Production Pickup Truck with speed of 271kph')
  }
}

এই এক্সএমএল উত্পাদন করবে:

<records>
  <car name='HSV Maloo' make='Holden' year='2006'>
    <country>Australia</country>
    <record type='speed'>Production Pickup Truck with speed of 271kph</record>
  </car>
</records>

মনে রাখবেন যে, records, car, countryএবং recordচিহ্নগুলি সিন্টেক্সের পদ্ধতি কল আছে, কিন্তু সেখানে যে নাম সংজ্ঞায়িত কোন পদ্ধতি MarkupBuilder। পরিবর্তে, এটিতে একটি ক্যাচল বার্তা হ্যান্ডলার রয়েছে যা সমস্ত বার্তা গ্রহণ করে এবং মেসেজের নামগুলিকে এক্সএমএল উপাদানটির নাম হিসাবে ব্যাখ্যা করে, বৈশিষ্ট্য হিসাবে প্যারামিটার এবং শিশু উপাদান হিসাবে বন্ধ করে দেয়।


+1 সরাসরি উত্তর পয়েন্ট। কোড উদাহরণ হিসাবে গৃহীত। আপনার সহায়তার জন্য ধন্যবাদ :)
টম

সুতরাং এটি সহজ sendMessage(property_name, Array of arguments)এবং getMessage(property_name, Array of arguments)অচল ভাষায় কেবল কার্যকর করা যায় না ?
পেসারিয়ার

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

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

@ অ্যাডামজার্নার: আপনি ঠিক বলেছেন, আমি এটি ঠিক করেছি।
মাইকেল বর্গওয়ার্ট

28

মেসেজ পাসিং হ'ল একটি অবজেক্টের অন্য কিছু (বা সম্ভাব্য নিজেই) কিছু পাওয়ার জন্য ওও কোডের প্রয়োজনীয়তা হ্যান্ডল করার একটি ভিন্ন উপায়।

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

public void doSomething ( String input )
...
other_object.dosomething ( local )

স্ট্যাটিকালি টাইপ করা ভাষার জন্য কম্পাইলার তারপরে যাকে বলা হচ্ছে তার প্রকারটি পরীক্ষা করে পরীক্ষা পদ্ধতিটি ঘোষিত হয়েছে তা নিশ্চিত করতে পারে। গতিসম্পন্ন টাইপ করা ভাষার জন্য এটি রানটাইম সময়ে চালিত হয়।

তবে সংক্ষেপে যা হয় তা হ'ল ভেরিয়েবলগুলির একটি বান্ডিল কোডের একটি নির্দিষ্ট ব্লকে প্রেরণ করা হয়।

বার্তা পাস হচ্ছে

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

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

ফলস্বরূপ সি ++ / জাভা থেকে সরানোর সময় একটির অদ্ভুততা পাওয়া যায় -> উদ্দেশ্য সি বুঝতে পারে যে আপনি যে কোনও কম্পাইল-টাইম টাইপের উপরে ঘোষণা করা হয়নি এমন কোনও জিনিসে "পদ্ধতি বলতে পারেন", এবং এমনকি এটির উপস্থিতি নেই didn't রান-টাইম টাইপ ... এবং যে কলটি ব্যতিক্রম ছুঁড়ে ফেলার ফলস্বরূপ ফল দেয় না তবে প্রকৃতপক্ষে ফলাফলটি পাস হয়ে যায়।

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

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

এই দিনগুলিতে গতিশীলভাবে টাইপ করা ভাষাগুলি কম সমস্যার সাথে ওও কেটে যাওয়া বার্তার অনেক সুবিধা দিতে পারে।


1
আমি এই উত্তরটি পছন্দ করি - পার্থক্য এবং তার প্রভাবগুলি ব্যাখ্যা করে।
হ্যাপিগ্যাট

@Gavin, তাই এটা ঠিক পিএইচপি এবং জাভাস্ক্রিপ্ট এর হিসাবে একই গতিশীল পদ্ধতি হ্যান্ডলার ?
পেসারিয়ার

11

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

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

একটি অদ্ভুত উদাহরণ ওয়েব। এইচটিটিপি হ'ল একটি বার্তা প্রেরণ সিস্টেম - আপনি একটি সার্ভার প্রক্রিয়াতে একটি কমান্ড ক্রিয়া এবং একটি 'ডেটা প্যাকেট' পাস করেন। (যেমন GET http: \ myserver \ url) আপনার ব্রাউজার, না ওয়েবসার্ভার আপনার পাঠানো ডেটা, বা আপনি কোথায় পাঠিয়েছেন সে সম্পর্কে কিছুই বিবেচনা করে না। সার্ভার এটিকে কোডে পাঠিয়ে দেবে যা ডেটার একটি অন্য 'প্যাকেট' প্যাকেজ করবে এবং তা আপনাকে আবার প্রেরণ করবে। এই সিস্টেমে কোনও উপাদানই অন্যের কাজ বা তারা কী করে সে সম্পর্কে কিছুই জানে না, তারা কেবল বার্তা যোগাযোগের জন্য ব্যবহৃত প্রোটোকল জানেন know


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