উদ্দেশ্যমূলক-সি ব্যক্তিগত পদ্ধতিগুলি সমর্থন করে না কেন?


123

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

কীওয়ার্ড একটি সংখ্যা প্রয়োগ করা আছে ivars(সদস্য) যে তাদের সুযোগ, যেমন নিয়ন্ত্রণ @private, @public, @protected। কেন পাশাপাশি পদ্ধতিগুলির জন্য এটি করা যায় না? মনে হচ্ছে রানটাইমকে সমর্থন করার মতো কিছু হওয়া উচিত। আমি অনুপস্থিত কোন অন্তর্নিহিত দর্শন আছে? এটা কি ইচ্ছাকৃত?


15
ভাল প্রশ্ন, বিটিডব্লিউ।
বুবুম

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

1
আপনি "রানটাইম এড়িয়ে যেতে" পারবেন না - রানটাইম হ'ল বার্তা প্রেরণ করে।
চাক

"একটি ব্যক্তিগত পদ্ধতিতে এই চেকটি শর্ট সার্কিট করার কোনও উপায় থাকবে না " আপনি কি "পরিবেষ্টন" বোঝাতে চেয়েছিলেন? ;-)
কনস্টান্টিনো জারোহাস 20

উত্তর:


103

উত্তরটি ... ভাল ... সাধারণ। সরলতা এবং ধারাবাহিকতা, আসলে।

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

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

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

সম্পাদনা: একটি অনুমান আমি লক্ষ্য করেছি যে ব্যক্তিগত বার্তাগুলি রানটাইমের মধ্য দিয়ে যেতে হবে যার ফলে সম্ভাব্য বড় ওভারহেড হবে। এটা কি একেবারেই সত্য?

হ্যাঁ, তাই অনুমান করার কোনও কারণ নেই যে কোনও শ্রেণির প্রয়োগকারী বাস্তবায়নের ক্ষেত্রে নির্ধারিত অবজেক্টিভ-সি বৈশিষ্ট্যটি সমস্ত ব্যবহার করতে চান না, এবং এর অর্থ গতিশীল প্রেরণা অবশ্যই ঘটবে। তবে , কোনও বিশেষ বৈকল্পিক দ্বারা ব্যক্তিগত পদ্ধতিগুলি প্রেরণ করতে না পারার কোনও কারণ নেই objc_msgSend(), কারণ সংকলকটি জানতে পারে যে তারা ব্যক্তিগত ছিল; অর্থাত্ Classস্ট্রাক্টারে ব্যক্তিগত-একমাত্র পদ্ধতি সারণী যুক্ত করে এটি অর্জন করা যেতে পারে ।

কোনও ব্যক্তিগত পদ্ধতিতে এই চেক শর্ট সার্কিট করার বা রানটাইম এড়িয়ে যাওয়ার কোনও উপায় থাকবে না?

এটি রানটাইম এড়িয়ে যেতে পারেনি, তবে রানটাইমটি অগত্যা ব্যক্তিগত পদ্ধতিগুলির জন্য কোনও চেকিং করতে হবে না

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

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

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


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

11
আরও অজগর হ'ল "আপত্তি-সি-আইসি" :)। পাইডোবিজিসির 1 ম সংস্করণ তৈরি সহ NeXT সিস্টেমে পাইথন বজায় রাখতে গিডো বেশ সক্রিয় ছিলেন। সুতরাং, ওজেসি কিছুটা অজগরকে প্রভাবিত করেছিল ।
বম্ব

3
জীবনের জন্য দানশীল স্বৈরশাসকের আকর্ষণীয় historicতিহাসিক কাহিনী এবং পৌরাণিক NeXT সিস্টেমের সাথে তাঁর ক্রসিংয়ের জন্য +1।
পোকস্টাড

5
ধন্যবাদ. পাইথন, জাভা এবং অবজেক্টিভ-সি সবগুলিতে রানটাইম অবজেক্ট মডেল রয়েছে যা [স্মলটালকের মতো] বেশ সুন্দর similar জাভা বেশ সরাসরি অবজেক্টিভ-সি থেকে প্রাপ্ত হয়েছিল। পাইথন অনুপ্রেরণার চেয়েও বেশি এক সমান্তরাল কোর্স চালিয়েছিল, তবে গিডো অবশ্যই NeXTSTEP নিবিড়ভাবে অধ্যয়ন করেছে।
বম্ব

1
আমি এর লাইসেন্সকে বিশ্বাস করি না এবং আমি অবশ্যই জিসিসিতে ঝাঁকুনি পছন্দ করব। তবে এটি অবশ্যই একটি ভাল প্রথম পদক্ষেপ।
চতুটু

18

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

এছাড়াও, রানটাইমটি যাচাই করা দরকার যে কোনও ব্যক্তিগত বার্তা প্রেরক প্রাপক একই শ্রেণীর। আপনি ব্যক্তিগত পদ্ধতিগুলিও বাইপাস করতে পারেন; যদি শ্রেণিটি ব্যবহৃত হয় instanceMethodForSelector:, এটি IMPব্যক্তিগতভাবে সরাসরি ব্যক্তিগত পদ্ধতি শুরু করার জন্য এটি অন্য কোনও শ্রেণীর কাছে ফেরত দিতে পারে ।

ব্যক্তিগত পদ্ধতিগুলি বার্তা প্রেরণাকে বাইপাস করতে পারেনি। নিম্নলিখিত পরিস্থিতিতে বিবেচনা করুন:

  1. একটি শ্রেণী AllPublic একটি সার্বজনীন উদাহরণ পদ্ধতি রয়েছেdoSomething

  2. আর এক ক্লাস HasPrivate একটি ব্যক্তিগত উদাহরণ পদ্ধতিও রয়েছেdoSomething

  3. আপনি উভয়ের উদাহরণ সংখ্যার সমন্বিত একটি অ্যারে তৈরি করুন AllPublic এবং এরHasPrivate

  4. আপনার নিম্নলিখিত লুপ রয়েছে:

    for (id anObject in myArray)
        [anObject doSomething];

    আপনি মধ্যে থেকে যে লুপ দৌড়ে AllPublic, রানটাইম আপনি পাঠানো বন্ধ করতে হবে doSomethingউপর HasPrivateদৃষ্টান্ত, যাইহোক, এই লুপ যদি এটা ভিতরে ছিল ব্যবহারযোগ্য হবে HasPrivateবর্গ।


1
আমি একমত যে এতে একটি ব্যয় জড়িত হবে। হ্যান্ডহেল্ড ডিভাইসে সম্ভবত এটি আপনি চান এমন কিছু নয়। আপনি কি অন্যথায় দুর্দান্ত যোগ্যতা সমর্থন করতে পারেন? ডেস্কটপ সিস্টেমে কি ব্যয়টি সত্যিই আসবে?
রব জোন্স

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

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

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

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

13

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

@interface MyObject : NSObject {}
- (void) doSomething;
@end

আপনার যদি "ব্যক্তিগত" পদ্ধতির প্রয়োজন হয় তবে আপনি এটি বাস্তবায়ন ফাইলেও রাখতে পারেন:

@interface MyObject (Private)
- (void) doSomeHelperThing;
@end

@implementation MyObject

- (void) doSomething
{
    // Do some stuff
    [self doSomeHelperThing];
    // Do some other stuff;
}

- (void) doSomeHelperThing
{
    // Do some helper stuff
}

@end

নিশ্চিত, এটা না বেশ সি ++ / জাভা ব্যক্তিগত পদ্ধতি হিসাবে একই, কিন্তু এটা ঘনিষ্ঠ যথেষ্ট কার্যকরভাবে, তাই কেন একটি বৈশিষ্ট্য যা ইতিমধ্যে একটি গ্রহণযোগ্য মধ্যে emulated এর যোগ করার জন্য, ইত্যাদি ভাষার শব্দার্থবিদ্যা, সেইসাথে কম্পাইলার, রানটাইম, পরিবর্তন উপায়? অন্যান্য উত্তরে যেমন উল্লিখিত হয়েছে, বার্তা-উত্তরণকারী শব্দার্থবিজ্ঞান - এবং রানটাইম প্রতিবিম্বের উপর তাদের নির্ভরতা - "ব্যক্তিগত" বার্তাগুলি সামান্য হ'ল অপ্রয়োজনীয় পরিচালনা করবে।


1
এই পদ্ধতির সমস্যাটি হ'ল কেউ যখন আপনার ক্লাসটি সাবক্লাস করে তখন ব্যক্তিগত পদ্ধতি (এমনকি অজান্তেই) ওভাররাইড করতে পারে। আমি মনে করি, মূলত আপনাকে এমন নাম নির্বাচন করতে হবে যেগুলি ওভাররাইড হওয়ার সম্ভাবনা কম।
স্বপ্নগ্রাহ

3
যা আমার কাছে হ্যাকের শীর্ষে হ্যাকের মতো অনুভব করে।
রব জোন্স

1
@ মাইক: অ্যাপল বলেছে যে শীর্ষস্থানীয় আন্ডারস্কোর সহ পদ্ধতির নামগুলি কেবল স্পষ্টভাবে কেবল অ্যাপলের জন্য সংরক্ষিত: বিকাশকারী.অ্যাপল . com/ ম্যাক / লাইবারি / ডকোমেন্টেশন / কোকো / কনসেপ্টুয়াল / / । প্রস্তাবিত বিকল্পটি হ'ল দুটি মূল অক্ষর এবং তারপরে একটি আন্ডারস্কোর সহ উপসর্গ ।
স্বপ্নালঙ্কা

8
এছাড়াও, পদ্ধতির পরে আপনার এসএসএন নিক্ষেপ করুন যাতে অন্যান্য প্রোগ্রামাররা জানেন যে এটি কে লিখেছিল। = ডি নেমস্পেসস, তাদের প্রয়োজন !!!
পোকস্টাড

2
আপনি যদি ওভাররাইড হওয়া সংজ্ঞায়িত পদ্ধতিগুলির বিষয়ে উদ্বিগ্ন হন তবে আপনি উদ্দেশ্যমূলক-সি উত্সাহিত করে যে
শব্দভাণ্ডারের

7

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

মোটেও কোনও গোলমাল নেই।


এগুলি কি বাস্তবায়ন বিভাগের বাইরে সংজ্ঞায়িত করতে হবে?
রব জোন্স

@ রব - আপনার ক্লাস বাস্তবায়নের অভ্যন্তরে তারা (এবং সম্ভবত সম্ভবত হওয়া উচিত) সংজ্ঞায়িত করতে পারবেন না।
ক্রোমুলেন্ট

6

হ্যাঁ, সি ++: নাম-ম্যাংলিং পরিচালনা করার জন্য সংকলক দ্বারা ইতিমধ্যে নিযুক্ত একটি প্রযুক্তি ব্যবহার করে রানটাইমকে প্রভাবিত না করে এটি করা যেতে পারে।

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

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


2
কম্পাইল সময় নাম mangling অনেক বেশি কঠিন হিসাবে আপনি ঐ যে XIB ফাইল উপস্থিত হতে পারে এবং সেই NSSelectorFromString () এবং সেইসাথে KeyValueCoding & বন্ধুদের ভালো জিনিস প্রেরণ করা যেতে পারে ... সহ সব পদ্ধতি নির্বাচকরা, কাপড় ইস্ত্রী করা আছে একাধিক অনুমান পারে
বুবুম

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

1
একটি সংকলন-কেবল-সময় প্রয়োগকারী + নাম-ম্যাংলিং কীভাবে কাউকে ক্লাসের পদ্ধতি তালিকায় হাঁটতে এবং সেখানে এটি খুঁজে পাওয়া বন্ধ করবে?
ড্রিমল্যাক্স

এটা হবে না। আমার উত্তরটি কেবল ওপি দ্বারা উত্থাপিত প্রশ্নকে সম্বোধন করে।
Huperniketes

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

4

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

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


1

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

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


এবং যদি আপনার লিবের গ্রাহকরা আপনার ব্যক্তিগত পদ্ধতিগুলি প্রতিফলিত করতে পারে তবে তারা কী তাদের কল করতে পারে না?
জ্যারেড আপডেটিকে

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

যদি তারা প্রতিবিম্বের মাধ্যমে ব্যক্তিগত পদ্ধতিগুলিতে অ্যাক্সেস করে তবে তারা তাদের প্রাপ্য তা পায়। কোনও ত্রুটি আপনার দোষ নয়।
gnasher729

1

প্রশ্নের ব্যাখ্যার উপর নির্ভর করে দুটি উত্তর রয়েছে।

প্রথমটি হ'ল ইন্টারফেস থেকে পদ্ধতি প্রয়োগটি আড়াল করে। এটি সাধারণত কোনও নামবিহীন একটি বিভাগ সহ ব্যবহৃত হয় (যেমন, উদাহরণস্বরূপ)@interface Foo() )এটি বস্তুকে এই বার্তাগুলি প্রেরণের অনুমতি দেয় তবে অন্যকে নয় - যদিও কেউ এখনও দুর্ঘটনাক্রমে (বা অন্যথায়) ওভাররাইড করতে পারে।

এই উত্তরটি পারফরম্যান্স এবং ইনলাইনিংয়ের বিষয়ে, এই ধারণাটি অনুসারে দ্বিতীয় উত্তরটি সম্ভব হয়েছে তবে পরিবর্তে স্থানীয় সি ফাংশন হিসাবে এটি করা সম্ভব। আপনি যদি একটি 'প্রাইভেট foo ( NSString *arg)' পদ্ধতি চান, আপনি এটি করতে void MyClass_foo(MyClass *self, NSString *arg)এবং এটি একটি সি ফাংশন হিসাবে কল করবেMyClass_foo(self,arg) । বাক্য গঠনটি ভিন্ন, তবে এটি সি ++ এর ব্যক্তিগত পদ্ধতিগুলির বুদ্ধিমান ধরণের পারফরম্যান্স বৈশিষ্ট্যগুলির সাথে কাজ করে।

যদিও এটি প্রশ্নের উত্তর দেয়, তবে আমার উল্লেখ করা উচিত যে নামকরণের বিভাগটি এটি করার আরও বেশি সাধারণ উদ্দেশ্য-সি উপায়।


0

উদ্দেশ্য-সি ব্যক্তিগত পদ্ধতিগুলি সমর্থন করে না কারণ এটিগুলির প্রয়োজন হয় না।

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

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

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


0

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

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


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