আইওএস এবং অ্যান্ড্রয়েডের জন্য কীভাবে একটি ভাগ করা সি ++ গ্রন্থাগার তৈরি করবেন

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

সুবিধা এবং অসুবিধা সহ অনেকগুলি বিকল্প রয়েছে। তবে, কেবল একটি নির্বাচন করা সহজ নয়। এই বিকল্পগুলির বৈধতা দেওয়ার জন্য, আমরা নিম্নলিখিত নির্দেশিকাগুলি বিবেচনা করি:

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

কয়েক দিন গবেষণা এবং আলোচনার পরে, আমরা জিনির দিকে লক্ষ্য করলাম, ড্রপবক্সের একটি শেয়ার কোড সমাধান যা আপনাকে সি ++ এর মূল ব্যবসায়িক যুক্তি ভাগ করতে দেয় এবং যার ইউআই এখনও সেরা সম্ভাব্য ব্যবহারকারীর অভিজ্ঞতার জন্য হস্তনির্মিত হয়েছে been । আপনি সি ++ এর জন্য ব্রিজের মাধ্যমে কয়েকটি প্ল্যাটফর্ম-নির্দিষ্ট এপিআই উপলব্ধ করতে পারেন এবং প্রয়োজনে ব্যবহারকারী ইন্টারফেসকে কল করতে পারেন। এটি খুব শক্তিশালী কারণ আমরা একই প্ল্যাটফর্মগুলিতে এপিআইয়ের একই সেট সহ একটি পরিষ্কার, পাতলা UI স্তর লিখতে পারি।

কীভাবে জিনির সেট আপ করবেন

সেটআপ সহজ:

জিনিকে আপনার গিট প্রকল্পে একটি উপ-মডিউল হিসাবে যুক্ত করুন:

গিট সাবমডিউলটি https://github.com/DPbox/djinni.git Deps / djinni গিট সাবমডিউল আপডেট --init - পুনরুক্তি যোগ করুন

আপনার .djinni ইন্টারফেসের বর্ণনা ফাইলটি তৈরি করুন, উদাহরণস্বরূপ:

প্রশ্ন = রেকর্ড {আইডি: স্ট্রিং; শিরোনাম: স্ট্রিং; অর্ডার: আই 32; }
পৃষ্ঠা = রেকর্ড {আইডি: স্ট্রিং; শিরোনাম: স্ট্রিং; অর্ডার: আই 32; প্রশ্ন: তালিকা ; }
ফর্ম = রেকর্ড {আইডি: স্ট্রিং; নাম: স্ট্রিং; পৃষ্ঠা: তালিকা ; }
শেয়ারড_কোরি = ইন্টারফেস + সি {স্ট্যাটিক তৈরি (): শেয়ারড_কোর; ফর্ম উত্পন্ন করুন (পৃষ্ঠাগুলির সংখ্যা: i32, প্রশ্ন_pro_page: i32): ফর্ম; উপসর্গ-স্ট্রিং (ইনপুট: স্ট্রিং): স্ট্রিং; }

ইউজার ইন্টারফেসের বর্ণনাটি বেশ সহজ: আমাদের তিনটি ডেটা সেট রয়েছে যা একটি একক নেস্টেড ডেটা কাঠামো নিয়ে গঠিত: একটি ফর্মটিতে বেশ কয়েকটি প্রশ্ন সহ কয়েকটি পৃষ্ঠা রয়েছে।

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

পরবর্তী পদক্ষেপটি হ'ল একটি শেল স্ক্রিপ্ট তৈরি করা যা উপরের .djinni ফাইলটিকে ইনপুট হিসাবে গ্রহণ করবে এবং আমাদের জন্য সমস্ত ব্রিজিং কোড উত্পন্ন করবে। .Sh ফাইলটি দেখতে এমন দেখাচ্ছে:

#! / usr / বিন / এনভ বাশ
### কাঠামো # জিনি আইডিএল ফাইলের অবস্থান ডিজিনি_ফাইলে = "ডেমো.ডিজিনি" # সিআর + উত্পাদিত এসসিআর নেমস্পেসের জন্য নেমস্পেস = "ডেমো" # উত্পন্ন-সি শ্রেণীর নাম উপসর্গ উত্পন্ন উত্স কোডের জন্য আবজক_প্রিফিক্স = "এসসি" # জাভা প্যাকেজের নাম উত্পন্ন উত্স কোডের জন্য জাভা_প্যাকেজ = "com.safetycल्चर.ডেমো"
### স্ক্রিপ্ট # বেস ডিরেক্টরিটি পাবেন বেস_ডির = $ (সিডি "ir dirname" 0 "` "&&ww) # প্যাকেজ নাম জাভা_ডির = $ (ইকো $ জাভা_প্যাকেজ | টিআর। /) থেকে জাভা ডিরেক্টরি পান # আউটপুট ডিরেক্টরি উত্পন্ন করার জন্য উত্স কোড সিপিপিআউট = "$ বেস_ডির / জেনারেট-এসসিআর / সিপিপি" আপত্তি_আউট = "$ বেস_ডির / জেনারেট-এসসিআর / আইজেসি" জনি_আউট = "$ বেস_ডির / জেনারেট-এসসিআর / জনি" জাভা_আউট = "_ বেস_ডির / জেনারেট-এসসিআর / জাভা / $ java_dir "# ক্লিন জেনারেটড এসআরসি ডায়ারস আরএম -rf $ সিপিপি_আউট আরএম-আরএফ ni জনি_আউট আরএম -rf $জেজক_আউট আরএম-আরএফ $ জাভা_আউট # কমান্ডটি চালান ডিজনি ডিপ্স / ডিজনি / এসসিআর / চালান \ - জাভা-আউট $ জাভা_আউট \ - java- প্যাকেজ $ java_package \ - জরিপ-জাভা-ক্ষেত্র mFooBar \ --cpp-out $ cpp_out \ --cpp-Namespace $ নেমস্পেস \ - jni-আউট $ jni_out \ - নিখরচত-জনি-শ্রেণি NativeFooBar \ - পরিচয়-জনি-ফাইল নেটিভফুবার \ --objc-out $ objc_out \ --objc-type-উপসর্গ $জেজক_প্রিফিক্স \ --objcpp-out $ objc_out \ --idl $ djinni_file

এই লিপিটি শুরুতে যুক্ত ডিজনি সাবমডিউলের উপর নির্ভর করে। সুতরাং আপনি এটি করেছেন তা নিশ্চিত করুন। আপনি একবার এই স্ক্রিপ্টটি চালনা করলে উত্পন্ন-এসসিআর নামে একটি নতুন ডিরেক্টরি উপস্থিত হবে। এটিতে চারটি সাব-ডাইরেক্টরি রয়েছে: সিপিপি, আইজিকি, জনি, জাভা যা আপনার আইওএস বা অ্যান্ড্রয়েড প্রকল্পের জন্য আপনার প্রয়োজনীয় সমস্ত কোড ধারণ করে।

কোনও আইওএস প্রকল্পের জন্য দিনজিনি উত্পন্ন কোডটি সংকলন করতে:

  1. প্ল্যাটফর্ম / আইওএস নামে একটি ডিরেক্টরি তৈরি করুন এবং এতে আপনার আইওএস প্রকল্প তৈরি করুন।
  2. আপনার আইওএস প্রকল্পে Deps / djinni / সমর্থন-lib / objc, উত্পন্ন-src / obc, এবং উত্পন্ন- src / cpp এ ফাইল যুক্ত করুন। অনুলিপি বিকল্প ব্যবহার করবেন না।
  3. আপনার আইওএস প্রকল্পের মেইন.এম ফাইলটির নাম পরিবর্তন করুন। এটি একটি উদ্দেশ্য-সি ++ ফাইল তৈরি করবে।

আপনি যখন কাজটি শেষ করেন, ত্রুটি ছাড়াই আপনার প্রকল্পটি তৈরি করতে সক্ষম হওয়া উচিত।

এখন কোড লেখা শুরু করা যাক। "শেয়ার্ড" নামের একটি ডিরেক্টরি তৈরি করুন এবং "শেয়ারড_কোয়ার_আইপিএলএইচপি" এবং "শেয়ারড_কোর_আইপিএল.সিপি" নামে দুটি ফাইল তৈরি করুন। এখানে আমরা আমাদের ভাগ করা কোডটি সি ++ তে লিখি। আপনার আইওএস প্রকল্পে এই দুটি ফাইল যুক্ত করতে ভুলবেন না।

শিরোনামের ফাইলটি ভাগ করা_কোরি_আইএমপিএইচপি এইরকম দেখাচ্ছে:

# "শেয়ারড_কোর্। hpp" অন্তর্ভুক্ত করুন
নেমস্পেস ডেমো {শ্রেণি SharedCoreImpl: পাবলিক ডেমো :: SharedCore {সর্বজনীন: SharedCoreImpl (); ফর্ম জেনারেট_ফর্ম (পৃষ্ঠাগুলির সংখ্যা 32_t, int32_t প্রশ্ন_পার_পেজ); স্ট্যান্ড :: স্ট্রিং প্রিফিক্স_স্ট্রিং (কনস্ট স্ট্যান্ড :: স্ট্রিং এবং ইনপুট); }; }

এটি করার জন্য, আমরা SharedCoreImpl নামে একটি নতুন শ্রেণি তৈরি করি যা SharedCore ইন্টারফেস প্রয়োগ করে। আমি এখানে সম্পূর্ণ বাস্তবায়ন কোড পোস্ট করতে যাচ্ছি না, তবে যুক্তিটি বেশ সহজ। জেনারেট_ফর্ম পদ্ধতিটি 2 পূর্ণসংখ্যার পরামিতি নেয়, একটি ফর্ম অবজেক্ট উত্পন্ন করে এবং পরামিতিগুলির মাধ্যমে প্রদত্ত পৃষ্ঠাগুলির সংখ্যা এবং প্রশ্নের সাথে এটি প্রদান করে। উপসর্গ_ স্ট্রিংটি যে কোনও ইনপুট স্ট্রিংয়ের সামনে কেবল একটি হ্যালো রাখে এবং নতুন স্ট্রিংটি দেয়।

কোনও আইওএস প্রকল্পে আপনার সি ++ কোডটি ব্যবহার করা সত্যিই সহজ। এখানে একটি দ্রুত উদাহরণ:

# আইম্পোর্ট "ভিউকন্ট্রোল.আর" # ইমপোর্ট "এসসিএসরেডকোর্স।" "@ অভ্যন্তরীণ ভিউকন্ট্রোলার () @ প্রপার্টি (অ-পারমাণবিক, শক্তিশালী) এসসিএসরেডকোর * কোরএপিআই; @ কার্যকরকরণ ভিউ কন্ট্রোলার - (শূন্য) ভিউডিডলড {[সুপার ভিউডিডলড]; _coreAPI = [এসসিএস শেয়ার্ড কোর তৈরি করুন]; }
- (অকার্যকর) জেনারেটফর্ম () {// জেনারেট ফর্মটিতে 500.0000 টি প্রশ্ন রয়েছে এসসিএফর্ম * ফর্ম = [_কোরাপি জেনারেটফর্ম: 500 প্রশ্নপর্ব: 1000]; } @ শেষ

এটাই! খুব কঠিন না, তাই না? অ্যান্ড্রয়েডে সেটআপ প্রক্রিয়াটি কিছুটা আলাদা। আপনার উত্পন্ন জেএনআই এবং জাভা কোড উভয়ই আমদানি করতে হবে। ধারণাটি একই, তবে: স্বয়ংক্রিয়ভাবে উত্পাদিত শিরোনাম আমদানি করুন এবং আপনার প্রকল্পে সি ++ বাস্তবায়ন কোড যুক্ত করুন। এ কারণে, আমাদের এই সি ++ ফাইলগুলি আইওএস বা অ্যান্ড্রয়েড প্রকল্পের বাইরে একটি ভাগ করা ডিরেক্টরিতে রাখতে হবে।

আর্কিটেকচার

এটি আর্কিটেকচার ডায়াগ্রাম যা আমরা শেষ পর্যন্ত জিনিকে ব্যবহার করব।

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

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

প্ল্যাটফর্ম মিথস্ক্রিয়া

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

প্ল্যাটফর্ম ইন্টারফেসের এখানে একটি ভাল উদাহরণ:

ui_platform_support = ইন্টারফেস + ও + জ {পোস্ট_টাস্ক_ইন_ব্যাকগ্রাউন্ড_থ্রেড (টাস্ক: টাস্ক); post_task_in_main_thread (টাস্ক: টাস্ক); }

এখানে আমরা প্রতিটি প্ল্যাটফর্ম থেকে বিদ্যমান সম্মতি / থ্রেডিং এপিআই ব্যবহার করি। নিম্নলিখিত চিত্রটি দেখায় যে কীভাবে ব্যবহারকারীর ইন্টারফেস প্ল্যাটফর্ম এপিআইয়ের সাথে যোগাযোগ করে:

নেটওয়ার্কিং

প্রথম আর্কিটেকচার ডায়াগ্রামে যেমন দেখানো হয়েছে, অবিচ্ছিন্ন স্তরটি কোথায় যেতে হবে তা সিদ্ধান্ত নেওয়ার জন্য দায়বদ্ধ। আমরা বিশ্বাস করি যে ব্যাকএন্ড এপিআই হ'ল ডিস্ক স্পেসের সমান, যা আমাদের ডেটা পড়তে এবং লেখার জন্য আরও একটি উত্স। ব্যাকএন্ডের সাথে ইন্টারঅ্যাক্ট করার জন্য আমরা জিআরপিসিটি আমাদের নেটওয়ার্ক প্রোটোকল হিসাবে ব্যবহার করি। মোবাইল অ্যাপ্লিকেশনগুলির জন্য জিআরপিসি ব্যবহারের অসংখ্য সুবিধা রয়েছে। ভবিষ্যতে আমাদের আরও একটি ব্লগ পোস্ট থাকবে have তবে আপনি যদি সি ++ ব্যবহার করে those সমস্ত HTTP কলগুলি না লিখতে চান তবে স্থির স্তরটিতে আপনার প্ল্যাটফর্ম নেটওয়ার্ক প্রয়োগের প্রচার করা এখনও সম্ভব।

আমরা যা শিখেছি

সি ++ তেমন ভীতিকর নয়

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

প্রয়োজনীয় প্রচেষ্টা নোট করুন

আইওএসের জন্য ব্রিজের জন্য ওভারহেডের সামান্য পরিমাণ নেই কারণ সি ++ ডেটা স্ট্রাকচার অবজেক্টিভ-সি (অবজেক্টিভ-সি ++) এর কাছে অপরিচিত নয়। তবে, জিনি হুডের নীচে জেএনআই ব্যবহার করে অ্যান্ড্রয়েডের জন্য একটি উল্লেখযোগ্য পারফরম্যান্স হিট হয়েছে। ডেটা স্ট্রাকচার মার্শালিং এবং সি ++ এবং জাভার মধ্যে আন মার্শালিং তাই ব্যয়বহুল ক্রিয়াকলাপ। যদি আপনার অ্যাপ্লিকেশনটিকে সেতুর উপর দিয়ে প্রচুর পরিমাণে কাঠামোগত ডেটা প্রেরণের প্রয়োজন হয় এবং গতি একটি উদ্বেগজনক বিষয় হয় তবে আপনার বিকল্পগুলি যেমন: খ। কাঠামোগত তথ্যের পরিবর্তে বাইনারি ডেটা ফর্ম্যাটগুলি (উদাঃ ফ্ল্যাট বাফারস) পাঠানো ক্রস প্ল্যাটফর্ম।

অতিরিক্ত সেটআপ পদক্ষেপ প্রয়োজন

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

এটাই! আমরা এখনও মোবাইল দলে এই নতুন আর্কিটেকচার যুক্ত করার প্রক্রিয়াতে রয়েছি। আমরা আমাদের অভিজ্ঞতা এই পথে এগিয়ে চলব।

আপনার কি ক্রস-প্ল্যাটফর্ম মোবাইল অ্যাপ্লিকেশন তৈরির অভিজ্ঞতা আছে? আমাদের ইঞ্জিনিয়ারিং দলে যোগদান করুন এবং আমাদের পণ্যগুলিকে প্রভাবিত করুন যা জীবনকে প্রভাবিত করে।