পাঠ ১৪ · ৫৭-এর মধ্যে · মডিউল ৩
Home / Courses / Mobile App Development / প্যাটার্ন নির্বাচন

সঠিক আর্কিটেকচার প্যাটার্ন বাছাই করা

Choosing the right architecture pattern
৯ মিনিট পড়া মধ্যম · Intermediate Python কোডসহ সম্পূর্ণ বাংলায়

এই পাঠে যা শিখবেন

  • চারটি সিদ্ধান্ত-নির্ধারক ফ্যাক্টর — টিমের আকার, জটিলতা, টেস্টেবিলিটি, প্ল্যাটফর্ম কনভেনশন
  • একটি সত্যিকারের ওজনযুক্ত-মানদণ্ড স্কোরার ফাংশন লেখা ও চালানো
  • দেখা যে একই মানদণ্ড-স্কোর সেট, ভিন্ন ওজন দিয়ে, সম্পূর্ণ ভিন্ন র‍্যাঙ্কিং তৈরি করতে পারে
  • কেন এই ধরনের সিদ্ধান্ত-কাঠামো একটি সহায়ক হাতিয়ার, কিন্তু প্রতিস্থাপনযোগ্য "সত্য" নয়

১ · চারটি সিদ্ধান্ত-নির্ধারক ফ্যাক্টর

টিমের আকার
ছোট টিমে কম বয়লারপ্লেট ও দ্রুত শেখার প্যাটার্ন (MVC/MVVM) সুবিধাজনক; বড় টিমে কঠোর স্তরবিন্যাস (Clean Architecture) সমান্তরাল কাজ সহজ করে।
অ্যাপের জটিলতা
একটি সাধারণ, কয়েক-স্ক্রিনের অ্যাপে MVC-ই যথেষ্ট হতে পারে; জটিল, বহু-স্ক্রিন, বহু-স্টেট অ্যাপে MVI/Clean Architecture-এর কাঠামো ভবিষ্যতের রক্ষণাবেক্ষণ সহজ করে।
টেস্টেবিলিটির প্রয়োজন
বিজনেস লজিক UI থেকে যত বেশি বিচ্ছিন্ন (MVVM/MVI/Clean Architecture), ইউনিট টেস্ট লেখা তত সহজ — L50-এ বিস্তারিত।
প্ল্যাটফর্ম কনভেনশন
MVVM iOS ও Android উভয় প্ল্যাটফর্মেই idiomatic (L15-L16); MVI আধুনিক Android/Jetpack Compose কমিউনিটিতে বিশেষভাবে জনপ্রিয় (L16, L18)।

২ · একটি ওজনযুক্ত-মানদণ্ড স্কোরার — বাস্তব কোড

প্রতিটি প্যাটার্নের চারটি মানদণ্ডে (১-৫ স্কেলে, বেশি ভালো) একটি স্থির স্কোর ধরা হয়েছে — এগুলো L10-L13-এর আলোচনার ভিত্তিতে যুক্তিসঙ্গত অনুমান, কোনো আনুষ্ঠানিক পরিমাপ নয়। চূড়ান্ত সুপারিশ $$\text{স্কোর} = \sum_i w_i \cdot s_i$$ — অর্থাৎ প্রতিটি মানদণ্ডের স্কোরকে তার ওজন দিয়ে গুণ করে যোগফল বের করা হয়, যেখানে w_i হলো মানদণ্ডটির ওজন (প্রজেক্টের অগ্রাধিকার) আর s_i হলো সেই মানদণ্ডে প্যাটার্নের স্কোর।

Python
# প্রতিটি প্যাটার্নের মানদণ্ড-স্কোর (১-৫, বেশি ভালো) -- L10-L13-এর আলোচনার ভিত্তিতে
patterns = {
    "MVC":                {"testability": 2, "scalability": 2, "learning_curve": 5, "low_boilerplate": 4},
    "MVVM":               {"testability": 4, "scalability": 4, "learning_curve": 3, "low_boilerplate": 3},
    "MVI":                {"testability": 5, "scalability": 4, "learning_curve": 2, "low_boilerplate": 2},
    "Clean Architecture": {"testability": 5, "scalability": 5, "learning_curve": 1, "low_boilerplate": 1},
}


def score_pattern(pattern_scores, weights):
    return sum(weights[criterion] * pattern_scores[criterion] for criterion in weights)


def print_ranking(title, weights):
    print(f"=== {title} ===")
    print("অগ্রাধিকার (ওজন):", weights)
    ranked = sorted(patterns.items(), key=lambda item: score_pattern(item[1], weights), reverse=True)
    for rank, (name, scores) in enumerate(ranked, start=1):
        total = score_pattern(scores, weights)
        print(f"  #{rank}  {name:20s} স্কোর: {total:.2f}")
    winner = ranked[0][0]
    print(f"সুপারিশ: '{winner}'\n")
    return winner


# ---------- প্রোফাইল ১: বড় টিম, দীর্ঘমেয়াদী প্রজেক্ট, উচ্চ-টেস্টেবিলিটি প্রয়োজন ----------
enterprise_weights = {
    "testability": 0.35,
    "scalability": 0.35,
    "learning_curve": 0.10,
    "low_boilerplate": 0.20,
}
winner_enterprise = print_ranking("প্রোফাইল ১ -- বড় টিম, দীর্ঘমেয়াদী, উচ্চ-টেস্টেবিলিটি", enterprise_weights)

# ---------- প্রোফাইল ২: ছোট টিম, দ্রুত প্রোটোটাইপ, টাইট ডেডলাইন ----------
prototype_weights = {
    "testability": 0.10,
    "scalability": 0.10,
    "learning_curve": 0.40,
    "low_boilerplate": 0.40,
}
winner_prototype = print_ranking("প্রোফাইল ২ -- ছোট টিম, দ্রুত প্রোটোটাইপ, টাইট ডেডলাইন", prototype_weights)

print(f"একই চারটি প্যাটার্নের একই মানদণ্ড-স্কোর, কিন্তু ভিন্ন ওজনে ভিন্ন বিজয়ী:")
print(f"  প্রোফাইল ১ (এন্টারপ্রাইজ)  -> {winner_enterprise}")
print(f"  প্রোফাইল ২ (প্রোটোটাইপ)   -> {winner_prototype}")

    
লক্ষ্য করুন patterns ডিকশনারির স্কোরগুলো একবারও বদলানো হয়নি — শুধু weights বদলানোর কারণে প্রোফাইল ১-এ Clean Architecture (উচ্চ testability+scalability ওজনের কারণে) শীর্ষে আসে, কিন্তু প্রোফাইল ২-এ MVC (উচ্চ learning_curve+low_boilerplate ওজনের কারণে) শীর্ষে আসে — Clean Architecture তখন সবচেয়ে নিচে নেমে যায়, কারণ এর জটিলতা ও বয়লারপ্লেট একটি দ্রুত প্রোটোটাইপে সুবিধার বদলে বোঝা হয়ে দাঁড়ায়। একই ফাংশন, একই ইনপুট ডেটা — শুধু অগ্রাধিকারের ওজন পাল্টেই সম্পূর্ণ উল্টো সুপারিশ আসে।
মূল কথা · Key takeaway

একটি ওজনযুক্ত-মানদণ্ড স্কোরার সিদ্ধান্তকে স্বচ্ছ ও তুলনাযোগ্য করে তোলে — কিন্তু নিজেই কোনো "সঠিক" উত্তর তৈরি করে না। মানদণ্ডের স্কোর (প্যাটার্নটি কতটা টেস্টেবল, কতটা জটিল) ও ওজন (প্রজেক্টে কোনটা কতটা গুরুত্বপূর্ণ) — দুটোই বাস্তবে টিমের অভিজ্ঞতা ও প্রজেক্টের প্রেক্ষাপটের ওপর নির্ভরশীল মানবিক বিচার-বিবেচনা। হাতিয়ারটি আলোচনাকে কাঠামোবদ্ধ করে, বিতর্ককে দূর করে না।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ উপরের কোডে learning_curve মানদণ্ডে MVC-এর স্কোর সবচেয়ে বেশি (৫) কেন?

কারণ MVC-এর ধারণাগত কাঠামো (Model/View/Controller, L10) সবচেয়ে সরল ও পরিচিত — কোনো Observable/reducer/repository-ইন্টারফেসের মতো অতিরিক্ত ধারণা শিখতে হয় না। MVVM-এ Observable প্যাটার্ন (L11), MVI-তে ইমিউটেবল State ও reducer (L12), আর Clean Architecture-এ একসাথে তিনটি লেয়ার ও abstract ইন্টারফেস (L13) শিখতে হয় — তাই তাদের learning_curve স্কোর ক্রমান্বয়ে কম।

প্র ০২ যদি একটি প্রজেক্টে সবগুলো ওজন সমান (প্রতিটি ০.২৫) হতো, তাহলে কী কোনো একটি প্যাটার্ন স্পষ্টভাবে "সেরা" হতো?

এটি সরাসরি হিসেব করে দেখা যায়: MVVM = 0.25×(4+4+3+3) = 3.5, বাকিদের তুলনায় সবচেয়ে বেশি (MVC=3.25, MVI=3.25, Clean=3.0)। এটি অর্থবহ — MVVM প্রতিটি মানদণ্ডে "মাঝারি-থেকে-ভালো" স্কোর পায় (কোনো চরম দুর্বলতা নেই), যেখানে অন্যরা কোনো একটি মানদণ্ডে খুব ভালো কিন্তু আরেকটিতে খুব খারাপ — এটাই ব্যাখ্যা করে কেন MVVM প্রায়ই মোবাইলে "নিরাপদ ডিফল্ট" পছন্দ হিসেবে বিবেচিত হয়।

প্র ০৩ এই স্কোরার কি প্রকৃতপক্ষে প্রজেক্টের কোড লিখে দেখে স্কোর বের করে?

না — patterns ডিকশনারির মানগুলো ম্যানুয়ালি লেখা অনুমান (L10-L13-এর আলোচনা ও সাধারণভাবে স্বীকৃত ট্রেড-অফের ভিত্তিতে), কোনো স্বয়ংক্রিয় পরিমাপ নয়। স্কোরারটি নিজে শুধু গাণিতিক যোগ-গুণ করে — এর মূল্য এই নয় যে এটি "সঠিক" সংখ্যা উৎপন্ন করে, বরং এই যে এটি টিমকে তাদের অগ্রাধিকারগুলো স্পষ্টভাবে লিখতে এবং সেই অগ্রাধিকার অনুযায়ী ধারাবাহিকভাবে তুলনা করতে বাধ্য করে।

অনুশীলন

  1. চিন্তা করুন: একটি "মাঝারি" প্রোফাইল — মাঝারি আকারের টিম, মাঝারি জটিলতার অ্যাপ, তবে টেস্টেবিলিটি খুব গুরুত্বপূর্ণ নয় (কারণ প্রজেক্টে ইতিমধ্যেই ভালো ম্যানুয়াল QA প্রক্রিয়া আছে) — এমন একটি প্রজেক্টের জন্য আপনি কেমন ওজন সেট করবেন বলে মনে হয়?

    একটি যুক্তিসঙ্গত সেট হতে পারে {"testability": 0.15, "scalability": 0.30, "learning_curve": 0.30, "low_boilerplate": 0.25} — testability-এর ওজন কম রাখা হয়েছে (যেহেতু ম্যানুয়াল QA আছে), কিন্তু scalability এখনো মাঝারি-গুরুত্বপূর্ণ (মাঝারি জটিলতার অ্যাপ ভবিষ্যতে বাড়তে পারে), আর learning_curve/low_boilerplate-কেও যুক্তিসঙ্গত ওজন দেওয়া হয়েছে (মাঝারি টিমের জন্য দ্রুত-শেখা ও কম-বয়লারপ্লেট দুটোই কাজে লাগে)। এই ওজনগুলো দিয়ে print_ranking() চালিয়ে দেখা যেতে পারে কোন প্যাটার্ন শীর্ষে আসে।

  2. পরীক্ষা করুন: উপরের কোড সেলে patterns ডিকশনারিতে একটি নতুন প্যাটার্ন "MVP": {"testability": 4, "scalability": 3, "learning_curve": 3, "low_boilerplate": 3} যোগ করুন, তারপর print_ranking() আবার চালিয়ে দেখুন এটি দুটি প্রোফাইলেই কোথায় স্থান পায়।

    যেহেতু print_ranking() ফাংশনটি নির্দিষ্ট কোনো প্যাটার্নের নাম হার্ডকোড করে না — এটি patterns.items()-এর ওপর লুপ করে — নতুন "MVP" এন্ট্রি স্বয়ংক্রিয়ভাবে র‍্যাঙ্কিংয়ে যুক্ত হয়ে যাবে, কোনো অতিরিক্ত কোড পরিবর্তন ছাড়াই। প্রোফাইল ১-এ (এন্টারপ্রাইজ) এটি MVVM=3.70-এর কাছাকাছি স্কোর পাবে (মাঝামাঝি কোথাও বসবে), আর প্রোফাইল ২-এ (প্রোটোটাইপ) MVC ও MVVM-এর মাঝামাঝি স্থান পাবে — এটি দেখায় স্কোরার ফাংশনটি সত্যিই ডেটা-চালিত, কোনো নির্দিষ্ট প্যাটার্নের সংখ্যায় হার্ডকোড করা নয়।

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

  • কোর্সের সম্পূর্ণ সিলেবাস দেখুন ৫৭টি পাঠ অ্যাপ লাইফসাইকেল, মোবাইল UI/UX, MVVM/MVI আর্কিটেকচার, নেটিভ বনাম ক্রস-প্ল্যাটফর্ম, নেভিগেশন, স্টেট ম্যানেজমেন্ট, লোকাল স্টোরেজ, ডিভাইস ফিচার ও ডিপ্লয়মেন্ট — বাকি পাঠগুলো শীঘ্রই যুক্ত হবে।
  • FSWF · Choosing the Right Stack for a Project সহোদর পাঠ ওজনযুক্ত-মানদণ্ড সিদ্ধান্ত-কাঠামোর একই ধরনের প্রয়োগ ওয়েব স্ট্যাক নির্বাচনের প্রেক্ষাপটে সেই পাঠে দেখা যায়।
  • সব Courses দেখুন ABCL TECH C, C++, Python, Java, JavaScript, DSA, DBMS, Discrete Mathematics, System Design, Cybersecurity, Cloud Computing & DevOps, Computer Networks, Operating Systems, Computer Architecture, Programming Languages & Compiler Design, Software Engineering & Git, Theory of Computation, Engineering Economics, Full-Stack Web Frameworks ও Mobile App Development — সব এক জায়গায়।
আগের পাঠ
মোবাইলের জন্য ক্লিন আর্কিটেকচার লেয়ার