বাংলায় অবজেক্টিভ-সি, সুইফট এবং iOS অ্যাপ ও গেম ডেভ
  • ভূমিকা
  • অবজেক্টিভ-সি ব্যাসিক
    • প্রাথমিক ধারনা এবং Xcode
    • Objective-C এর ভিতরে আমাদের প্রিয় C
    • ফাংশন ও এর ব্যবহার
    • ক্লাস ও অবজেক্ট
    • প্রোপার্টি ও এর অ্যাট্রিবিউটের ব্যবহার
    • মেথড ও এর বিস্তারিত
    • প্রোটোকল
    • ক্যাটাগরি
    • ব্লক ও এর ব্যবহার
    • এক্সেপশন ও এরর হ্যান্ডেলিং
  • অ্যাপ ডেভেলপমেন্ট
    • টুলস সেটআপ এবং একটি সাধারণ হ্যালো ওয়ার্ল্ড অ্যাপ তৈরি
    • iOS অ্যাপে ব্যাসিক ইনপুট আউটপুট ও কিবোর্ড হ্যান্ডেলিং
    • আরও চ্যাপ্টার আসছে ...
  • সুইফ্ট ব্যাসিক
    • সুইফ্ট – অ্যাপলের নতুন চমক, পরিচিতি ও অন্যান্য
    • স্ট্রিং ও ক্যারেকটার টাইপ ভ্যারিয়েবল
    • কালেকশনস (অ্যারে ও ডিকশনারী), ইনুমারেশন ও ক্লোজার
    • ব্রাঞ্চিং ও লুপিং
    • ফাংশন ও মেথড
    • ক্লাস এবং স্ট্রাকচারের মধ্যে পার্থক্য
    • প্রোপার্টি
    • ইনহেরিটেন্স
    • ইনিশিয়ালাইজেশন, ডি-ইনিশিয়ালাইজেশন ও অপশনাল চেইনিং
    • এক্সটেনশন ও প্রোটোকল
  • গেম ডেভেলপমেন্ট
    • গেমস বনাম আপ্লিকেশন্স, গেমস বনাম গেমস (গেমসের প্রকারভেদ)
    • অতিরিক্ত প্রয়োজনীয় টুলস এবং তাদের পরিচিতি, ফ্রেমওয়ার্ক নির্বাচন (স্প্রাইটকিট, কোকোস-২D, ...)
    • স্থানাংক ব্যাবস্থা, দেয়ালের প্রথম ইট
    • ব্যাসিক কিছু ধারনাঃ স্প্রাইট(ছবি), অ্যানিমেশন, ফন্ট, সাউন্ড(শব্দ)
    • গেমঃ মহাকাশ-যুদ্ধ
      • একটি স্পেসশিপ তৈরি
      • গুলি ছোঁড়া
      • প্রতিপক্ষ স্পেসশিপ(গুলো)
      • আক্রমণ
    • গেম-সেন্টার
      • লিডার-বোর্ড (সেরাদের-তালিকা)
      • অ্যাচিভমেন্টস (অর্জন)
      • চ্যালেঞ্জ
  • অ্যাপ্লিকেশন সাবমিট, প্রচার ও সাফল্য
    • অ্যাপল ডেভেলপের আইডি খোলা
    • আসল ডিভাইসে অ্যাপ রান এর পদ্ধতি
    • আরও চ্যাপ্টার আসছে ...
  • অতিরিক্তঃ কিছু সাধারণ প্রশ্ন ও উত্তর
    • অবজেক্টিভ-সি (Objective-C) নাকি সুইফ্ট (Swift)?
    • আরও চ্যাপ্টার আসছে ...
Powered by GitBook
On this page
  1. অবজেক্টিভ-সি ব্যাসিক

ক্যাটাগরি

Previousপ্রোটোকলNextব্লক ও এর ব্যবহার

Last updated 6 years ago

ভূমিকাঃ সংক্ষেপে বলতে গেলে ক্যাটাগরি হচ্ছে একটি ক্লাসের ডেফিনেশনকে অনেক গুলো আলাদা আলাদা ফাইলে ভাগ করে নেয়া। অনেক বড় কোড বেজে কাজ করার সময় একটি ক্লাসের মডিউলারাইজেশন করাই এর উদ্দেশ্য। মডিউলারাইজেশন বলতে বোঝানো হচ্ছে যে, একটি বড় ক্লাসকে ছোট ছোট অনেক গুলো স্বাধীন অংশ হিসেবে তৈরি করার একটা প্যাটার্ন।

উপরের ছবিটিতে এটাই প্রকাশ করা হয়েছে যে, একাধিক ফাইল অর্থাৎ Cook.m এবং Cook+Costing.m মিলে Cook ক্লাসের পূর্ণাঙ্গ ইমপ্লিমেন্টেশন সম্পন্ন হয়েছে। নিচের উদাহরণের মাধ্যমে আমরা আরও পরিষ্কার ধারনা পাবো যেখানে, একটি ক্যাটাগরি ব্যবহার করে একটি বেজ ক্লাসকে এক্সটেন্ড করব অর্থাৎ বেজ ক্লাসের অ্যাসেট হিসেবে আরও কিছু মেথড যুক্ত করব কিন্তু বেজ ক্লাসটির সোর্স বা কোন কিছু পরিবর্তন না করেই।

উদাহরণ এর পটভূমি তৈরিঃ কথামত, ক্যাটাগরির ব্যবহার বুঝতে হলে আমাদের এক সেট বেজ ক্লাস দরকার পরবে। আর তাই নিচের মত করে একটি ক্লিন প্রজেক্টে Cook ক্লাস তৈরি করে নিন যেটা এক্ষেত্রে আমাদের বেজ ক্লাস।

Cook.h

#import <Foundation/Foundation.h>

@interface Cook : NSObject

@property (copy) NSString *item;

- (void)placeOrder;
- (void)startCooking;

@end
Cook.m

#import "Cook.h"

@implementation Cook

-(void) placeOrder {
    NSLog(@"Order placed for a %@", self.item);
}

-(void) startCooking {
    NSLog(@"Started cooking %@", self.item);
}

@end

আশা করি উপরের সাধারণ ক্লাস ডেফিনেশনটা বুঝতে পেরেছেন। এভাবে আগে আমরা অনেক বারই ক্লাস তৈরি করেছি যেখানে একটি ইন্টারফেস ফাইল এবং একটি ইমপ্লিমেন্টেশন ফাইল মিলে একটি পূর্ণ ক্লাস ডেফিনেশন সম্পন্ন হয়। এখন মনে করুন যে, আপনি রান্না (Cook) সম্পর্কিত আরও কিছু মেথড যুক্ত করতে চাচ্ছেন কিন্তু Cook ক্লাস এর কোন কিছু পরিবর্তন না করে বা সেটার গঠন নষ্ট না করে। এই ক্ষেত্রে আপনি ওই নতুন মেথড গুলো একটি ক্যাটাগরিতে যুক্ত করতে পারেন। ধরুন, আমরা চাই Cooking সম্পর্কিত খরচ এর হিসাবের একটি নতুন মেথড যুক্ত করতে।

এখন একটু খেয়াল করলেই দেখবেন ক্যাটাগরির ইন্টারফেস ফাইল এবং সাধারণ ক্লাসের ইন্টারফেস ফাইল একি রকম দেখতে শুধু @interface এর পর ক্লাসের নাম এবং তারপর ব্রাকেটের মধ্যে ক্যাটাগরির নাম উল্লেখ করতে হয়। নিচে আমাদের Cook+Costing এর ইন্টারফেস,

Cook+Costing.h

#import "Cook.h"

@interface Cook (Costing)

- (BOOL)isFreeOfferOngoing;
- (void)calculatePrice;

@end

রানটাইমে এই মেথড দুটো Cook ক্লাসের অংশ হিসেবেই কাজ করে। যদিও এগুলো আলাদা একটা ফাইলে ডিফাইন করা হল তবুও এগুলোকে এমন ভাবে এক্সেস করা যাবে যেন মনে হবে এগুলো Cook ক্লাসের মেথড। আর আগেই বলা হয়েছে ক্যাটাগরির ইমপ্লিমেন্টেশনও লাগবে (সাধারণ ক্লাসের মতই)। তাই নিচের মত করে Cook+Costing.m ফাইলটি পরিবর্তন করুন,

Cook+Costing.m

#import "Cook+Costing.h"

@implementation Cook (Costing)

-(BOOL) isFreeOfferOngoing {
    return NO;
}

-(void)calculatePrice {
    NSLog(@"Price of %@ would be 350 tk.", self.item);
}

@end

ব্যবহারঃ যেকোনো ফাইল কোন একটি ক্যাটাগরির যেকোনো একটি API (ইন্টারফেস লেয়ার) ব্যবহার করতে চাইলে তাকে অবশ্যই ওই ক্যাটাগরির হেডার ফাইলে যুক্ত করে নিতে হবে। অর্থাৎ নিচের মত করে main.m ফাইলে প্রথমে আমাদেরকে Cook ক্লাসের হেডার এবং তারপরে Cook+Costing ক্যাটাগরির হেডার যুক্ত করতে নিতে হবে,

main.m

#import <Foundation/Foundation.h>
#import "Cook.h"
#import "Cook+Costing.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        Cook *forMe = [[Cook alloc] init];
        forMe.item = @"Italian Pizza";

        // "Standard" functionality from Cook.h
        [forMe placeOrder];
        [forMe startCooking];

        // Additional methods from Cook+Costing.h
        if (![forMe isFreeOfferOngoing]) {
            [forMe calculatePrice];
        }

    }
    return 0;
}

উপরে খেয়াল করুন, খুব সুন্দর ভাবে Cook ক্লাসের ফাংশনালিটি গুলো আমরা এক্সেস করতে পারছি এবং সাথে ওই ক্লাসের অবজেক্ট বা ইন্সট্যান্স দিয়েই কিন্তু Costing ক্যাটাগরির মাধ্যমে Cooking এর জন্য অতিরিক্ত প্রয়োজনীয় মেথড যেগুলো নতুন ক্যাটগরি হিসেবে ডিফাইন করা হয়েছে সেগুলোও এক্সেস করতে পারছি ১৯-২১ নাম্বার লাইনে। প্রোজেক্টটি রান করালে নিচের মত আউটপুট আসবে।

প্রোটেক্টেড মেথড হিসেবে ক্যাটাগরিঃ আশা করি এই বিষয়ে আমাদের সম্ভাব্য কাগুজে বইয়ে বিস্তারিত আলোচনা থাকবে।

এক্সটেনশনঃ আশা করি এই বিষয়ে আমাদের সম্ভাব্য কাগুজে বইয়ে বিস্তারিত আলোচনা থাকবে।

ক্যাটাগরি তৈরিঃ ক্যাটাগরির ডেফিনিনেশন এবং ক্লাসের ডেফিনেশন মোটা মুটি একি রকম অর্থাৎ এরও ইন্টারফেস এবং ইমপ্লিমেন্টেশন মিলেই সম্পূর্ণতা হয়। আমাদের প্রজেক্টে নতুন Cook+Costing নামের ক্যাটাগরি যুক্ত করতে হলে Xcode এর New File অপশন থেকে নিচের মত করে এই ক্যাটাগরিটি তৈরি ও প্রজেক্টে যুক্ত করুন। ক্যাটাগরির নাম দিচ্ছি Costing এবং Category On হিসেবে লিখতে/সিলেক্ট করতে হবে Cook.

তাহলে আমাদের প্রজেক্টে ফাইল স্ট্রাকচার হবে নিচের মত,

Originally Posted

Here
Screen Shot 2014-06-09 at 9.15.59 PM
Screen Shot 2014-06-09 at 9.51.49 PM
Screen Shot 2014-06-09 at 9.15.28 PM
Screen Shot 2014-06-09 at 9.16.19 PM
category