डोमेन लेयर

डोमेन लेयर एक वैकल्पिक लेयर है, जो यूज़र इंटरफ़ेस (यूआई) लेयर और डेटा लेयर.

शामिल होने पर, वैकल्पिक डोमेन लेयर,
    और डेटा लेयर पर निर्भर करता है.
पहली इमेज. ऐप्लिकेशन आर्किटेक्चर में डोमेन लेयर की भूमिका.

डोमेन लेयर की ज़िम्मेदारी, कारोबारी लॉजिक को इनकैप्सुलेट करने की होती है या आसान बिज़नेस लॉजिक, जिसका कई ViewModels फिर से इस्तेमाल किया जाता है. यह लेयर ज़रूरी नहीं है, क्योंकि सभी ऐप्लिकेशन के लिए ये ज़रूरी शर्तें पूरी नहीं होंगी. आपको सिर्फ़ ज़रूरत पड़ने पर इसे इस्तेमाल किया जा सकता है. उदाहरण के लिए, जटिलता को मैनेज करना या फिर से इस्तेमाल करने लायक बनाने के लिए.

डोमेन लेयर से ये फ़ायदे मिलते हैं:

  • इससे कोड डुप्लीकेट नहीं होता.
  • इससे, डोमेन लेयर क्लास का इस्तेमाल करने वाली क्लास में बेहतर ढंग से पढ़ा जा सकता है.
  • इससे ऐप्लिकेशन की जांच बेहतर होती है.
  • यह आपको ज़िम्मेदारियों को बांटने की अनुमति देकर बड़ी क्लास से बचाता है.

इन क्लास को आसान और कम समय में इस्तेमाल करने के लिए, हर इस्तेमाल के उदाहरण में सिर्फ़ किसी एक फ़ंक्शन के लिए ज़िम्मेदार होती है और उनमें बदलाव नहीं किया जा सकता डेटा शामिल है. इसके बजाय, आपको अपने यूज़र इंटरफ़ेस (यूआई) या डेटा लेयर में म्यूट किए जा सकने वाले डेटा को हैंडल करना चाहिए.

इस गाइड में दिए गए नाम रखने के तरीके

इस गाइड में, इस्तेमाल के उदाहरणों को सिर्फ़ एक कार्रवाई के नाम पर रखा गया है के लिए. कन्वेंशन इस तरह है:

प्रज़ेंट काल में क्रिया + संज्ञा/क्या (ज़रूरी नहीं) + UseCase.

उदाहरण के लिए: FormatDateUseCase, LogOutUserUseCase, GetLatestNewsWithAuthorsUseCase या MakeLoginRequestUseCase.

डिपेंडेंसी

किसी सामान्य ऐप्लिकेशन आर्किटेक्चर में, डेटा लेयर से यूज़र इंटरफ़ेस (यूआई) लेयर और डेटा स्टोर करने की जगहें. इसका मतलब है कि केस क्लास का इस्तेमाल करना आम तौर पर रिपॉज़िटरी क्लास पर निर्भर होते हैं. साथ ही, वे यूज़र इंटरफ़ेस (यूआई) लेयर से कम्यूनिकेट करते हैं, की तरह ही डेटा स्टोर करने की जगहें होती हैं—इसके लिए कॉलबैक (Java के लिए) या कोरूटीन (Java के लिए) का इस्तेमाल किया जाता है Kotlin). इसके बारे में ज़्यादा जानने के लिए, डेटा लेयर पेज पर जाएं.

उदाहरण के लिए, आपके ऐप्लिकेशन में इस्तेमाल के उदाहरण की ऐसी क्लास हो सकती है जिससे डेटा फ़ेच किया जाता हो डेटा स्टोर करने की जगह और लेखक के डेटा का डेटा स्टोर करने की जगह है. साथ ही, इनको मिलाता है:

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository
) { /* ... */ }

इस्तेमाल के उदाहरणों में फिर से इस्तेमाल किया जा सकने वाला लॉजिक होता है. इसलिए, इनका इस्तेमाल दूसरे कामों के लिए भी किया जा सकता है मामले. डोमेन लेयर में, इस्तेमाल के उदाहरणों के कई लेवल होना सामान्य बात है. इसके लिए उदाहरण के लिए, नीचे दिए गए उदाहरण में बताए गए इस्तेमाल का उदाहरण अगर यूज़र इंटरफ़ेस (यूआई) लेयर की एक से ज़्यादा क्लास समय पर निर्भर करती हैं, तो FormatDateUseCase का इस्तेमाल केस ज़ोन का इस्तेमाल करके स्क्रीन पर सही मैसेज दिखाएं:

class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository,
  private val formatDateUseCase: FormatDateUseCase
) { /* ... */ }
अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है
GetNewNewsWithAuthorsUseCase, रिपॉज़िटरी क्लास पर निर्भर करता है
    डेटा लेयर है, लेकिन यह इस्तेमाल के दूसरे उदाहरण क्लास, FormatDataUseCase पर भी निर्भर करता है
    जो डोमेन लेयर में भी मौजूद है.
दूसरी इमेज. अन्य चीज़ों पर निर्भर इस्तेमाल के उदाहरण के लिए, डिपेंडेंसी ग्राफ़ इस्तेमाल के उदाहरण.

Kotlin में कॉल के इस्तेमाल के उदाहरण

Kotlin में, केस क्लास इंस्टेंस को फ़ंक्शन के तौर पर कॉल करने लायक बनाएं operator मॉडिफ़ायर की मदद से invoke() फ़ंक्शन के बारे में जानकारी. नीचे दी गई जानकारी देखें उदाहरण:

class FormatDateUseCase(userRepository: UserRepository) {

    private val formatter = SimpleDateFormat(
        userRepository.getPreferredDateFormat(),
        userRepository.getPreferredLocale()
    )

    operator fun invoke(date: Date): String {
        return formatter.format(date)
    }
}

इस उदाहरण में, FormatDateUseCase में मौजूद invoke() तरीके की मदद से, कॉल इंस्टेंस को इस तरह सबमिट करें, जैसे कि वे फ़ंक्शन हों. invoke() तरीका इसका इस्तेमाल किसी खास हस्ताक्षर के लिए नहीं किया जा सकता—इसमें कई पैरामीटर इस्तेमाल हो सकते हैं और किसी भी तरह का रिटर्न दे सकते हैं. invoke() में दूसरे हस्ताक्षर भी डाले जा सकते हैं छात्र-छात्राओं को ट्रैक करने की सुविधा मिलती है. ऊपर दिए गए उदाहरण से, इस्तेमाल के उदाहरण को इस तरह कॉल करें:

class MyViewModel(formatDateUseCase: FormatDateUseCase) : ViewModel() {
    init {
        val today = Calendar.getInstance()
        val todaysDate = formatDateUseCase(today)
        /* ... */
    }
}

invoke() ऑपरेटर के बारे में ज़्यादा जानने के लिए, Kotlin की मदद लें दस्तावेज़.

लाइफ़साइकल

इस्तेमाल के उदाहरणों का अपना लाइफ़साइकल नहीं होता है. इसके बजाय, इनका दायरा क्लास तक सीमित होता है जो इनका इस्तेमाल करते हैं. इसका मतलब है कि यूज़र इंटरफ़ेस (यूआई) में क्लास से इस्तेमाल के उदाहरणों को कॉल किया जा सकता है लेयर में बदलाव करने की सुविधा मिलती है. इसे सेवाओं से या खुद Application क्लास से लिया जाता है. इस्तेमाल के उदाहरण में बदला जा सकने वाला डेटा नहीं होना चाहिए, आपको इस्तेमाल के उदाहरण का नया इंस्टेंस बनाना चाहिए क्लास का इस्तेमाल करें.

थ्रेडिंग

डोमेन लेयर के इस्तेमाल के उदाहरण मुख्य तौर पर सुरक्षित होने चाहिए; दूसरे शब्दों में कहा जाए, तो उन्हें मुख्य थ्रेड से कॉल करना सुरक्षित रहेगा. अगर इस्तेमाल करने के उदाहरण वाले क्लास लंबे समय तक चलते हैं कार्रवाइयों को ब्लॉक करने के लिए, वे उस लॉजिक को सही थ्रेड. हालांकि, ऐसा करने से पहले देख लें कि वे ऑपरेशन की जगह बेहतर क्रम में डाली जा सकती है. आम तौर पर, जटिल कंप्यूटेशन की प्रोसेस, डेटा लेयर में होती है. इससे, मुश्किल कंप्यूटेशन का इस्तेमाल करके, डेटा लेयर को फिर से इस्तेमाल करने के लिए बढ़ावा दिया जाता है या कैश मेमोरी. उदाहरण के लिए, बड़ी सूची में कम संसाधनों वाला काम करना बेहतर है को डोमेन लेयर की तुलना में डेटा लेयर में रखा जा सकता है, अगर नतीजे को कैश मेमोरी में सेव किया जाता है, ताकि उसे ऐप्लिकेशन की कई स्क्रीन पर फिर से इस्तेमाल किया जा सके.

नीचे दिए गए उदाहरण में इस्तेमाल का एक उदाहरण दिया गया है, जो बैकग्राउंड पर अपना काम करता है थ्रेड:

class MyUseCase(
    private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {

    suspend operator fun invoke(...) = withContext(defaultDispatcher) {
        // Long-running blocking operations happen on a background thread.
    }
}

सामान्य काम

इस सेक्शन में, डोमेन लेयर के सामान्य टास्क करने का तरीका बताया गया है.

दोबारा इस्तेमाल किए जा सकने वाले आसान बिज़नेस लॉजिक

आपको यूज़र इंटरफ़ेस (यूआई) लेयर में मौजूद, दोहराए जा सकने वाले बिज़नेस लॉजिक को इनकैप्सुलेट करना चाहिए: केस क्लास का इस्तेमाल करें. इससे लॉजिक के हिसाब से किसी भी बदलाव को आसानी से लागू किया जा सकता है का इस्तेमाल किया जाता है. इसकी मदद से, लॉजिक को अलग-अलग टेस्ट किया जा सकता है.

ऊपर दिए गए FormatDateUseCase उदाहरण पर गौर करें. अगर आपके कारोबार के लिए आने वाले समय में तारीख के फ़ॉर्मैट में होने वाले बदलाव से जुड़ी ज़रूरी शर्तों को पूरा करते हों, तो आपको सिर्फ़ एक ही जगह से कोड को बदला जा सकता है.

डेटा स्टोर करने की जगहों को एक साथ जोड़ें

समाचार ऐप्लिकेशन में, आपके पास NewsRepository और AuthorsRepository क्लास हो सकती हैं जो समाचार और लेखक से जुड़े डेटा से जुड़े काम करते हैं. Article क्लास कि NewsRepository में केवल लेखक का नाम दिखता है, लेकिन आपको का इस्तेमाल करें. लेखक की जानकारी AuthorsRepository से डाउनलोड किया जा सकता है.

GetNewNewsWithAuthorsUseCase दो अलग-अलग डेटा स्टोर करने की जगह पर निर्भर करता है
    डेटा लेयर से ली गई क्लास: NewsRepository और AuthorsRepository.
तीसरी इमेज. इस्तेमाल के उदाहरण के लिए डिपेंडेंसी ग्राफ़, जिसमें डेटा स्टोर करने की जगहें.

लॉजिक के लिए कई रिपॉज़िटरी (डेटा स्टोर करने की जगह) शामिल हैं और ये मुश्किल हो सकते हैं. इसलिए, आपने लॉजिक को एब्सट्रैक्ट करने के लिए, GetLatestNewsWithAuthorsUseCase क्लास बनाएं इस्तेमाल करने में आसान हो जाएगा. इससे लोगों को यह समझने में मदद मिलती है कि आइसोलेशन में जांच करना और ऐप्लिकेशन के अलग-अलग हिस्सों में फिर से इस्तेमाल करना.

/**
 * This use case fetches the latest news and the associated author.
 */
class GetLatestNewsWithAuthorsUseCase(
  private val newsRepository: NewsRepository,
  private val authorsRepository: AuthorsRepository,
  private val defaultDispatcher: CoroutineDispatcher = Dispatchers.Default
) {
    suspend operator fun invoke(): List<ArticleWithAuthor> =
        withContext(defaultDispatcher) {
            val news = newsRepository.fetchLatestNews()
            val result: MutableList<ArticleWithAuthor> = mutableListOf()
            // This is not parallelized, the use case is linearly slow.
            for (article in news) {
                // The repository exposes suspend functions
                val author = authorsRepository.getAuthor(article.authorId)
                result.add(ArticleWithAuthor(article, author))
            }
            result
        }
}

लॉजिक, news सूची के सभी आइटम को मैप करता है; इसलिए, भले ही डेटा लेयर मुख्य-सुरक्षित है, इस काम से मुख्य थ्रेड को ब्लॉक नहीं करना चाहिए, क्योंकि आपको नहीं पता कि यह कैसे करना है आइटम प्रोसेस कर सकते हैं. इसलिए, इस्तेमाल का उदाहरण काम को बैकग्राउंड में चला जाता है डिफ़ॉल्ट डिस्पैचर का इस्तेमाल करके थ्रेड करें.

अन्य उपभोक्ता

यूज़र इंटरफ़ेस (यूआई) लेयर के अलावा, डोमेन लेयर को सेवाएं और Application क्लास. इसके अलावा, अगर अन्य प्लैटफ़ॉर्म, जैसे कि टीवी या मोबाइल ऐप्लिकेशन के साथ Wear शेयर कोड बेस, तो उनकी यूआई लेयर भी फिर से इस्तेमाल कर सकती है केस का इस्तेमाल करके डोमेन लेयर के ऊपर दिए गए सभी फ़ायदे पाएं.

डेटा लेयर के ऐक्सेस से जुड़ी पाबंदी

डोमेन लेयर लागू करते समय, एक और ज़रूरी बात यह है कि आपको इसके बाद भी, यूज़र इंटरफ़ेस (यूआई) लेयर से डेटा लेयर को सीधे ऐक्सेस करने की अनुमति दें या सब कुछ है.

यूज़र इंटरफ़ेस (यूआई) लेयर, डेटा लेयर को सीधे ऐक्सेस नहीं कर सकती. इसे डोमेन लेयर से गुज़रना होगा
चौथी इमेज. यूज़र इंटरफ़ेस (यूआई) लेयर का ऐक्सेस न होने की जानकारी देने वाला डिपेंडेंसी ग्राफ़ को ट्रैक किया जा सकता है.

इस पाबंदी का फ़ायदा यह है कि यह आपके यूज़र इंटरफ़ेस (यूआई) को बायपास करने से रोकता है डोमेन लेयर लॉजिक का इस्तेमाल किया जा सकता है. उदाहरण के लिए, अगर हर महीने के हिसाब से डेटा इकट्ठा करने के लिए डेटा लेयर को ऐक्सेस करने के अनुरोध की जानकारी देता है.

हालांकि, इसका सबसे बड़ा नुकसान यह है कि यह आपको इस्तेमाल के उदाहरण जोड़ सकते हैं, भले ही वे डेटा लेयर में किए जाने वाले आसान फ़ंक्शन कॉल हों, इससे थोड़े फ़ायदे के लिए जटिलता बढ़ सकती है.

ज़रूरत पड़ने पर ही इस्तेमाल के उदाहरण जोड़ना एक अच्छा तरीका है. अगर आपको लगता है कि आपका यूज़र इंटरफ़ेस (यूआई) लेयर, उपयोग के उदाहरणों के ज़रिए करीब-करीब सटीक तरीके से डेटा ऐक्सेस कर रहा है, इसलिए यह इस तरीके से डेटा को सिर्फ़ ऐक्सेस करने के लिए समझना ज़रूरी है.

डेटा लेयर के ऐक्सेस पर पाबंदी लगाने का फ़ैसला आपका और यह भी देख सकते हैं कि क्या आपको सख्त नियम और लचीले अप्रोच का इस्तेमाल करें.

टेस्ट करना

डोमेन की जांच करते समय सामान्य जांच से जुड़े दिशा-निर्देश लागू होते हैं लेयर. अन्य यूज़र इंटरफ़ेस (यूआई) टेस्ट के लिए, डेवलपर आम तौर पर नकली डेटा स्टोर करने की जगहों का इस्तेमाल करते हैं और यह को इस्तेमाल करना अच्छा रहेगा.

सैंपल

नीचे दिए गए Google नमूने, डोमेन लेयर के इस्तेमाल के बारे में बताते हैं. इस दिशा-निर्देश को देखने के लिए, उन्हें एक्सप्लोर करें: