আপনি যখন একটি API মোড়ানো রুবি ব্যবহার করেন, তখন আপনার এটি কনফিগার করার একটি উপায় থাকতে হবে। হতে পারে র্যাপারের একটি ব্যবহারকারীর নাম এবং গোপন কী প্রয়োজন, অথবা হতে পারে শুধু একটি হোস্ট৷
৷এটি পরিচালনা করার জন্য কয়েকটি ভিন্ন উপায় রয়েছে। তাহলে আপনার কোনটি বেছে নেওয়া উচিত?
সহজ, বিশ্বব্যাপী পথ
আপনি হয়তো চান যে আপনার পরিষেবা সবসময় আশেপাশে থাকে। আপনি আপনার অ্যাপে যেখানেই থাকুন না কেন, আপনার কাছে এটি ব্যবহারের জন্য প্রস্তুত থাকবে৷৷ অন্যথায়, আপনি এটি ব্যবহার করার প্রতিটি লাইনের জন্য এটি কনফিগার করতে তিনটি লাইন ব্যয় করবেন!
ধ্রুবক বা শ্রেণী বৈশিষ্ট্যগুলি ব্যবহার করে আপনি কনফিগারেশনটিকে বিশ্বব্যাপী করতে পারেন:
ProductApi.root = "https://staging-host.example.com/"
ProductApi.user = "justin"
ProductApi.secret = "mysecret123"
def show
@product = ProductApi.find(params[:id])
end
প্রচুর রত্ন এই প্যাটার্ন ব্যবহার করে। এটি লিখতে বেশ সহজ, এবং ব্যবহার করা সত্যিই সহজ। কিন্তু এতে কিছু বড় সমস্যা আছে:
-
আপনার কাছে শুধুমাত্র একটি
ProductApi
থাকতে পারে .আপনি যদি দুটি ভিন্ন ব্যবহারকারী হিসাবে পণ্য API ব্যবহার করতে চান, বা একটি একক অ্যাপ থেকে ভিন্ন সার্ভারে আঘাত করতে চান তবে আপনার ভাগ্যের বাইরে।
-
ProductApi
গ্লোবাল ডেটা আছে যা দুর্ঘটনাক্রমে পরিবর্তন করা সহজ৷৷যদি কোনো থ্রেড বা আপনার অ্যাপের কোনো অংশ
ProductApi.user
পরিবর্তিত হয় , অন্য সবকিছুProductApi
ব্যবহার করে ভেঙ্গে যাবে এবং সেগুলি বেদনাদায়ক ট্র্যাক ডাউন বাগ.
সুতরাং, ক্লাস ভেরিয়েবলের কিছু সমস্যা আছে। যদি আপনি ইনস্ট্যান্স কনফিগার করেন তাহলে কি হবে পরিবর্তে, আপনার পণ্য API শ্রেণীর?
এটি #initialize
দিয়ে দেখতে কেমন হবে ?
আপনি যদি দৃষ্টান্ত ব্যবহার করেন, আপনার প্রয়োজন হলে আপনি আপনার API র্যাপার তৈরি এবং কনফিগার করবেন:
def show
product_api = ProductApi.new(
root: "https://staging-host.example.com/",
user: "justin",
secret: "mysecret123")
@product = product_api.find(params[:id])
end
এখন, আপনি যখনই এটি ব্যবহার করেন তখনই আপনি আপনার API-এ বিভিন্ন বিবরণ পাঠাতে পারেন। অন্য কোন পদ্ধতি বা থ্রেড আপনার দৃষ্টান্ত ব্যবহার করছে না, তাই আপনাকে এটি না জেনে এটি পরিবর্তন করার বিষয়ে চিন্তা করতে হবে না।
এই ভাল মনে হয়. তবে এটি এখনও যতটা সহজ হওয়া উচিত নয়। কারণ আপনাকে আপনার API প্রতিবার কনফিগার করতে হবে আপনি এটি ব্যবহার করুন৷৷
বেশিরভাগ সময় আপনি এপিআই কীভাবে সেট আপ করা হয় তা চিন্তা করেন না, আপনি কেবল এটিকে বুদ্ধিমান বিকল্পগুলির সাথে ব্যবহার করতে চান। কিন্তু আপনি যখন দৃষ্টান্ত নিয়ে কাজ করছেন, তখন আপনার অ্যাপের প্রতিটি অংশ যা API ব্যবহার করে তাদের জানতে হবে কিভাবে এটি কনফিগার করতে হয়।
তবে ভাল ডিফল্ট ব্যবহার করে বিশ্বব্যাপী অ্যাক্সেসের সুবিধা পাওয়ার একটি উপায় রয়েছে, যদিও আপনার প্রয়োজনে এটি পরিবর্তন করতে সক্ষম।
এবং এই প্যাটার্নটি একটি আকর্ষণীয় জায়গায় সব সময় দেখায়:OS X এবং iOS ডেভেলপমেন্ট৷
আপনি কিভাবে ভাল ডিফল্ট পাবেন এবং নমনীয়তা?
কি হবে যদি আপনি আপনার API র্যাপারের প্রতিটি ইন্সট্যান্স কনফিগার করতে পারেন, কিন্তু আপনার কাছে একটি গ্লোবাল "ডিফল্ট" ইন্সট্যান্সও ছিল যখন আপনি কেবল পাত্তা দেননি?
আপনি iOS এবং Mac OS SDK-তে এই "ডিফল্ট কিছু" বা "ভাগ করা যাই হোক না কেন" প্যাটার্ন দেখতে পাবেন:
[[NSURLSession sharedSession] downloadTaskWithURL:@"https://www.google.com"];
[[NSFileManager defaultManager] removeItemAtPath:...];
এবং ডিফল্ট আপনাকে যা দেয় তার চেয়ে বেশি প্রয়োজন হলে আপনি এখনও এই ক্লাসগুলির উদাহরণ চাইতে পারেন:
NSURLSession *session = [NSURLSession sessionWithConfiguration:...];
NSFileManager fileManager = [[NSFileManager alloc] init];
আপনি default_api
সহ রুবিতে এরকম কিছু তৈরি করতে পারেন ক্লাস পদ্ধতি:
def show
@product = ProductApi.default_product_api.find(params[:id])
end
...
def show_special
special_product_api = ProductApi.new(
root: "https://special-product-host.example.com/"
user: "justin"
secret: "mysecret123")
@special_product = special_product_api.find(params[:id])
end
এবং বাস্তবায়ন এই মত কিছু দেখতে পারে:
class ProductApi
def initialize(root:, user:, secret:)
@root, @user, @secret = root, user, secret
end
def self.default_api
@default_api ||= new(
root: ENV['PRODUCT_API_ROOT'],
user: ENV['PRODUCT_API_USER'],
secret: ENV['PRODUCT_API_SECRET'])
end
def find(product_id)
...
end
end
এখানে, আমি default_api
এ পরিবেশ ভেরিয়েবল ব্যবহার করেছি , কিন্তু আপনি কনফিগার ফাইলগুলিও ব্যবহার করতে পারেন। এবং আপনি ||=
পরিবর্তন করতে পারেন পরিবর্তে থ্রেড- বা অনুরোধ-স্থানীয় স্টোরেজ ব্যবহার করতে।
তবে এটি একটি শালীন শুরু৷
আমি দেখেছি বেশিরভাগ রত্ন, যেমন টুইটার রত্ন, আপনার প্রয়োজন হলে প্রতিটি API অবজেক্ট কনফিগার এবং তৈরি করতে হবে। এটি একটি ঠিক আছে সমাধান (যদিও আমি সাধারণত দেখি যে লোকেরা এইগুলিকে বিশ্বব্যাপী নিয়োগ করছে যাই হোক )।
কিন্তু আপনি যদি আরও এক ধাপ এগিয়ে যান, এবং একটি পূর্ব-কনফিগার করা ডিফল্ট অবজেক্টও ব্যবহার করেন, তাহলে আপনি অনেক বেশি আরামদায়ক সময় পাবেন।