ওজেক্টিভ সি তে প্রোগ্রামিং করার সময় লোকে কি প্রচুর ব্যবহার করে?


13

সম্পর্কিত: "এনএসএসটিং * টাইপের প্যারামিটারে 'কনস্ট এনএসএসস্ট্রিং *' প্রেরণ বাছাই কোর্ফায়ার্স"

কখনও কখনও, আমি যদিও এটি দরকারী। আমার একটি টেবিল পাস করার প্রয়োজন হতে পারে এবং টেবিলের সামগ্রীটি পরিবর্তন না হয় তা নিশ্চিত করতে চাই।

তবে বেশিরভাগ উদ্দেশ্য-সি প্রোগ্রামের নমুনায় আমি কখনই দেখি না const। আমার প্রশ্ন কেন?

উত্তর:


21

ওজেক্টিভ-সি অবজেক্টগুলি যেভাবে কাজ 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

[*] আমি আশা করি এটি করার কিছু নিয়ন্ত্রিত উপায় রয়েছে তবে এখন আমরা একজন প্রোগ্রামারকে "চালাক" কাজ করে অন্যজনকে নাশকতার চেষ্টা করার রাজ্যে চলেছি।


ধন্যবাদ। সুতরাং কনস্ট মডিফায়ারের মাধ্যমে পরিবর্তন রোধ করার কোনও উপায় নেই।
user4951

ঠিক। সংকলকটি এখনও সজ্জাটিকে constঅর্থবহ হিসাবে বিবেচনা করে যাতে সতর্কতা দমন করতে আপনি এলিয়াস বা ক্যাসেটের মতো সংক্ষিপ্তসার পান তবে এই সংকোচনের ফলে প্রোগ্রামটির আচরণে কোনও পরিবর্তন আসে না।

5
আমি বিশ্বাস করি যে constঅবজেক্টিভ সিতে এখনও এটি কার্যকর হতে পারে যে কোনও অবজেক্টের পয়েন্টারটি কখনই অন্য কোনও বস্তুর দিকে নির্দেশিত হয় না । আমি NSString * const xআপনাকে জানি যে xসর্বদা একই স্ট্রিং হবে এবং একটি ভিন্ন স্ট্রিং নয়।
tboyce12

3

অবজেক্টিভ সি যতদূর যায় - আমি এতে প্রোগ্রাম করি না, সুতরাং প্রশ্নের উত্তর দিতে পারি না। আমি যে প্রশ্নের উত্তর দিতে পারি তা হ'ল " constউদ্দেশ্য সি তে প্রোগ্রামিং করার সময় লোকেরা কি প্রচুর ব্যবহার করতে পারে ?" - এটি একটি নির্দিষ্ট "হ্যাঁ"।

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

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


0

আমি খুব দীর্ঘ সময় ধরে উদ্দেশ্য-সি ব্যবহার করি নি।

যাইহোক, আমি অবাক হয়েছি কেন কোনও শরীরই এই দিকটি উল্লেখ করে না।

উদ্দেশ্য-সি এর ইতিমধ্যে ধ্রুবক সম্পর্কিত আরও কিছু আছে। পরিবর্তনশীলতা

উদাহরণস্বরূপ, Nstring * একটি ধ্রুবক স্ট্রিংকে নির্দেশ করবে। আপনি যদি কোনও স্ট্রিং চান যা আপনি সংশোধন করতে পারেন, আপনি NMutableString বা এর মতো কিছু ব্যবহার করুন। NMutableString এমন অতিরিক্ত পদ্ধতিগুলি সরবরাহ করবে যা লোকেদের স্ট্রিংটি সংশোধন করতে দেয়।

এখন, আপনি যদি পয়েন্টারটি নিজেই একটি ধ্রুবক হতে চান তবে কী হবে। খুব বড় একটি প্রকল্পের কোডিংয়ের সময় আমাকে কখনই এটি নিয়ে চিন্তা করতে হবে না।

সুতরাং আমি তাই মনে করি।

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