এই থ্রেডটি একধরনের পুরানো এবং আমি যা ভাগ করতে চাই তার বেশিরভাগই এখানে ইতিমধ্যে।
তবে, আমার প্রিয় পদ্ধতির উল্লেখ নেই, এবং আফাকের বর্তমান ঝাঁকুনিতে কোনও দেশীয় সমর্থন নেই, তাই আমি এখানে যাই…
প্রথম এবং সর্বাগ্রে (যেমন অন্যরা ইতিমধ্যে নির্দেশ করেছেন) অবজেক্ট ক্লাসগুলি উদ্দেশ্য-সি-তে খুব অস্বাভাবিক কিছু - আমরা সাধারণত এর পরিবর্তে রচনা (কখনও কখনও প্রতিনিধিদের মাধ্যমে) ব্যবহার করি। এই কারণেই সম্ভবত ভাষা / সংকলক - এর বাইরে এই জাতীয় বৈশিষ্ট্য ইতিমধ্যে বিদ্যমান নেই@dynamic
সংকলকটিতে বৈশিষ্ট্যগুলি আইআইআরসি কোরেডাটা প্রবর্তনের সাথে ওজজিসি 2.0 তে যুক্ত করা হয়েছে।
তবে প্রদত্ত (আপনার পরিস্থিতি যত্ন সহকারে মূল্যায়ন করার পরে!) আপনি এই সিদ্ধান্তে পৌঁছে গেছেন যে প্রতিনিধিদল (বা সাধারণভাবে রচনা) আপনার সমস্যা সমাধানের পক্ষে উপযুক্ত নয়, আমি এখানে কীভাবে এটি করছি:
- বেস ক্লাসে প্রতিটি বিমূর্ত পদ্ধতি প্রয়োগ করুন।
- যে বাস্তবায়ন করুন
[self doesNotRecognizeSelector:_cmd];
...
- … এরপরে
__builtin_unreachable();
সতর্কবার্তাটি নীরব করার জন্য আপনি অ-শূন্য পদ্ধতিগুলি পেয়ে যাবেন, আপনাকে বলছেন যে "রিটার্ন ছাড়াই অ-শূন্য ফাংশনটির নিয়ন্ত্রণ পৌঁছেছে" telling
- হয় ম্যাক্রোতে ২ এবং ৩ পদক্ষেপ একত্রিত করুন, বা প্রয়োগের ব্যতীত কোনও বিভাগে
-[NSObject doesNotRecognizeSelector:]
ব্যবহার করে এনোটেট করুন যাতে সেই পদ্ধতির আসল বাস্তবায়নটি প্রতিস্থাপন না করা হয় এবং আপনার প্রকল্পের পিসিএইচটিতে সেই বিভাগের শিরোনাম অন্তর্ভুক্ত করা উচিত।__attribute__((__noreturn__))
আমি ব্যক্তিগতভাবে ম্যাক্রো সংস্করণটিকে পছন্দ করি কারণ এটি আমাকে যতটা সম্ভব বয়লারপ্লেট হ্রাস করতে দেয়।
এটা এখানে:
// Definition:
#define D12_ABSTRACT_METHOD {\
[self doesNotRecognizeSelector:_cmd]; \
__builtin_unreachable(); \
}
// Usage (assuming we were Apple, implementing the abstract base class NSString):
@implementation NSString
#pragma mark - Abstract Primitives
- (unichar)characterAtIndex:(NSUInteger)index D12_ABSTRACT_METHOD
- (NSUInteger)length D12_ABSTRACT_METHOD
- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange D12_ABSTRACT_METHOD
#pragma mark - Concrete Methods
- (NSString *)substringWithRange:(NSRange)aRange
{
if (aRange.location + aRange.length >= [self length])
[NSException raise:NSInvalidArgumentException format:@"Range %@ exceeds the length of %@ (%lu)", NSStringFromRange(aRange), [super description], (unsigned long)[self length]];
unichar *buffer = (unichar *)malloc(aRange.length * sizeof(unichar));
[self getCharacters:buffer range:aRange];
return [[[NSString alloc] initWithCharactersNoCopy:buffer length:aRange.length freeWhenDone:YES] autorelease];
}
// and so forth…
@end
আপনি দেখতে পাচ্ছেন, ম্যাক্রো অ্যাবস্ট্রাক্ট পদ্ধতিগুলির সম্পূর্ণ বাস্তবায়ন সরবরাহ করে, প্রয়োজনীয় পরিমাণে বয়লারপ্লেটকে একটি সর্বনিম্ন সর্বনিম্নে হ্রাস করে।
এর চেয়েও ভাল বিকল্প হ'ল ক্ল্যাং দলকে লবি করা ফিচার অনুরোধের মাধ্যমে এই ক্ষেত্রে সংকলক বৈশিষ্ট্য সরবরাহ করার জন্য । (আরও ভাল, কারণ এটি সাবস্ক্লস যেমন এনএসআইক্রেনমেন্টাল স্টোরগুলিতে সেই পরিস্থিতিতেও সংকলন-সময় নির্ণয় সক্ষম করে enable)
আমি কেন এই পদ্ধতিটি বেছে নিই
- এটি দক্ষতার সাথে এবং কিছুটা সুবিধাজনকভাবে কাজটি সম্পন্ন করেছে।
- এটি বুঝতে মোটামুটি সহজ। (ঠিক আছে, এটি
__builtin_unreachable()
মানুষকে অবাক করে দিতে পারে তবে এটি বোঝাও যথেষ্ট সহজ))
- এটি অন্য সংকলক সতর্কতা বা ত্রুটিগুলি তৈরি না করে রিলিজ বিল্ডগুলিতে ছিনিয়ে নেওয়া যায় না - দৃ one় ম্যাক্রোগুলির একটির ভিত্তিতে এমন একটি পদ্ধতির विपरीत।
এই শেষ পয়েন্টটির কিছু ব্যাখ্যা দরকার, আমার ধারণা:
কিছু (সর্বাধিক?) লোকেরা রিলিজ বিল্ডগুলিতে দৃ .় প্রত্যয় ফেলে। (আমি সেই অভ্যাসের সাথে একমত নই, তবে এটি অন্য গল্প ...) প্রয়োজনীয় পদ্ধতিটি প্রয়োগ করতে ব্যর্থ - তবে - খারাপ , ভয়ানক , ভুল , এবং মূলত মহাবিশ্বের শেষ আপনার প্রোগ্রামটির জন্য । আপনার প্রোগ্রাম এ ক্ষেত্রে সঠিকভাবে কাজ করতে পারে না কারণ এটি অপরিজ্ঞাত, এবং অপরিজ্ঞাত আচরণটি এখন পর্যন্ত সবচেয়ে খারাপ কাজ thing সুতরাং, নতুন ডায়াগনস্টিকগুলি তৈরি না করেই diagn ডায়াগনস্টিকগুলি সরিয়ে ফেলতে সক্ষম হওয়া পুরোপুরি অগ্রহণযোগ্য।
এটি যথেষ্ট খারাপ যে আপনি এই জাতীয় প্রোগ্রামার ত্রুটির জন্য যথাযথ সংকলন-সময় ডায়াগনস্টিকগুলি অর্জন করতে পারবেন না এবং এগুলির জন্য অ্যান-রান-টাইম আবিষ্কার অবলম্বন করতে হবে, তবে যদি আপনি এটির রিলিজ তৈরি করতে পারেন তবে কেন একটি বিমূর্ত শ্রেণিতে চেষ্টা করবেন প্রথম স্থান?