অ্যাপ আর্কিটেকচারের জন্য গাইড

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

অ্যাপ রচনা

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

একটি অ্যাপের ইউজার ইন্টারফেসও একটি উপাদান। ঐতিহাসিকভাবে, UI গুলি একাধিক কার্যকলাপ ব্যবহার করে তৈরি করা হয়েছিল। তবে, আধুনিক অ্যাপগুলি একটি একক-কার্যকলাপ স্থাপত্য ব্যবহার করে। একটি একক Activity টুকরো বা জেটপ্যাক কম্পোজ গন্তব্য হিসাবে বাস্তবায়িত স্ক্রিনগুলির জন্য একটি ধারক হিসাবে কাজ করে।

একাধিক ফর্ম ফ্যাক্টর

অ্যাপগুলি একাধিক ফর্ম ফ্যাক্টরের উপর চলতে পারে, যার মধ্যে কেবল ফোনই নয়, ট্যাবলেট, ফোল্ডেবল, ChromeOS ডিভাইস এবং আরও অনেক কিছু অন্তর্ভুক্ত। একটি অ্যাপ কোনও পোর্ট্রেট বা ল্যান্ডস্কেপ ওরিয়েন্টেশন ধরে নিতে পারে না। ডিভাইস ঘূর্ণন বা ফোল্ডেবল ডিভাইস ভাঁজ করা এবং উন্মোচন করার মতো কনফিগারেশন পরিবর্তনগুলি আপনার অ্যাপটিকে তার UI পুনরায় কম্পোজ করতে বাধ্য করে, যা অ্যাপের ডেটা এবং অবস্থাকে প্রভাবিত করে।

সম্পদের সীমাবদ্ধতা

মোবাইল ডিভাইসগুলি—এমনকি বড় স্ক্রিনের ডিভাইসগুলিও—সংস্থানের সীমাবদ্ধতায় ভুগছে, তাই যেকোনো সময়, অপারেটিং সিস্টেম কিছু অ্যাপ প্রক্রিয়া বন্ধ করে নতুন অ্যাপের জন্য জায়গা করে দিতে পারে।

পরিবর্তনশীল লঞ্চ শর্তাবলী

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

সাধারণ স্থাপত্য নীতি

যদি আপনি অ্যাপ্লিকেশন ডেটা সংরক্ষণ এবং স্টেট করার জন্য অ্যাপ উপাদান ব্যবহার করতে না পারেন, তাহলে আপনার অ্যাপটি কীভাবে ডিজাইন করা উচিত?

অ্যান্ড্রয়েড অ্যাপের আকার বাড়ার সাথে সাথে, এমন একটি আর্কিটেকচার সংজ্ঞায়িত করা গুরুত্বপূর্ণ যা অ্যাপটিকে স্কেল করতে দেয়। একটি সু-নকশিত অ্যাপ আর্কিটেকচার অ্যাপের অংশগুলির মধ্যে সীমানা এবং প্রতিটি অংশের দায়িত্ব নির্ধারণ করে।

উদ্বেগের বিচ্ছেদ

কয়েকটি নির্দিষ্ট নীতি অনুসরণ করে আপনার অ্যাপ আর্কিটেকচার ডিজাইন করুন।

সবচেয়ে গুরুত্বপূর্ণ নীতি হল উদ্বেগের বিচ্ছেদ । আপনার সমস্ত কোড একটি Activity বা একটি Fragment লেখা একটি সাধারণ ভুল।

একটি Activity বা Fragment প্রধান ভূমিকা হল আপনার অ্যাপের UI হোস্ট করা। অ্যান্ড্রয়েড ওএস তাদের জীবনচক্র নিয়ন্ত্রণ করে, প্রায়শই ব্যবহারকারীর স্ক্রিন ঘূর্ণন বা কম মেমোরির মতো সিস্টেম ইভেন্টের প্রতিক্রিয়ায় সেগুলিকে ধ্বংস এবং পুনরায় তৈরি করে।

এই ক্ষণস্থায়ী প্রকৃতি এগুলিকে অ্যাপ্লিকেশন ডেটা বা স্টেট ধরে রাখার জন্য অনুপযুক্ত করে তোলে। যদি আপনি কোনও Activity বা Fragment এ ডেটা সংরক্ষণ করেন, তাহলে কম্পোনেন্টটি পুনরায় তৈরি করার সময় সেই ডেটা হারিয়ে যাবে। ডেটা স্থায়িত্ব নিশ্চিত করতে এবং একটি স্থিতিশীল ব্যবহারকারীর অভিজ্ঞতা প্রদান করতে, এই UI কম্পোনেন্টগুলিতে state অর্পণ করবেন না।

অভিযোজিত লেআউট

আপনার অ্যাপটি কনফিগারেশন পরিবর্তনগুলি, যেমন ডিভাইস ওরিয়েন্টেশন পরিবর্তন বা অ্যাপ উইন্ডোর আকার পরিবর্তন, সুন্দরভাবে পরিচালনা করবে। বিভিন্ন ফর্ম ফ্যাক্টরের উপর সর্বোত্তম ব্যবহারকারীর অভিজ্ঞতা প্রদানের জন্য অভিযোজিত ক্যানোনিকাল লেআউটগুলি বাস্তবায়ন করুন।

ডেটা মডেল থেকে ড্রাইভ UI

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

নিম্নলিখিত কারণে স্থায়ী মডেলগুলি আদর্শ:

  • রিসোর্স খালি করার জন্য অ্যান্ড্রয়েড ওএস আপনার অ্যাপটি ধ্বংস করলেও ব্যবহারকারীরা ডেটা হারাবেন না।

  • যখন কোনও নেটওয়ার্ক সংযোগ বিরতিহীন বা অনুপলব্ধ থাকে তখন আপনার অ্যাপটি কাজ করতে থাকে।

আপনার অ্যাপটিকে শক্তিশালী এবং পরীক্ষাযোগ্য করে তুলতে ডেটা মডেল ক্লাসের উপর ভিত্তি করে আপনার অ্যাপ আর্কিটেকচার তৈরি করুন।

সত্যের একক উৎস

যখন আপনার অ্যাপে একটি নতুন ডেটা টাইপ সংজ্ঞায়িত করা হয়, তখন আপনার এটিতে একটি একক সত্যের উৎস (SSOT) নির্ধারণ করা উচিত। SSOT হল সেই ডেটার মালিক , এবং শুধুমাত্র SSOT এটিকে পরিবর্তন বা পরিবর্তন করতে পারে। এটি অর্জনের জন্য, SSOT একটি অপরিবর্তনীয় টাইপ ব্যবহার করে ডেটা প্রকাশ করে; ডেটা পরিবর্তন করার জন্য, SSOT এমন ফাংশন প্রকাশ করে বা ইভেন্ট গ্রহণ করে যা অন্য ধরণের কল করতে পারে।

এই প্যাটার্নের একাধিক সুবিধা রয়েছে:

  • একটি নির্দিষ্ট ধরণের ডেটাতে সমস্ত পরিবর্তন এক জায়গায় কেন্দ্রীভূত করে
  • ডেটা সুরক্ষিত রাখে যাতে অন্য কোনও ধরণের ডেটার সাথে হস্তক্ষেপ না করতে পারে
  • ডেটাতে পরিবর্তনগুলি আরও সন্ধানযোগ্য করে তোলে এবং তাই, বাগগুলি সনাক্ত করা সহজ হয়

একটি অফলাইন-প্রথম অ্যাপ্লিকেশনে, অ্যাপ্লিকেশন ডেটার সত্যের উৎস সাধারণত একটি ডাটাবেস। অন্য কিছু ক্ষেত্রে, সত্যের উৎস একটি ViewModel হতে পারে।

একমুখী তথ্য প্রবাহ

সত্যের একক উৎস নীতিটি প্রায়শই একমুখী ডেটা প্রবাহ (UDF) প্যাটার্নের সাথে ব্যবহৃত হয়। UDF-তে, অবস্থা শুধুমাত্র এক দিকে প্রবাহিত হয়, সাধারণত প্যারেন্ট কম্পোনেন্ট থেকে চাইল্ড কম্পোনেন্টে। যে ঘটনাগুলি ডেটা প্রবাহকে বিপরীত দিকে পরিবর্তন করে।

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

এই প্যাটার্নটি ডেটার ধারাবাহিকতা আরও ভালোভাবে বজায় রাখে, ত্রুটির সম্ভাবনা কম, ডিবাগ করা সহজ এবং SSOT প্যাটার্নের সমস্ত সুবিধা প্রদান করে।

সাধারণ স্থাপত্য নীতি বিবেচনা করে, প্রতিটি প্রয়োগে কমপক্ষে দুটি স্তর থাকা উচিত:

  • UI স্তর: স্ক্রিনে অ্যাপ্লিকেশন ডেটা প্রদর্শন করে
  • ডেটা স্তর: আপনার অ্যাপের ব্যবসায়িক যুক্তি ধারণ করে এবং অ্যাপ্লিকেশন ডেটা প্রকাশ করে।

UI এবং ডেটা স্তরগুলির মধ্যে মিথস্ক্রিয়া সহজ এবং পুনঃব্যবহারের জন্য আপনি ডোমেন স্তর নামে একটি অতিরিক্ত স্তর যুক্ত করতে পারেন।

একটি সাধারণ অ্যাপ আর্কিটেকচারে, UI স্তরটি ডেটা স্তর থেকে অথবা ঐচ্ছিক ডোমেন স্তর থেকে অ্যাপ্লিকেশন ডেটা গ্রহণ করে, যা UI স্তর এবং ডেটা স্তরের মধ্যে অবস্থিত।
চিত্র ১. একটি সাধারণ অ্যাপ আর্কিটেকচারের চিত্র।

আধুনিক অ্যাপ আর্কিটেকচার

একটি আধুনিক অ্যান্ড্রয়েড অ্যাপ আর্কিটেকচার নিম্নলিখিত কৌশলগুলি ব্যবহার করে (অন্যান্যগুলির মধ্যে):

  • অভিযোজিত এবং স্তরযুক্ত স্থাপত্য
  • অ্যাপের সকল স্তরে একমুখী ডেটা প্রবাহ (UDF)
  • UI এর জটিলতা পরিচালনা করার জন্য রাষ্ট্রীয় ধারকদের সাথে UI স্তর
  • কোরোটিন এবং প্রবাহ
  • নির্ভরতা ইনজেকশনের সর্বোত্তম অনুশীলন

আরও তথ্যের জন্য, অ্যান্ড্রয়েড আর্কিটেকচারের জন্য সুপারিশ দেখুন।

UI স্তর

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

UI স্তরে দুই ধরণের গঠন থাকে:

  • UI উপাদানগুলি যা স্ক্রিনে ডেটা রেন্ডার করে। আপনি অ্যাডাপ্টিভ লেআউটগুলিকে সমর্থন করার জন্য Jetpack Compose ফাংশন ব্যবহার করে এই উপাদানগুলি তৈরি করেন।
  • স্টেট হোল্ডার (যেমন ViewModel ) যারা ডেটা ধরে রাখে, UI-তে প্রকাশ করে এবং লজিক পরিচালনা করে
একটি সাধারণ স্থাপত্যে, UI স্তরের UI উপাদানগুলি স্টেট হোল্ডারদের উপর নির্ভর করে, যা পরবর্তীতে ডেটা স্তর অথবা ঐচ্ছিক ডোমেন স্তরের ক্লাসের উপর নির্ভর করে।
চিত্র ২। অ্যাপ আর্কিটেকচারে UI স্তরের ভূমিকা।

অভিযোজিত UI-এর ক্ষেত্রে, ViewModel অবজেক্টের মতো স্টেট হোল্ডাররা UI স্টেট প্রকাশ করে যা বিভিন্ন উইন্ডো সাইজ ক্লাসের সাথে খাপ খায়। আপনি এই UI স্টেটটি বের করতে currentWindowAdaptiveInfo() ব্যবহার করতে পারেন। NavigationSuiteScaffold মতো উপাদানগুলি তখন উপলব্ধ স্ক্রিন স্পেসের উপর ভিত্তি করে বিভিন্ন নেভিগেশন প্যাটার্নের (যেমন, NavigationBar , NavigationRail , অথবা NavigationDrawer ) মধ্যে স্বয়ংক্রিয়ভাবে স্যুইচ করতে এই তথ্য ব্যবহার করতে পারে।

আরও জানতে, UI স্তর পৃষ্ঠাটি দেখুন।

ডেটা স্তর

একটি অ্যাপের ডেটা লেয়ারে থাকে ব্যবসায়িক লজিক । ব্যবসায়িক লজিকই আপনার অ্যাপকে মূল্য দেয়—এতে এমন নিয়ম রয়েছে যা নির্ধারণ করে যে আপনার অ্যাপ কীভাবে ডেটা তৈরি করে, সঞ্চয় করে এবং পরিবর্তন করে।

ডেটা লেয়ারটি রিপোজিটরি দিয়ে তৈরি যার প্রতিটিতে শূন্য থেকে একাধিক ডেটা সোর্স থাকতে পারে। আপনার অ্যাপে হ্যান্ডেল করা প্রতিটি ভিন্ন ধরণের ডেটার জন্য আপনার একটি রিপোজিটরি ক্লাস তৈরি করা উচিত। উদাহরণস্বরূপ, আপনি সিনেমা সম্পর্কিত ডেটার জন্য একটি MoviesRepository ক্লাস বা পেমেন্ট সম্পর্কিত ডেটার জন্য একটি PaymentsRepository ক্লাস তৈরি করতে পারেন।

একটি সাধারণ স্থাপত্যে, ডেটা লেয়ারের রিপোজিটরিগুলি অ্যাপের বাকি অংশে ডেটা সরবরাহ করে এবং ডেটা উৎসের উপর নির্ভর করে।
চিত্র ৩। অ্যাপ আর্কিটেকচারে ডেটা লেয়ারের ভূমিকা।

রিপোজিটরি ক্লাসগুলি নিম্নলিখিতগুলির জন্য দায়ী:

  • অ্যাপের বাকি অংশে ডেটা প্রকাশ করা হচ্ছে
  • তথ্যের পরিবর্তনগুলিকে কেন্দ্রীভূত করা
  • একাধিক তথ্য উৎসের মধ্যে দ্বন্দ্ব সমাধান করা
  • অ্যাপের বাকি অংশ থেকে তথ্যের উৎসগুলি বিমূর্ত করা
  • ব্যবসায়িক যুক্তি ধারণকারী

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

আরও জানতে, ডেটা স্তর পৃষ্ঠাটি দেখুন।

ডোমেন স্তর

ডোমেন স্তরটি UI এবং ডেটা স্তরগুলির মধ্যে একটি ঐচ্ছিক স্তর।

ডোমেন স্তরটি জটিল ব্যবসায়িক লজিক বা একাধিক ভিউ মডেল দ্বারা পুনঃব্যবহৃত সহজ ব্যবসায়িক লজিককে ধারণ করার জন্য দায়ী। ডোমেন স্তরটি ঐচ্ছিক কারণ সমস্ত অ্যাপের এই প্রয়োজনীয়তাগুলি থাকে না। জটিলতা পরিচালনা করতে বা পুনঃব্যবহারযোগ্যতার পক্ষে হলে কেবল প্রয়োজনের সময় এটি ব্যবহার করুন।

যখন এটি অন্তর্ভুক্ত করা হয়, তখন ঐচ্ছিক ডোমেন স্তরটি UI স্তরের উপর নির্ভরশীলতা প্রদান করে এবং ডেটা স্তরের উপর নির্ভর করে।
চিত্র ৪। অ্যাপ আর্কিটেকচারে ডোমেন স্তরের ভূমিকা।

ডোমেন লেয়ারের ক্লাসগুলিকে সাধারণত ইউজ কেস বা ইন্টারেক্টর বলা হয়। প্রতিটি ইউজ কেসের একটি একক কার্যকারিতার জন্য দায়িত্ব থাকা উচিত। উদাহরণস্বরূপ, যদি একাধিক ভিউ মডেল স্ক্রিনে সঠিক বার্তা প্রদর্শনের জন্য টাইম জোনের উপর নির্ভর করে তবে আপনার অ্যাপে একটি GetTimeZoneUseCase ক্লাস থাকতে পারে।

আরও জানতে, ডোমেন স্তর পৃষ্ঠাটি দেখুন।

উপাদানগুলির মধ্যে নির্ভরতা পরিচালনা করুন

আপনার অ্যাপের ক্লাসগুলি সঠিকভাবে কাজ করার জন্য অন্যান্য ক্লাসের উপর নির্ভর করে। একটি নির্দিষ্ট ক্লাসের নির্ভরতা সংগ্রহ করতে আপনি নিম্নলিখিত ডিজাইন প্যাটার্নগুলির যেকোনো একটি ব্যবহার করতে পারেন:

  • ডিপেন্ডেন্সি ইনজেকশন (DI) : ডিপেন্ডেন্সি ইনজেকশন ক্লাসগুলিকে তাদের ডিপেন্ডেন্সি তৈরি না করেই সংজ্ঞায়িত করতে দেয়। রানটাইমে, অন্য একটি ক্লাস এই ডিপেন্ডেন্সিগুলি প্রদানের জন্য দায়ী।
  • সার্ভিস লোকেটার : সার্ভিস লোকেটার প্যাটার্ন এমন একটি রেজিস্ট্রি প্রদান করে যেখানে ক্লাসগুলি তাদের নির্ভরতা তৈরি করার পরিবর্তে তাদের তথ্য সংগ্রহ করতে পারে।

এই প্যাটার্নগুলি আপনাকে আপনার কোড স্কেল করার অনুমতি দেয় কারণ এগুলি কোডের নকল বা জটিলতা যোগ না করে নির্ভরতা পরিচালনার জন্য স্পষ্ট প্যাটার্ন প্রদান করে। প্যাটার্নগুলি আপনাকে পরীক্ষা এবং উৎপাদন বাস্তবায়নের মধ্যে দ্রুত স্যুইচ করার অনুমতি দেয়।

সাধারণ সর্বোত্তম অনুশীলন

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

যদিও নিম্নলিখিত সুপারিশগুলি বাধ্যতামূলক নয়, বেশিরভাগ ক্ষেত্রেই সেগুলি অনুসরণ করলে আপনার কোডবেস আরও শক্তিশালী, পরীক্ষাযোগ্য এবং রক্ষণাবেক্ষণযোগ্য হয়ে ওঠে।

অ্যাপের উপাদানগুলিতে ডেটা সংরক্ষণ করবেন না।

আপনার অ্যাপের এন্ট্রি পয়েন্টগুলিকে—যেমন কার্যকলাপ, পরিষেবা এবং সম্প্রচার রিসিভারগুলিকে—ডেটার উৎস হিসেবে মনোনীত করা এড়িয়ে চলুন। এন্ট্রি পয়েন্টগুলিকে কেবলমাত্র অন্যান্য উপাদানের সাথে সমন্বয় করে সেই এন্ট্রি পয়েন্টের সাথে প্রাসঙ্গিক ডেটার উপসেট পুনরুদ্ধার করা উচিত। প্রতিটি অ্যাপ উপাদান স্বল্পস্থায়ী হয়, যা ব্যবহারকারীর ডিভাইসের সাথে মিথস্ক্রিয়া এবং সিস্টেমের ক্ষমতার উপর নির্ভর করে।

অ্যান্ড্রয়েড ক্লাসের উপর নির্ভরতা হ্রাস করুন।

আপনার অ্যাপ কম্পোনেন্টগুলিই একমাত্র ক্লাস হওয়া উচিত যা Context বা Toast এর মতো Android ফ্রেমওয়ার্ক SDK API-এর উপর নির্ভর করে। অ্যাপ কম্পোনেন্টগুলি থেকে আপনার অ্যাপের অন্যান্য ক্লাসগুলিকে আলাদা করে রাখলে টেস্টেবিলিটি বৃদ্ধি পাবে এবং আপনার অ্যাপের মধ্যে সংযোগ হ্রাস পাবে।

আপনার অ্যাপের মডিউলগুলির মধ্যে দায়িত্বের স্পষ্ট সীমানা নির্ধারণ করুন।

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

প্রতিটি মডিউল থেকে যতটা সম্ভব কম প্রকাশ করুন।

অভ্যন্তরীণ বাস্তবায়নের বিশদ বিবরণ প্রকাশ করে এমন শর্টকাট তৈরি করবেন না। স্বল্পমেয়াদে আপনি কিছুটা সময় পেতে পারেন, কিন্তু আপনার কোডবেস বিকশিত হওয়ার সাথে সাথে আপনাকে অনেক গুণ বেশি প্রযুক্তিগত ঋণ বহন করতে হবে।

আপনার অ্যাপের অনন্য মূল বিষয়টির উপর মনোযোগ দিন যাতে এটি অন্যান্য অ্যাপ থেকে আলাদাভাবে দেখা যায়।

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

ক্যানোনিকাল লেআউট এবং অ্যাপ ডিজাইন প্যাটার্ন ব্যবহার করুন।

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

কনফিগারেশন পরিবর্তনের সময় UI অবস্থা সংরক্ষণ করুন।

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

পুনর্ব্যবহারযোগ্য এবং সংযোজনযোগ্য UI উপাদান ডিজাইন করুন।

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

আপনার অ্যাপের প্রতিটি অংশকে আলাদাভাবে পরীক্ষাযোগ্য করে তোলার পদ্ধতি বিবেচনা করুন।

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

প্রকারগুলি তাদের সমকালীন নীতির জন্য দায়ী।

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

যতটা সম্ভব প্রাসঙ্গিক এবং তাজা তথ্য সংরক্ষণ করুন।

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

স্থাপত্যের সুবিধা

আপনার অ্যাপে একটি ভালো আর্কিটেকচার বাস্তবায়িত হলে প্রকল্প এবং ইঞ্জিনিয়ারিং টিমের জন্য অনেক সুবিধা বয়ে আনবে:

  • সামগ্রিক অ্যাপের রক্ষণাবেক্ষণযোগ্যতা, গুণমান এবং দৃঢ়তা উন্নত করে।
  • অ্যাপটিকে স্কেল করার অনুমতি দেয়। আরও বেশি লোক এবং আরও বেশি দল একই কোডবেসে অবদান রাখতে পারে, ন্যূনতম কোড দ্বন্দ্বের সাথে।
  • অনবোর্ডিংয়ে সাহায্য করে। যেহেতু স্থাপত্য আপনার প্রকল্পে ধারাবাহিকতা আনে, তাই দলের নতুন সদস্যরা দ্রুত গতিতে কাজ শুরু করতে পারে এবং কম সময়ে আরও দক্ষ হতে পারে।
  • পরীক্ষা করা সহজ। একটি ভালো স্থাপত্য সহজ ধরণের জিনিসপত্র তৈরিতে উৎসাহিত করে, যা সাধারণত পরীক্ষা করা সহজ।
  • সুনির্দিষ্ট প্রক্রিয়ার মাধ্যমে পদ্ধতিগতভাবে বাগগুলি তদন্ত করা যেতে পারে।

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

নমুনা

নিম্নলিখিত নমুনাগুলি ভালো অ্যাপ আর্কিটেকচার প্রদর্শন করে: