আমার তদন্ত এই। যখন কেউ # আমদানি ব্যবহার করে এবং যখন কেউ @ ক্লাস ব্যবহার করে?
সহজ উত্তর: আপনি #importবা #includeযখন কোনও শারীরিক নির্ভরতা থাকে। অন্যথা, আপনি এগিয়ে ঘোষণা ব্যবহার করুন ( @class MONClass, struct MONStruct, @protocol MONProtocol)।
এখানে শারীরিক নির্ভরতার কয়েকটি সাধারণ উদাহরণ রয়েছে:
- যে কোনও সি বা সি ++ মান (একটি পয়েন্টার বা রেফারেন্স কোনও শারীরিক নির্ভরতা নয়)।
CGPointআইভার বা সম্পত্তি হিসাবে আপনার যদি একটি থাকে তবে সংকলকটির ঘোষণাপত্রটি দেখতে হবে CGPoint।
- আপনার সুপারক্লাস
- আপনি যে পদ্ধতিটি ব্যবহার করেন।
কখনও কখনও যদি আমি @ ক্লাস ঘোষণাটি ব্যবহার করি তবে আমি একটি সাধারণ সংকলক সতর্কতা দেখতে পাই যেমন নীচের মতো: "সতর্কতা: রিসিভার 'ফুকো কন্ট্রোলার' একটি ফরোয়ার্ড শ্রেণি এবং সম্পর্কিত @ অন্তর্ভুক্ত থাকতে পারে না।"
এই সম্পর্কে সংকলকটি আসলে খুব লেনিয়েন্ট। এটি ইঙ্গিতগুলি ফেলে দেবে (যেমন উপরের একটিটির মতো), তবে আপনি যদি নিজের স্ট্যাকগুলি এড়ানো এবং #importসঠিকভাবে না করেন তবে আপনি সহজেই ট্র্যাশ করতে পারবেন । যদিও এটি হওয়া উচিত (আইএমও), সংকলক এটি প্রয়োগ করে না। এআরসি-তে, সংকলকটি আরও কঠোর কারণ এটি রেফারেন্স গণনার জন্য দায়ী। যা ঘটে তা সংকলকটি যখন ডিফল্ট অবস্থায় ফিরে আসে তখন এটি কল করে এমন কোনও অজানা পদ্ধতির মুখোমুখি হয়। প্রতিটি রিটার্ন মান এবং প্যারামিটার হিসাবে ধরে নেওয়া হয় id। সুতরাং, আপনার কোডবেসগুলি থেকে প্রতিটি সতর্কতা মুছে ফেলা উচিত কারণ এটিকে শারীরিক নির্ভরতা হিসাবে বিবেচনা করা উচিত। এটি সি ফাংশনকে কল করার অনুরূপ যা ঘোষিত নয়। সি সহ, পরামিতিগুলি ধরে নেওয়া হয় int।
আপনি ফরোয়ার্ড ঘোষণার পক্ষে দেওয়ার কারণ হ'ল আপনি আপনার বিল্ডের সময়গুলি কারণগুলির দ্বারা হ্রাস করতে পারবেন কারণ সেখানে ন্যূনতম নির্ভরতা রয়েছে। সামনের ঘোষণাপত্রের সাথে, সংকলকটি দেখতে পাচ্ছে একটি নাম আছে এবং কোনও শারীরিক নির্ভরতা নেই যখন শ্রেণীর ঘোষণাপত্র বা এর সমস্ত নির্ভরতা না দেখে প্রোগ্রামটি সঠিকভাবে পার্স এবং সংকলন করতে পারে। ক্লিন বিল্ডগুলি কম সময় নেয়। বর্ধিত বিল্ডগুলি কম সময় নেয়। অবশ্যই, আপনার প্রয়োজন অনুসারে সমস্ত শিরোনাম প্রতিটি অনুবাদেই দৃশ্যমান রয়েছে তা নিশ্চিত করার জন্য আপনি আরও কিছুটা সময় ব্যয় করবেন, তবে এটি খুব কম সময়ের মধ্যে দ্রুত পরিশোধ করে (আপনার প্রকল্পটি ক্ষুদ্র নয় বলে ধরে নিবেন)।
আপনি যদি ব্যবহার করেন #importবা #includeপরিবর্তে, আপনি কম্পাইলারটিতে প্রয়োজনের তুলনায় অনেক বেশি কাজ ফেলে দিচ্ছেন। আপনি জটিল শিরোলেখ নির্ভরতা প্রবর্তন করছেন। আপনি এটিকে ব্রুট-ফোর্স অ্যালগরিদমের সাথে তুলনা করতে পারেন। আপনি যখন #import, প্রচুর অযৌক্তিক তথ্য টেনে আনছেন, যার উত্সগুলি বিশ্লেষণ এবং সংকলন করতে প্রচুর মেমরি, ডিস্ক আই / ও, এবং সিপিইউ প্রয়োজন।
নির্ভরশীলতার ক্ষেত্রে সি ভিত্তিক ভাষার জন্য ওবিজেসি আদর্শের খুব কাছাকাছি কারণ NSObjectপ্রকারগুলি কখনই মান হয় না - NSObjectপ্রকারগুলি সর্বদা রেফারেন্স গণনা পয়েন্টার হয়। সুতরাং আপনি যদি আপনার প্রোগ্রামের নির্ভরতা যথাযথভাবে এবং যথাসম্ভব যেখানে কাঠামোগত গঠন করেন তবে অবিশ্বাস্যভাবে দ্রুত সংকলনের সময়গুলি থেকে দূরে সরে যেতে পারেন কারণ শারীরিক নির্ভরতার খুব কম প্রয়োজন। আরও নির্ভরতা হ্রাস করার জন্য আপনি শ্রেণিবদ্ধকরণগুলিতে বৈশিষ্ট্যগুলিও ঘোষণা করতে পারেন। এটি বৃহত সিস্টেমগুলির জন্য একটি বিশাল বোনাস - আপনি যদি কোনও বড় সি ++ কোডবেস বিকাশ করেন তবে এটির পার্থক্যটি আপনি জানতে পারবেন।
অতএব, আমার প্রস্তাবটি যেখানে সম্ভব সেখানে অগ্রিম ব্যবহার করা এবং তারপরে #importযেখানে শারীরিক নির্ভরতা রয়েছে। আপনি যদি সতর্কতা বা অন্য কোনওটি দেখতে পান যা শারীরিক নির্ভরতা বোঝায় - এগুলি সব ঠিক করুন। #importআপনার বাস্তবায়ন ফাইলে ঠিক করা ।
আপনি যখন গ্রন্থাগারগুলি তৈরি করেন, আপনি সম্ভবত একটি গোষ্ঠী হিসাবে কিছু ইন্টারফেস শ্রেণিবদ্ধ করবেন, সেক্ষেত্রে আপনি #importসেই লাইব্রেরি যেখানে শারীরিক নির্ভরতা প্রবর্তন করা হবে (উদাঃ #import <AppKit/AppKit.h>)। এটি নির্ভরতা প্রবর্তন করতে পারে, তবে গ্রন্থাগার রক্ষণাবেক্ষণকারীরা আপনার প্রয়োজন হিসাবে প্রায়শই শারীরিক নির্ভরতা পরিচালনা করতে পারে - যদি তারা কোনও বৈশিষ্ট্য প্রবর্তন করে তবে তারা আপনার বিল্ডগুলিতে এর প্রভাবকে হ্রাস করতে পারে।