অবজেক্টিভ-সি-তে ধ্রুবক তৈরির সর্বোত্তম উপায় কী


156

আমি শেখার উদ্দেশ্যে একটি রেডডিট ক্লায়েন্ট তৈরি করছি। আমার কাছে এটির ধ্রুবক সহ একটি ফাইল থাকা দরকার। Reddit-Prefix.pchসব ফাইলের কনস্ট্যান্টগুলি উপলব্ধ করার জন্য আমি ফাইলটিতে ফাইলটি আমদানি করার বিষয়ে ভাবছিলাম । এটি কি জিনিস করার একটি ভাল উপায়? এছাড়াও, আমি আমার গবেষণা করেছি এবং ধ্রুবক তৈরির জন্য বেশ কয়েকটি পদ্ধতি খুঁজে পেয়েছি তবে কোনটি ব্যবহার করতে হবে তা আমি জানি না:

  • #define ম্যাক্রো
  • const
  • static const
  • extern const
  • enum

তাহলে কোন উপায়ে পছন্দের উপায়? কনভেনশন কী? আমি জানি যে "এটি নির্ভর করে" তবে আমার প্রশ্নটি আরও সুনির্দিষ্ট:: প্রতিটি সমাধানের ব্যবহারের ক্ষেত্রে কী কী?

এছাড়াও, যদি ব্যবহার করা হয় তবে extern constআমার কি ফাইলটি আমদানি করা দরকার, বা ফাইলগুলি আমদানি না করে ধ্রুবকগুলি বিশ্বব্যাপী উপলব্ধ হবে?

একটি জিনিস যা আমি যুক্তিযুক্তভাবে শেষ করতে পারি তা enumহ'ল কাস্টম ত্রুটি ডোমেনগুলির মতো কোনও কিছুর সংজ্ঞা দেওয়ার সময় সেরা পছন্দ (আমি আসলেই সঠিক?) কিন্তু কি অন্যদের?


stackoverflow.com/questions/11153156/… দয়া করে এই লিঙ্কটি দেখুন ... আপনার সমাধান এই পোস্টে
ব্যবহারকারী 1531343

3
@ ভাবীকামা: এটি দুটি নির্দিষ্ট সমাধানের বিপরীতে সংকীর্ণ প্রশ্ন।
পিটার হোসি

জন্য - স্ট্যাটিক const, # define, enum, এই লিঙ্কটি দরকারী হয় stackoverflow.com/questions/1674032/static-const-vs-define-in-c যে const যারা 3 বিকল্প উপর ভাল ব্যাখ্যা প্রদান করে
ব্যবহারকারী 1531343

enumশুধুমাত্র অবিচ্ছেদ্য মানগুলির জন্য কার্যকর। #defineএবং ধ্রুবকগুলি যে কোনও ডেটা ধরণের হতে পারে।
rmaddy

const, static constএবং extern constস্কোপ ব্যতীত সমস্ত একই। সুতরাং সত্যিই কেবল তিনটি পছন্দ আছে।
rmaddy

উত্তর:


385

প্রথম প্রশ্নটি হল আপনার ধ্রুবকগুলির কী সুযোগ থাকতে চান যা সত্যই দুটি প্রশ্ন:

  • এই ধ্রুবকগুলি কি একটি একক শ্রেণীর জন্য নির্দিষ্ট, বা সমস্ত অ্যাপ্লিকেশন জুড়ে এটি বোঝা যায়?
  • যদি তারা শ্রেণি-নির্দিষ্ট হয় তবে তারা কি ক্লাসের ক্লায়েন্টদের ব্যবহারের জন্য, বা কেবল শ্রেণীর মধ্যে?

যদি তারা কোনও একক শ্রেণীর জন্য নির্দিষ্ট এবং অভ্যন্তরীণ হয় তবে তাদের static const.m ফাইলের শীর্ষে হিসাবে ঘোষণা করুন :

static NSString *const MyThingNotificationKey = @"MyThingNotificationKey";

যদি তারা একটি একক শ্রেণীর সাথে সম্পর্কিত তবে অন্য শ্রেণীর দ্বারা প্রকাশ্যে / ব্যবহার করা উচিত, তাদেরকে externশিরোনাম হিসাবে ঘোষণা করুন এবং তাদের মি।

//.h
extern NSString *const MyThingNotificationKey;

//.m
NSString *const MyThingNotificationKey = @"MyThingNotificationKey";

যদি তাদের বৈশ্বিক হওয়া উচিত, তাদের একটি শিরোনামে ঘোষণা করুন এবং একটি নির্দিষ্ট মডিউলে তাদের নির্দিষ্ট করুন, বিশেষত const ধ্রুবকদের জন্য।

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

না কেন #define?

পুরানো উত্তরটি হ'ল "ম্যাক্রোগুলির কাছে তেমন তথ্য নেই", তবে সংকলকরা আজ আক্ষরিক (যা ম্যাক্রোগুলি প্রসারিত হয়) পাশাপাশি ভেরিয়েবলগুলির জন্য সমস্ত প্রকারের পরীক্ষা-নিরীক্ষা করার বিষয়ে যথেষ্ট স্মার্ট।

আধুনিক উত্তর হ'ল কারণ ডিবাগারটি আপনার ম্যাক্রোগুলি সম্পর্কে জানতে পারবে না। আপনি [myThing addObserver:self forKey:MyThingNotificationKey]কোনও ডিবাগার কমান্ডে MyThingNotificationKeyম্যাক্রো হলে বলতে পারবেন না ; ডিবাগার কেবলমাত্র এটির সম্পর্কে জানতে পারে যদি এটি পরিবর্তনশীল হয়।

না কেন enum?

ভাল, rmaddy মন্তব্যগুলিতে এটি আমাকে পরাজিত: enumশুধুমাত্র পূর্ণসংখ্যার ধ্রুবক সংজ্ঞা দিতে পারেন। সিরিয়াল শনাক্তকারী নম্বর, বিট-মাস্কস, চার-বাইট কোড ইত্যাদির মতো জিনিস

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

এবং অন্যান্য প্রশ্ন

আমি সব ফাইলের কনস্ট্যান্টগুলি উপলভ্য করতে Reddit-Prefix.pch ফাইলে ফাইলটি আমদানি করার বিষয়ে ভাবছিলাম। এটি কি জিনিস করার একটি ভাল উপায়?

সম্ভবত নিরীহ, তবে সম্ভবত অতিরিক্ত। আপনার ধ্রুবক হেডার (গুলি) যেখানে আপনার প্রয়োজন সেখানে আমদানি করুন।

এই সমাধানগুলির প্রত্যেকটির ব্যবহারের ক্ষেত্রে কী কী?

  • #define: বেশ সীমিত। আমি সত্যই নিশ্চিত নই যে এটিকে আর ধ্রুবকদের জন্য ব্যবহার করার কোনও ভাল কারণ আছে।
  • const: স্থানীয় ধ্রুবকদের জন্য সেরা। এছাড়াও, আপনি একটি শিরোনামে ঘোষিত হয়েছিলেন এবং এখন আপনি সংজ্ঞা দিচ্ছেন তার জন্য আপনাকে এটি ব্যবহার করতে হবে।
  • static const: ফাইল-নির্দিষ্ট (বা শ্রেণি-নির্দিষ্ট) ধ্রুবকের জন্য সেরা।
  • extern const: শিরোনামে ধ্রুবক রফতানি করার সময় আপনাকে অবশ্যই এটি ব্যবহার করতে হবে।

এছাড়াও, যদি ব্যবহার করা হয় তবে extern constআমার কি ফাইলটি আমদানি করা দরকার, বা ফাইলগুলি আমদানি না করে ধ্রুবকগুলি বিশ্বব্যাপী উপলব্ধ হবে?

আপনি যে ফাইলটি ব্যবহার করেন সেখানে প্রতিটি ফাইল বা উপসর্গ শিরোনামে আপনাকে ফাইলটি আমদানি করতে হবে।


3
কেন ব্যবহার করছেন না static NSString *const.hফাইল পুরাপুরি?
Iulian Onofrei

3
@ আইলিয়ানঅনফ্রেই: আপনি যদি এটি প্রয়োগ করতে পারেন তবে কাঠামোতে না। যদি আপনি এটি করেন static NSString *const foo = @"foo";, তবে আপনার শিরোনামটি স্ট্রিংটি কী তা নির্ধারণ করে এবং এটি সর্বত্র একই হতে হবে you আপনি যদি কখনও স্ট্রিং পরিবর্তন করেন এবং বিভিন্ন পক্ষগুলি ভিন্ন স্ট্রিং সহ শিরোনামের বিভিন্ন সংস্করণ ব্যবহার করে, তবে স্ট্রিংগুলি রানের সাথে মেলে না won't সময়। কোনও ফ্রেমওয়ার্কে আপনি কেবলমাত্র প্রতীকটিতে অ্যাক্সেস সরবরাহ করতে চান এবং ফ্রেমওয়ার্কটি সেই চিহ্নের সত্যিকার মূল্যের একমাত্র উত্স হয়ে উঠুক, সুতরাং প্রত্যেকে এক জায়গা থেকে একই স্ট্রিং পাচ্ছে। এটাই তোমাকে externপায়
পিটার হোসি 14

এস সম্পর্কে অতিরিক্ত নোট #define: তাদের মেমরিতে একই ঠিকানা থাকার গ্যারান্টি নেই (তারা কীভাবে ঘোষিত হয়েছে তার উপর নির্ভর করে তারা প্রতিবার ব্যবহার করার সময় একটি নতুন উদাহরণ বরাদ্দ করতে পারে), সুতরাং ব্যবহার myObject == MyDefineসর্বদা প্রত্যাশা অনুযায়ী কাজ করবে না, কিন্তু myObject == MyStaticConstহবে।
বেন লেগিগিরো

এটা পছন্দ বানান জানার জন্য কি static NSString *constপরিবর্তে static NSString const*?? কোন পার্থক্য ?!
kokos8998

@ kokos8998 এটি কি কোনও পার্থক্য করে? হ্যাঁ এটা করে. static NSString const *একই ধরণের static const NSString *এবং এর অর্থ "একটি (পরিবর্তনযোগ্য) পয়েন্টারটি একটি ধ্রুবক এনএসএসটিংয়ের কাছে" - যা এনএসএসস্ট্রিং ইতিমধ্যে অপরিবর্তনীয় বলে এখানে কিছুটা নিরর্থক। আপনি কেবল কী করতে চান static NSString * const- এটি একটি "এনএসএসস্ট্রিংয়ের নিয়মিত পয়েন্টার"
ডেভিড

8

FOUNDATION_EXPORT

এটি ফাউন্ডেশনে সংজ্ঞায়িত করা এবং সি, সি ++ এবং উইন 32 এর জন্য সামঞ্জস্যপূর্ণ ফর্ম্যাটগুলির সংকলন করার FOUNDATION_EXPORTচেয়ে কিছুটা বেশি সামঞ্জস্যের জন্য ব্যবহার বিবেচনা করুন extern

এনএসওবিজেসিআরএনটাইম

#if defined(__cplusplus)
#define FOUNDATION_EXTERN extern "C"
#else
#define FOUNDATION_EXTERN extern
#endif

#if TARGET_OS_WIN32

    #if defined(NSBUILDINGFOUNDATION)
        #define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllexport)
    #else
        #define FOUNDATION_EXPORT FOUNDATION_EXTERN __declspec(dllimport)
    #endif

    #define FOUNDATION_IMPORT FOUNDATION_EXTERN __declspec(dllimport)

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