অবজেক্টিভ-সি পদ্ধতির নামের শেষ অংশটি কেন একটি যুক্তি নিতে হবে (যখন একাধিক অংশ রয়েছে)?


90

অবজেক্টিভ-সি তে, আপনি শেষের উপাদানটি আর্গুমেন্ট গ্রহণ করবেন না এমন পদ্ধতির নামগুলি ঘোষণা করতে পারবেন না। উদাহরণস্বরূপ, নিম্নলিখিতটি অবৈধ।

-(void)take:(id)theMoney andRun;
-(void)take:(id)yourMedicine andDontComplain;

অবজেক্টিভ-সি কেন এইভাবে ডিজাইন করা হয়েছিল? এটি কি কেবল স্মলটকের একটি শিল্পকর্ম যা কাউকে পরিত্রাণ পাওয়ার প্রয়োজন দেখেনি?

এই সীমাবদ্ধতা স্মল্টাল্কে বোঝা যায়, যেহেতু স্মলটকের কাছে বার্তা আহ্বানের আশেপাশে সীমানা প্রদানকারী নেই, তাই চূড়ান্ত উপাদানটি শেষ যুক্তির এক অবিচ্ছিন্ন বার্তা হিসাবে ব্যাখ্যা করা হবে। উদাহরণস্বরূপ, BillyAndBobby take:'$100' andRunহিসাবে পার্স করা হবে BillyAndBobby take:('$100' andRun)। উদ্দেশ্যমূলক-সিতে এটি বিবেচনা করে না যেখানে স্কয়ার বন্ধনী প্রয়োজন।

প্যারামিটারলেস সিলেক্টর উপাদানগুলিকে সমর্থন করা কোনও ভাষা পরিমাপ করা সমস্ত সাধারণ উপায়ে আমাদের খুব বেশি লাভ করতে পারে না, পদ্ধতিটির নাম হিসাবে প্রোগ্রামার বাছাই করে (যেমন এর runWith:পরিবর্তেtake:andRun) কোনও প্রোগ্রামের ক্রিয়ামূলক শব্দার্থক শব্দগুলিকে প্রভাবিত করে না, ভাষাটির প্রকাশকেও প্রভাবিত করে না। প্রকৃতপক্ষে, প্যারামিটারলেস উপাদান সহ একটি প্রোগ্রাম হ'ল আলফা সমতুল্য। আমি উত্তরগুলিতে এইভাবে আগ্রহী নই যে এই জাতীয় বৈশিষ্ট্যটি প্রয়োজনীয় নয় (যদি না এটি অবজেক্টিভ-সি ডিজাইনারদের উল্লিখিত কারণগুলি না থাকে; ব্র্যাড কক্স বা টম লাভকে কেউ কি জানতে পারে? তারা কি এখানে আছে?) বা এটি বলে যে পদ্ধতির নামগুলি কীভাবে লিখবেন যাতে বৈশিষ্ট্যের প্রয়োজন হয় না। প্রাথমিক সুবিধা হ'ল পাঠযোগ্যতা এবং লিখনযোগ্যতা (যা পঠনযোগ্যতার মতো, কেবল ... আপনি জানেন), কারণ এর অর্থ আপনি এমন পদ্ধতির নাম লিখতে পারতেন যা প্রাকৃতিক ভাষার বাক্যগুলির সাথে আরও সাদৃশ্যপূর্ণ। পছন্দগুলি -(BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication*)theApplication(যা ম্যাট গ্যালাগার "কোকো উইথ লাভ" এ দেখায়-(BOOL)application:(NSApplication*)theApplication shouldTerminateAfterLastWindowClosedসুতরাং, যথাযথ বিশেষ্যটির সাথে সাথেই প্যারামিটারটি স্থাপন করা।

অ্যাপলের অবজেক্টিভ-সি রানটাইম (উদাহরণস্বরূপ) এই ধরণের নির্বাচককে পরিচালনা করতে পুরোপুরি সক্ষম, তাই সংকলক কেন নয়? তাদের পাশাপাশি পদ্ধতির নামে সমর্থন করবেন না কেন?

#import <Foundation/Foundation.h>
#import <objc/runtime.h>

@interface Potrzebie : NSObject
-(void)take:(id)thing;
@end

@implementation Potrzebie
+(void)initialize {
    SEL take_andRun = NSSelectorFromString(@"take:andRun");
    IMP take_ = class_getMethodImplementation(self, @selector(take:));
    if (take_) {
        if (NO == class_addMethod(self, take_andRun, take_, "@@:@")) {
            NSLog(@"Couldn't add selector '%@' to class %s.", 
                  NSStringFromSelector(take_andRun), 
                  class_getName(self));
        }
    } else {
        NSLog(@"Couldn't find method 'take:'.");
    }
}

-(void)take:(id)thing {
    NSLog(@"-take: (actually %@) %@",NSStringFromSelector(_cmd), thing);
}
@end

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Potrzebie *axolotl=[[Potrzebie alloc] init];
    [axolotl take:@"paradichloroaminobenzaldehyde"];
    [axolotl performSelector:NSSelectorFromString(@"take:andRun") 
                  withObject:@"$100"];
    [axolotl release];

    [pool release];
    return 0;
}

4
কেন এটি সম্ভব নয় তার কারণ ব্যাখ্যা করতে পারছে না, তবে কেন এটি সম্ভব হবে? অ্যাপল পদ্ধতিগুলির নাম "টেকঅ্যান্ডআরুন:" এবং "টেকঅ্যান্ডডন্টকম্প্লেইন:";) করবে

বা takeAndRunWith:(id)theMoneyএবং takeAndDon'tComplainAbout:(id)yourMedicine। ব্যাকরণগতভাবে বিশ্রী, নিশ্চিত হওয়ার জন্য।
ম্যাথু ফ্রেডরিক

13
এটি জিজ্ঞাসা করার জন্য ধন্যবাদ - এটি একটি খুব আকর্ষণীয় প্রশ্ন। আমি চারপাশে জিজ্ঞাসা করব।
21

4
এটি মাঝে মধ্যে বাধ্যতামূলক ব্যাকরণগত বিশ্রী হয়ে ওঠে যা আমাকে বৈশিষ্ট্যটি চায়।
outis

4
দুর্দান্ত প্রশ্ন। ঠিক যেমন একপাশে, সংকলকটির নামের মতো পদ্ধতিগুলির সাথে কোনও সমস্যা নেই: - (void) :(id)theMoney;বা - (void) :(id)obj1 :(id)obj2;। সুতরাং নির্বাচকরা কলোন ব্যতীত আর কিছু না নিয়েই ভাল। ;-)
ওলে বেজম্যান

উত্তর:


111

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


ধন্যবাদ, ব্র্যাড আপনার উত্তর সম্পর্কে আমার ব্যাখ্যা একই ছিল; স্মলটাক থেকে যে প্রস্থান বিবেচনা করা হয়নি।
বুবুম

42

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

পদ্ধতির নামের সাথে আন্তঃবিবাহিত যুক্তির ধারণাটি সর্বদা বোঝায় যে, যদি কমপক্ষে একটি যুক্তি থাকে তবে সর্বশেষ যুক্তিটি সর্বদা পদ্ধতি অনুরোধ সিনট্যাক্সের শেষ অংশ।

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

অবজেক্ট-সিটি কেন এইভাবে ডিজাইন করা হয়েছিল, আমি উত্তরটি সন্দেহ করব যে ভাষার মূল ডিজাইনাররা কেবল ইন্টারলিভড সিনট্যাক্সটিকে শেষ যুক্তির বাইরে যাওয়ার অনুমতি দেওয়ার বিষয়টি বিবেচনা করেননি।

এটি একটি সেরা অনুমান। আমি তাদের একজনকে জিজ্ঞাসা করব এবং যখন আমি আরও জানতে পারি তখন আমার উত্তর আপডেট করব।


আমি ব্র্যাড কক্সকে এ সম্পর্কে জিজ্ঞাসা করেছি এবং তিনি বিস্তারিতভাবে প্রতিক্রিয়া জানাতে খুব উদার ছিলেন (ধন্যবাদ, ব্র্যাড !!):

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

ব্র্যাডের উত্তর পড়ুন!


সিনট্যাক্স বাগবাবুগুলি আমাকে ব্যাপক আগ্রহী।
outis

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

4
এটি প্রথম প্রথম আমার প্রতিনিধিটির জন্য একটি প্রোটোকল ডিজাইন করেছিল যা উদ্দেশ্য-সি দিয়ে শুরু করার পরে 21 বছরেরও কম ছিল। সাধারণ প্যাটার্নটি হ'ল প্রথম প্যারামিটার হিসাবে প্রতিনিধি বার্তা প্রেরণকারী অবজেক্টটি সরবরাহ করা। যেমন -myObjectWithDelegate: (id) foo wantsYouToDoSomethingWith: (id) bar। প্রোটোকলে যদি আপনার কোনও পদ্ধতি থাকে যার জন্য অন্য কোনও প্যারামিটারের প্রয়োজন না হয় তবে এটি পদ্ধতির নামগুলিতে ঝাঁকুনির মতো অসঙ্গতি সৃষ্টি করে। একটি উদাহরণের জন্য এনএসটিবেলভিউ ডেটাসোর্স দেখুন। একটি পদ্ধতি অন্য সকলের সুন্দর ঝরঝরে ধরণ অনুসরণ করে না।
জেরেমিপি

21

কেবল আপনার তথ্যের জন্য, রানটাইমটি আসলে নির্বাচকদের সম্পর্কে চিন্তা করে না, যে কোনও সি স্ট্রিং বৈধ, আপনি সেইরকম একটি নির্বাচকও তৈরি করতে পারেন: "== + === + ---__-- ¨¨¨¨ ^ ^ :::::: "কোনও যুক্তি ছাড়াই রানটাইম এটি গ্রহণ করবে না, সংকলক কেবল পারছে না অন্যথায় পার্স করা অসম্ভব। এটি নির্বাচকদের কথা বললে একেবারেই কোনও স্যানিটি পরীক্ষা করা যায় না।


7
+1 আমি ভেবেছিলাম আপনি এটির পরামর্শ দেওয়ার জন্য সম্পূর্ণ উন্মাদ, তবে আপনি ঠিক বলেছেন। আপনারা যারা বিশ্বাস করেন না তাদের জন্য: pastie.org/1388361
ডেভ দেলং

6

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

আপনি যদি মাল্টি-ওয়ার্ড প্যারামিটারলেস সিলেক্টর চান, তবে কেন একক অতিরিক্ত শব্দ দিয়ে থামবেন? কেউ তখন জিজ্ঞাসা করতে পারে

 [axolotl perform selector: Y with object: Y]

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


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

এছাড়াও, স্বেচ্ছাচারিত প্যারামিটারলেস উপাদানগুলিকে অনুমতি দেওয়া কীওয়ার্ডের সংঘর্ষের সম্ভাবনা বাড়িয়ে তোলে এবং নাম রেজোলিউশনকে জটিল করে তোলে, বিশেষত যখন সি ++ এবং ওবিজিসি মিশ্রিত করা হয় ( andএবং এটি orকোনও বিশেষ হোঁচট খায় )। এটি যদি কেবল কোনও নামের নামের চূড়ান্ত উপাদানটির কোনও প্যারামিটার না রাখার অনুমতি দেয় তবে এটি অনেক কম ঘটবে, কারণ এতে একাধিক শব্দ থাকবে।
outis
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.