ওজেক্টিভ-সি অবজেক্টগুলি যেভাবে কাজ const
করে তার কারণে, একটি প্রয়োগকারী হওয়া ছেড়ে দেয় এবং প্রোগ্রামারটির জন্য একটি স্বরলিপি হওয়া শুরু করে। এই প্রোগ্রামটি বিবেচনা করুন:
int f(const int x) {
return ++x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
int x = 3;
NSLog(@"%d", f(x));
}
return 0;
}
এটি আসলে এখানে সংকলন করবে না (আমি ঝাঁকুনি ব্যবহার করছি): সংকলক আদিম সি প্রকারের সংশোধন করার প্রচেষ্টা সনাক্ত করতে পারে এবং একটি ত্রুটি নির্গত করে। তবে এখন এটি এই প্রোগ্রামের সাথে তুলনা করুন:
NSMutableString *f2(const NSMutableString * const x) {
[x appendString: @" world!"];
return x;
}
int main(int argc, char *argv[]) {
@autoreleasepool {
NSMutableString *x = [@"Hello" mutableCopy];
NSLog(@"%@", f2(x));
}
return 0;
}
যদিও ফাংশনটি একটি ধ্রুবক অবজেক্টে একটি স্থির পয়েন্টারটি অতিক্রম করে তবে এখনও অবজেক্টটির রূপান্তর করা সম্ভব।
অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে, কোনও জিনিসের ধ্রুবক প্রকৃতি প্রয়োগের সর্বোত্তম উপায় হ'ল সেই অবজেক্টটিকে অপরিবর্তনীয় করে তোলা - অর্থাৎ এমন কোনও পদ্ধতি সরবরাহ করবেন না যা তার অবস্থার পরিবর্তন করতে পারে। কল্পনা করুন যে উপরের ফাংশনটি NSString
পরিবর্তে একটি যুক্তি নিয়েছে NSMutableString
, এবং আমি @"Hello"
মিউচ্যুয়াল কপির পরিবর্তে আক্ষরিক পাস করেছি । যুক্তিযুক্তভাবে এখন বলার অপেক্ষা রাখে না, পাস-ইন অবজেক্ট [*] কে রূপান্তর করার কোনও সুযোগ নেই। উদ্দেশ্য-সি এর প্রয়োগের কোনও উপায় নেই যদিও অন্য ওও ভাষাগুলির ক্ষেত্রে ভিন্ন, const
বা final
রেফারেন্সের মত নয় ।
তুলনার জন্য, const
সি ++ এ সম্পূর্ণ আলাদাভাবে কাজ করে। আমি যদি const
কোনও সি ++ অবজেক্টের রেফারেন্স পাই তবে আমাকে কেবল const
সেই অবজেক্টের সদস্য ফাংশনগুলিতে কল করার অনুমতি দেওয়া হয়েছে । এই ফাংশনগুলি const
কোনও পরিবর্তন না করে বা mutable
ক্লাস ডিজাইনার দ্বারা স্পষ্টভাবে চিহ্নিত করা হয়েছে কেবল সদস্য ভেরিয়েবলগুলি সংশোধন করে, অবজেক্টের একত্বকে সংরক্ষণ করে । সুতরাং ধারণা করুন যে আমার MutableString
সি ++ তে কিছু টাইপ ছিল যা NSMutableString
উদ্দেশ্য-সি এর সমতুল্য । আমার উপরের উদাহরণটির সমতুল্য কিছু দেখতে লাগবে:
MutableString& f3(const MutableString& x) {
x.appendString(" world!");
return x;
}
এটি অবশ্যই সংকলন করবে না: অপারেশন appendString()
না হওয়া ছাড়াও const
, ফাংশনটি const
কোয়ালিফায়ারটিকে প্রকারের রেফারেন্স থেকে সরিয়ে দেয় যার জন্য একটি প্রয়োজন const_cast
।
[*] আমি আশা করি এটি করার কিছু নিয়ন্ত্রিত উপায় রয়েছে তবে এখন আমরা একজন প্রোগ্রামারকে "চালাক" কাজ করে অন্যজনকে নাশকতার চেষ্টা করার রাজ্যে চলেছি।