অ্যান্ড্রয়েড আর্কিটেকচারের জন্য সুপারিশ (ভিউ)

ধারণা এবং জেটপ্যাক কম্পোজ বাস্তবায়ন

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

UI স্তর

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

  • রিপোজিটরিতে একটিমাত্র ডেটা সোর্স থাকলেও তা তৈরি করা উচিত।
  • ছোট অ্যাপের ক্ষেত্রে, আপনি ডেটা লেয়ারের প্রকারগুলোকে একটি data প্যাকেজ বা মডিউলে রাখতে পারেন।

সুপারিশ

বর্ণনা

একমুখী ডেটা প্রবাহ (UDF) অনুসরণ করুন।

জোরালোভাবে সুপারিশ করা হচ্ছে

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

আপনার অ্যাপের জন্য AAC ViewModel-এর সুবিধাগুলো প্রযোজ্য হলে তা ব্যবহার করুন।

জোরালোভাবে সুপারিশ করা হচ্ছে

বিজনেস লজিক পরিচালনা করতে এবং UI-এর স্টেট প্রকাশ করার জন্য অ্যাপ্লিকেশন ডেটা ফেচ করতে AAC ViewModel ব্যবহার করুন।

ViewModel-এর আরও সেরা অনুশীলনগুলো এখানে দেখুন।

ভিউমডেলের সুবিধাগুলো এখানে দেখুন।

লাইফসাইকেল-সচেতন UI স্টেট সংগ্রহ ব্যবহার করুন।

জোরালোভাবে সুপারিশ করা হচ্ছে

উপযুক্ত লাইফসাইকেল-সচেতন কো-রুটিন বিল্ডার, repeatOnLifecycle ব্যবহার করে UI থেকে UI স্টেট সংগ্রহ করুন।

repeatOnLifecycle সম্পর্কে আরও পড়ুন।

ViewModel থেকে UI-তে ইভেন্ট পাঠাবেন না।

জোরালোভাবে সুপারিশ করা হচ্ছে

ViewModel-এ ইভেন্টটি অবিলম্বে প্রসেস করুন এবং ইভেন্টটি হ্যান্ডেল করার ফলাফল দিয়ে একটি স্টেট আপডেট ঘটান। UI ইভেন্ট সম্পর্কে আরও জানতে এখানে দেখুন

একটি একক-কার্যকলাপের অ্যাপ্লিকেশন ব্যবহার করুন।

সুপারিশকৃত

আপনার অ্যাপে একাধিক স্ক্রিন থাকলে, স্ক্রিনগুলোর মধ্যে নেভিগেট করতে এবং অ্যাপে ডিপ লিঙ্ক করতে নেভিগেশন ফ্র্যাগমেন্ট ব্যবহার করুন।

নিম্নলিখিত কোড স্নিপেটটি লাইফসাইকেল-সচেতন পদ্ধতিতে UI স্টেট সংগ্রহ করার পদ্ধতি বর্ণনা করে:

class MyFragment : Fragment() {

    private val viewModel: MyViewModel by viewModel()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycleScope.launch {
            viewLifecycleOwner.repeatOnLifecycle(Lifecycle.State.STARTED) {
                viewModel.uiState.collect {
                    // Process item
                }
            }
        }
    }
}

ভিউমডেল

ভিউমডেলগুলো UI স্টেট প্রদান এবং ডেটা লেয়ারে অ্যাক্সেস দেওয়ার জন্য দায়ী। ভিউমডেল ব্যবহারের কিছু সেরা পদ্ধতি নিচে দেওয়া হলো:

সুপারিশ

বর্ণনা

ভিউমডেলগুলো অ্যান্ড্রয়েড লাইফসাইকেল সম্পর্কে অজ্ঞ থাকা উচিত।

জোরালোভাবে সুপারিশ করা হচ্ছে

ViewModel-এ কোনো লাইফসাইকেল-সম্পর্কিত টাইপের রেফারেন্স থাকা উচিত নয়। ডিপেন্ডেন্সি হিসেবে Activity , Fragment , Context বা Resources পাস করবেন না। যদি ViewModel-এর কোনো কিছুর জন্য Context প্রয়োজন হয়, তবে সেটি সঠিক লেয়ারে আছে কিনা তা ভালোভাবে যাচাই করে নেওয়া উচিত।

কো-রুটিন এবং ফ্লো ব্যবহার করুন।

জোরালোভাবে সুপারিশ করা হচ্ছে

ViewModel নিম্নলিখিত উপায়ে ডেটা বা ডোমেইন লেয়ারের সাথে যোগাযোগ করে:

  • অ্যাপ্লিকেশন ডেটা গ্রহণ করার জন্য কোটলিন ফ্লো,
  • viewModelScope ব্যবহার করে বিভিন্ন কাজ সম্পাদন করার জন্য ফাংশনগুলোকে suspend

স্ক্রিন লেভেলে ভিউমডেল ব্যবহার করুন।

জোরালোভাবে সুপারিশ করা হচ্ছে

UI-এর পুনঃব্যবহারযোগ্য অংশে ViewModel ব্যবহার করবেন না। নিম্নলিখিত স্থানগুলিতে ViewModel ব্যবহার করা উচিত:

AndroidViewModel ব্যবহার করবেন না।

জোরালোভাবে সুপারিশ করা হচ্ছে

AndroidViewModel নয়, ViewModel ক্লাসটি ব্যবহার করুন। ViewModel-এর মধ্যে Application ক্লাসটি ব্যবহার করা উচিত নয়। এর পরিবর্তে, ডিপেন্ডেন্সিটি UI বা ডেটা লেয়ারে সরিয়ে নিন।

একটি UI অবস্থা প্রকাশ করুন।

সুপারিশকৃত

ViewModel-এর উচিত uiState নামক একটিমাত্র প্রপার্টির মাধ্যমে UI-তে ডেটা প্রকাশ করা। যদি UI একাধিক, সম্পর্কহীন ডেটা প্রদর্শন করে, তবে ViewModel একাধিক UI স্টেট প্রপার্টি প্রকাশ করতে পারে।

  • আপনার uiState একটি StateFlow পরিণত করা উচিত।
  • যদি ডেটা হায়ারার্কির অন্যান্য স্তর থেকে ডেটার স্ট্রিম হিসাবে আসে, তাহলে আপনার WhileSubscribed(5000) পলিসি ( উদাহরণ ) সহ stateIn অপারেটর ব্যবহার করে uiState তৈরি করা উচিত।
  • যেসব সরল ক্ষেত্রে ডেটা লেয়ার থেকে কোনো ডেটা স্ট্রিম আসে না, সেখানে একটি ইমিউটেবল স্টেটফ্লো (immutable StateFlow হিসেবে এক্সপোজ করা MutableStateFlow ) ব্যবহার করা গ্রহণযোগ্য।
  • আপনি ${Screen}UiState একটি ডেটা ক্লাস হিসেবে বেছে নিতে পারেন, যা ডেটা, ত্রুটি এবং লোডিং সংকেত ধারণ করতে পারে। যদি বিভিন্ন স্টেটগুলো স্বতন্ত্র হয়, তবে এই ক্লাসটি একটি সিলড ক্লাসও হতে পারে।

নিম্নলিখিত কোড স্নিপেটটিতে একটি ViewModel থেকে UI স্টেট কীভাবে প্রকাশ করতে হয় তার রূপরেখা দেওয়া হয়েছে:

@HiltViewModel
class BookmarksViewModel @Inject constructor(
    newsRepository: NewsRepository
) : ViewModel() {

    val feedState: StateFlow<NewsFeedUiState> =
        newsRepository
            .getNewsResourcesStream()
            .mapToFeedState(savedNewsResourcesState)
            .stateIn(
                scope = viewModelScope,
                started = SharingStarted.WhileSubscribed(5_000),
                initialValue = NewsFeedUiState.Loading
            )

    // ...
}

জীবনচক্র

অ্যান্ড্রয়েড লাইফসাইকেল নিয়ে কাজ করার জন্য নিম্নলিখিত কিছু সেরা অনুশীলন রয়েছে:

সুপারিশ

বর্ণনা

অ্যাক্টিভিটি বা ফ্র্যাগমেন্টে লাইফসাইকেল মেথড ওভাররাইড করবেন না।

জোরালোভাবে সুপারিশ করা হচ্ছে

অ্যাক্টিভিটি বা ফ্র্যাগমেন্টে onResume মতো লাইফসাইকেল মেথড ওভাররাইড করবেন না। এর পরিবর্তে LifecycleObserver ব্যবহার করুন। যদি লাইফসাইকেল কোনো নির্দিষ্ট Lifecycle.State পৌঁছালে অ্যাপটিকে কোনো কাজ সম্পাদন করতে হয়, তাহলে repeatOnLifecycle API ব্যবহার করুন।

নিম্নলিখিত কোড স্নিপেটটি একটি নির্দিষ্ট লাইফসাইকেল স্টেট দেওয়া থাকলে কীভাবে অপারেশনগুলি সম্পাদন করতে হয় তার রূপরেখা দেয়:

class MyFragment: Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewLifecycleOwner.lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onResume(owner: LifecycleOwner) {
                // ...
            }
            override fun onPause(owner: LifecycleOwner) {
                // ...
            }
        }
    }
}