অ্যাপ্লিকেশন আর্কিটেকচার হল কোড সংগঠিত করার একটি উপায় যাতে এটি বিকাশ, পরীক্ষা এবং পরিবর্তন করা সহজ হয়। ডিজাইন প্যাটার্ন হল সাধারণ সমস্যার প্রমাণিত সমাধান। JetBrains Developer Ecosystem (2025) অনুসারে, 45% Android প্রকল্পে MVVM ব্যবহার করা হয়, MVC 28% এ এবং Clean Architecture 22% এ। আর্কিটেকচার বোঝা একজন শিক্ষানবিশ ডেভেলপারকে পেশাদার থেকে আলাদা করে।
মূল বিষয়
আর্কিটেকচারাল প্যাটার্ন নির্ধারণ করে কিভাবে অ্যাপ্লিকেশন ক্লাসগুলির মধ্যে দায়িত্ব বিতরণ করা হয়। প্যাটার্নের পছন্দ নতুন স্ক্রিন যুক্ত করা এবং কোড পরীক্ষা করার সহজতাকে প্রভাবিত করে।
MVC একটি ক্লাসিক প্যাটার্ন যেখানে Model ডেটা পরিচালনা করে, View প্রদর্শন পরিচালনা করে এবং Controller লজিক পরিচালনা করে। iOS এ, MVC ডিফল্ট (UIViewController); Android এ, Activity। নেতিবাচক দিক হল কন্ট্রোলার প্রায়শই "ভারী" (Massive View Controller) হয়ে যায়। iOS ডেভেলপারদের একটি জরিপ (Reddit, 2025) অনুসারে, 62% পুরানো প্রকল্পে অপাঠ্য কোডের প্রধান কারণ হিসেবে MVC কে উল্লেখ করে।
MVP ভিন্ন যে Presenter একটি ইন্টারফেসের মাধ্যমে View পরিচালনা করে, পরীক্ষাযোগ্যতা উন্নত করে। Jetpack এর আগে Android এ MVP জনপ্রিয় ছিল, কিন্তু সুবিধার দিক থেকে MVVM এর থেকে পিছিয়ে।
MVVM Google Android এর জন্য এবং Apple iOS এর জন্য সুপারিশকৃত প্যাটার্ন। ViewModel অবস্থা সংরক্ষণ করে, এবং View Data Binding বা @Published এর মাধ্যমে পরিবর্তনগুলিতে সাবস্ক্রাইব করে। ViewModel View এর উপর নির্ভর করে না এবং পরীক্ষা করা সহজ। IT Sectr এ, আমরা সব প্রকল্পে প্রধান প্যাটার্ন হিসাবে MVVM ব্যবহার করি।
MVI একটি প্রতিক্রিয়াশীল প্যাটার্ন যেখানে প্রতিটি কর্ম Intent → Model → View চক্র অনুসরণ করে। MVI পূর্বাভাসযোগ্য অবস্থা নিশ্চিত করে। VIPER পাঁচটি স্তর (View, Interactor, Presenter, Entity, Router) সহ একটি iOS প্যাটার্ন, যা সর্বোচ্চ বিচ্ছিন্নতা প্রদান করে কিন্তু অনেক বয়লারপ্লেট কোড প্রয়োজন।
Clean Architecture হল রবার্ট মার্টিনের ধারণা যা অ্যাপ্লিকেশনকে স্তরে বিভক্ত করে: বাইরের স্তরগুলি (UI, DB, নেটওয়ার্ক) ভিতরের স্তরগুলির (ব্যবসায়িক লজিক, সত্তা) উপর নির্ভর করে। মোবাইল ডেভেলপমেন্টে, Clean Architecture তিনটি স্তর অন্তর্ভুক্ত করে: data (রিপজিটরি), domain (Use Cases), এবং presentation (ViewModels, UI)।
Repository Pattern Clean Architecture এর একটি মূল উপাদান, যা ডেটা উত্সকে বিমূর্ত করে। রিপজিটরি সিদ্ধান্ত নেয় নেটওয়ার্ক বা স্থানীয় স্টোরেজ (Room, Core Data) থেকে ডেটা আনবে কিনা এবং একটি ইউনিফাইড ফর্ম্যাট ফেরত দেয়। Google (Architecture Guide, 2025) অনুসারে, নেটওয়ার্ক অনুরোধ সহ যেকোনো অ্যাপের জন্য Repository Pattern সুপারিশ করা হয়। Clean Architecture 3-5 স্ক্রিন বা তার বেশি প্রকল্পের জন্য ন্যায়সঙ্গত — সাধারণ অ্যাপের জন্য, MVVM দিয়ে শুরু করুন।
Singleton একটি আর্কিটেকচারাল প্যাটার্ন যা একটি ক্লাসের একক ইনস্ট্যান্স নিশ্চিত করে এবং এতে বিশ্বব্যাপী অ্যাক্সেস প্রদান করে। এটি ডাটাবেস, সেটিংস ম্যানেজার এবং ক্যাশের জন্য ব্যবহৃত হয়। Kotlin এ, এটি object এর মাধ্যমে তৈরি করা হয়। নেতিবাচক দিক হল এটি বিশ্বব্যাপী অবস্থার কারণে পরীক্ষাকে জটিল করে তোলে।
Factory অবজেক্ট তৈরি ফ্যাক্টরি পদ্ধতিতে অর্পণ করে — new এর পরিবর্তে, আপনি ফ্যাক্টরিকে কল করেন। Builder হল জটিল অবজেক্টের (AlertDialog.Builder, NotificationCompat.Builder) জন্য ধাপে ধাপে নির্মাণ প্যাটার্ন। Builder পাঠযোগ্যতা উন্নত করে এবং অবজেক্টগুলোকে একত্রিতকরণের পরে অপরিবর্তনীয় থাকতে দেয়।
Adapter একটি আর্কিটেকচারাল প্যাটার্ন যা একটি ক্লাসের ইন্টারফেসকে ক্লায়েন্টের প্রত্যাশিত ইন্টারফেসে রূপান্তর করে। Android এ, এটি RecyclerView.Adapter। Facade একটি জটিল সিস্টেমের জন্য সরলীকৃত ইন্টারফেস প্রদান করে — উদাহরণস্বরূপ, একটি API এর জন্য ফ্যাসাড যা প্রমাণীকরণের বিবরণ লুকিয়ে রাখে। Delegate একটি iOS প্যাটার্ন যেখানে একটি অবজেক্ট একটি কাজ অর্পণ করে (UITableViewDelegate)। Protocol Swift এ ইন্টারফেসের সমতুল্য।
Observer পরিবর্তনের জন্য সাবস্ক্রিপশন প্যাটার্ন: বিষয় সাবস্ক্রাইবারদের আপডেট সম্পর্কে জানায়। মোবাইল ডেভেলপমেন্টে, Observer হল LiveData, StateFlow, RxJava এবং Combine এর ভিত্তি। Strategy হল বিনিময়যোগ্য অ্যালগরিদমের প্যাটার্ন: আপনি একাধিক if-else বিবৃতি ছাড়াই একটি ভিন্ন কৌশল (সাজানো, বৈধতা) সংযুক্ত করেন।
Dependency Injection একটি আর্কিটেকচারাল প্যাটার্ন যেখানে একটি অবজেক্ট নিজে তৈরি করার পরিবর্তে বাইরে থেকে তার ডিপেন্ডেন্সি গ্রহণ করে। new Database() এর পরিবর্তে, আপনি কনস্ট্রাক্টরের মাধ্যমে ডাটাবেস পাস করেন। DI পরীক্ষাকে সহজ করে — আপনি বাস্তব ডাটাবেসের পরিবর্তে Mock ব্যবহার করতে পারেন — এবং বাস্তবায়ন অদলবদল করা সহজ করে। জনপ্রিয় DI ফ্রেমওয়ার্ক: Dagger এবং Hilt (Android), Swinject (iOS), Koin (Kotlin)। Hilt — Google দ্বারা সুপারিশকৃত Dagger এর উপর একটি র্যাপার — DI সেটআপ 3 গুণ কমিয়ে দেয়।
Service Locator ডিপেন্ডেন্সির একটি কেন্দ্রীয় নিবন্ধন সহ DI এর একটি বিকল্প। বাস্তবায়ন করা সহজ, কিন্তু এটি ক্লাস ডিপেন্ডেন্সি লুকিয়ে রাখে, পরীক্ষা কঠিন করে তোলে। আধুনিক প্রকল্প Hilt বা Koin এর মাধ্যমে DI পছন্দ করে।
Flutter এ, অবস্থা ব্যবস্থাপনা একটি নিজস্ব ইকোসিস্টেম। Redux — Actions → Reducer → State এর মাধ্যমে পরিবর্তন সহ একটি একক Store। Google এর BLoC Stream এর মাধ্যমে ইভেন্ট এবং অবস্থা আলাদা করে। Provider — 2023 পর্যন্ত Flutter এর জন্য Google দ্বারা সুপারিশকৃত একটি সহজ DI কন্টেইনার। Riverpod — একটি উন্নত Provider যা কম্পাইলেশন এবং পরীক্ষার সমস্যা সমাধান করে। GetX — রাউটিং, DI এবং অবস্থা ব্যবস্থাপনা সহ একটি মাইক্রো-ফ্রেমওয়ার্ক। শিক্ষানবিশ Flutter ডেভেলপারদের জন্য, আমরা Provider বা Riverpod কে সর্বোত্তম ডকুমেন্টেড সমাধান হিসাবে সুপারিশ করি।
নির্দিষ্ট প্যাটার্ন ছাড়াও, সাধারণ আর্কিটেকচার ডিজাইন নীতি রয়েছে যা যেকোনো ভাষা এবং ফ্রেমওয়ার্কে প্রযোজ্য।
SOLID — অবজেক্ট-ওরিয়েন্টেড ডিজাইনের পাঁচটি নীতি: Single Responsibility (একটি ক্লাস — একটি কাজ), Open-Closed (সম্প্রসারণের জন্য খোলা, পরিবর্তনের জন্য বন্ধ), Liskov Substitution (উপশ্রেণী মূল শ্রেণী প্রতিস্থাপন করতে পারে), Interface Segregation (ছোট ইন্টারফেস), Dependency Inversion (বিমূর্ততার উপর নির্ভরতা)। মোবাইল ডেভেলপমেন্টে, SRP হল সবচেয়ে উপযোগী নীতি: প্রতিটি ক্লাস শুধু একটি কাজ করে। IT Sectr এর অভিজ্ঞতা অনুসারে, SRP লঙ্ঘন বাণিজ্যিক প্রকল্পে 70% পরীক্ষার সমস্যার কারণ।
// Пример: нарушение SRP
class UserManager {
fun saveUser(user: User) { /* сохранение */ }
fun validateEmail(email: String): Boolean { /* валидация */ }
fun sendEmail(user: User) { /* отправка */ }
fun formatUser(user: User): String { /* форматирование */ }
}
// Исправление: разделяем на отдельные классы
class UserRepository { fun save(user: User) {} }
class EmailValidator { fun isValid(email: String): Boolean {} }
class EmailService { fun send(user: User) {} }
class UserFormatter { fun format(user: User): String {} }
Kotlin উদাহরণ দেখায় কিভাবে আমরা চারটি দায়িত্ব সহ একটি UserManager ক্লাসকে একেকটি দায়িত্ব সহ চারটি ক্লাসে রূপান্তর করি। এই ধরনের কোড পরীক্ষা, পরিবর্তন এবং পুনরায় ব্যবহার করা সহজ।
DRY (Don't Repeat Yourself) — কোড পুনরাবৃত্তি এড়িয়ে চলুন। পুনরাবৃত্ত লজিক ভাগ করা পদ্ধতি বা ক্লাসে বের করুন। KISS (Keep It Simple, Stupid) — সরলতা কমনীয়তার চেয়ে বেশি গুরুত্বপূর্ণ। YAGNI (You Aren't Gonna Need It) — এমন কোড লিখবেন না যা প্রয়োজন নাও হতে পারে। এই নীতিগুলি অপ্রয়োজনীয়তা ছাড়াই পরিষ্কার, রক্ষণাবেক্ষণযোগ্য কোড লিখতে সহায়তা করে।
ViewModel (Android) UI অবস্থা সংরক্ষণের জন্য Jetpack আর্কিটেকচার উপাদান, স্ক্রিন রোটেশনের জন্য প্রতিরোধী। ViewModel এ Activity এর কোনো রেফারেন্স নেই এবং স্বয়ংক্রিয়ভাবে পরিষ্কার হয়। LiveData — লাইফসাইকেল সচেতনতা সহ একটি পর্যবেক্ষণযোগ্য ডেটা কন্টেইনার। StateFlow — Kotlin Flow ভিত্তিক LiveData এর আধুনিক প্রতিস্থাপন। SharedFlow — একবারের ইভেন্টের (ন্যাভিগেশন, টোস্ট) জন্য Hot Flow।
Data Binding এবং Two-Way Binding — Android এ UI এবং ডেটা বাঁধাই করার প্রক্রিয়া। Data Binding XML এ সংযোগ ঘোষণা করে; Two-Way Binding স্বয়ংক্রিয়ভাবে ViewModel এ ফিল্ড আপডেট করে। Unidirectional Data Flow — একটি নীতি যেখানে ডেটা এক দিকে প্রবাহিত হয়: State → UI → Event → State। IT Sectr এ, আমরা সব নতুন প্রকল্পে Unidirectional Data Flow ব্যবহার করি — এটি অপ্রত্যাশিত অবস্থা পরিবর্তনের কারণে হওয়া বাগের সংখ্যা হ্রাস করে।
| উপাদান | উদ্দেশ্য | প্রতিস্থাপন |
|---|---|---|
| ViewModel | অবস্থা সংরক্ষণ, রোটেশন প্রতিরোধ | — |
| LiveData | লাইফসাইকেল সচেতনতার সাথে পর্যবেক্ষণযোগ্য | StateFlow |
| StateFlow | UI অবস্থার জন্য Kotlin Flow | LiveData |
| SharedFlow | একবারের ইভেন্ট | LiveData Event |
সচরাচর জিজ্ঞাসা
শিক্ষানবিশদের জন্য MVVM সুপারিশ করা হয় — এটি Google এবং Apple দ্বারা সমর্থিত এবং স্পষ্ট বিভাজন রয়েছে। সাধারণ স্ক্রিনের জন্য MVC। 3-5 স্ক্রিন বা তার বেশি প্রকল্পের জন্য Clean Architecture।
Dependency Injection — একটি অবজেক্ট নিজে তৈরি করার পরিবর্তে বাইরে থেকে ডিপেন্ডেন্সি গ্রহণ করে। new Database() এর পরিবর্তে, আপনি কনস্ট্রাক্টরের মাধ্যমে ডাটাবেস পাস করেন। টুল: Hilt (Android), Swinject (iOS), Koin (Kotlin)।
Singleton — পুরো অ্যাপ্লিকেশনের জন্য একটি ইনস্ট্যান্স। Factory — প্রতিবার নতুন অবজেক্ট। রিসোর্সের জন্য Singleton, Factory যখন একই ক্লাসের বিভিন্ন কনফিগারেশন প্রয়োজন।
State Management — ডেটা কীভাবে উপাদানগুলির মধ্যে স্থানান্তরিত হয় এবং UI পরিবর্তনে কীভাবে প্রতিক্রিয়া জানায়। Flutter এ: Provider, Riverpod, BLoC। Android এ: LiveData, StateFlow, ViewModel।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।