Kotlin Academy · पाठ

Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग

Either, NonEmptyList और मान्यीकृत त्रुटि-संचयन का उपयोग करके जटिल डोमेन का मॉडल बनाएँ।

पाठ 4, कुल 4 में से13 चरण

Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग, CoddyKit पर Kotlin Academy का एक निःशुल्क पाठ है। यह 4 में से 4वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Kotlin Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

कार्यात्मक डोमेन मॉडलिंग क्या है

कार्यात्मक डोमेन मॉडलिंग, व्यावसायिक नियमों को प्रकारों में कूटबद्ध करने के लिए बीजीय प्रकारों (Either, Option, सीलबंद वर्गों) का उपयोग करती है। अमान्य अवस्थाओं को संकलन समय पर व्यक्त नहीं किया जा सकता, और त्रुटियाँ फ़ंक्शन हस्ताक्षरों में स्पष्ट होती हैं—कोई छिपी हुई अपवाद-स्थिति नहीं।

इनलाइन/मान वर्गों के साथ मान ऑब्जेक्ट

आदिम प्रकारों के प्रति आसक्ति से बचने के लिए Kotlin के मान वर्गों का उपयोग करें। प्रकार-तंत्र तब UserId को वहाँ भेजने से रोकता है जहाँ PostId अपेक्षित हो:

@JvmInline value class UserId(val value: Long)
@JvmInline value class PostId(val value: Long)

fun findUser(id: UserId): Either<UserError, User> = TODO()
// findUser(PostId(1L))  // Compile error!

डोमेन त्रुटियों के लिए सीलबंद वर्ग

त्रुटियों को सीलबंद वर्ग पदानुक्रमों के रूप में मॉडल करें। प्रत्येक उपवर्ग में केवल उस त्रुटि-स्थिति से संबंधित जानकारी होती है:

sealed class UserError {
    data class NotFound(val id: UserId) : UserError()
    data class EmailTaken(val email: String) : UserError()
    data class ValidationFailed(val field: String, val reason: String) : UserError()
}

Validated: अनेक त्रुटियों का संचय

जब आप सभी सत्यापन त्रुटियों को एक साथ बताना चाहते हों, केवल पहली त्रुटि को नहीं, तो Arrow के Validated या Raise DSL में zipOrAccumulate का उपयोग करें। यह त्रुटियों को एक NonEmptyList में संचित करता है:

import arrow.core.Validated
import arrow.core.valid
import arrow.core.invalid

fun validateName(name: String): Validated<String, String> =
    if (name.isNotBlank()) name.valid() else "Name is blank".invalid()

सत्यापनों का संयोजन

कई Validated परिणामों को मिलाने के लिए zip() का उपयोग करें। यदि कोई भी Invalid हो, तो सभी त्रुटियाँ संचित की जाती हैं:

val result: Validated<NonEmptyList<String>, User> =
    validateName(name).zip(validateEmail(email)) { n, e -> User(n, e) }
        .mapLeft { it }

अवैध अवस्थाओं को अप्रतिनिधेय बनाना

नल-स्वीकारी email और isVerified फ़्लैग वाले User के बजाय सीलबंद उपवर्गों का उपयोग करें, ताकि प्रकार-तंत्र अप्रमाणित उपयोगकर्ता के ईमेल तक पहुँचने से रोक सके:

sealed class User {
    data class Unverified(val id: UserId, val pendingEmail: String) : User()
    data class Verified(val id: UserId, val email: String) : User()
}

स्मार्ट निर्माणकर्ता

सार्वजनिक निर्माणकर्ताओं के बजाय ऐसे सहचर ऑब्जेक्ट फ़ैक्टरी फ़ंक्शन का उपयोग करें जो Either या Option लौटाते हों। इससे सुनिश्चित होता है कि उदाहरण हमेशा मान्य अवस्था में हों:

class Email private constructor(val value: String) {
    companion object {
        fun of(raw: String): Either<String, Email> =
            if (raw.contains("@") && raw.length <= 255) Email(raw).right()
            else "Invalid email format".left()
    }
}

एक प्रवाह में Either और Option का संयोजन

वास्तविक डोमेन क्रिया आम तौर पर रिपॉज़िटरी खोजों (Option) को सत्यापनों (Either) के साथ क्रम से जोड़ती है। उन्हें सहज ढंग से संयोजित करने के लिए Arrow के either { } ब्लॉक में .bind() का उपयोग करें:

fun createPost(authorId: UserId, title: String, body: String): Either<PostError, Post> = either {
    val author = userRepo.findById(authorId).toEither { PostError.AuthorNotFound }.bind()
    val validTitle = validateTitle(title).bind()
    postRepo.save(Post(author, validTitle, body))
}

अपरिवर्तनीयता और प्रतिलिपि

डोमेन इकाइयाँ अपरिवर्तनीय होनी चाहिए। नई अवस्थाएँ बनाने के लिए डेटा वर्गों और copy() का उपयोग करें। Arrow का Lens, arrow-optics से, बिना परिवर्तन किए नेस्टेड अद्यतनों को सुविधाजनक बनाता है:

val updated = user.copy(email = "new@example.com")
// Arrow Optics:
val emailLens = User.email
val updatedWithLens = emailLens.set(user, "new@example.com")

सीलबंद वर्गों के साथ प्रकार-सुरक्षित विन्यास

अनुप्रयोग विन्यास के विभिन्न रूपों को सीलबंद वर्गों से मॉडल करें, ताकि कंपाइलर आपको प्रत्येक मामले को संभालने के लिए बाध्य करे:

sealed class DbConfig {
    data class Postgres(val url: String, val user: String, val pass: String) : DbConfig()
    data class InMemory(val dbName: String = "test") : DbConfig()
}

लाभ एक नज़र में

Arrow के मुख्य प्रकारों के साथ कार्यात्मक डोमेन मॉडलिंग से ये लाभ मिलते हैं:

  • डोमेन कोड में नल-पॉइंटर अपवाद नहीं
  • फ़ंक्शन हस्ताक्षरों में स्पष्ट त्रुटियाँ
  • सीलबंद पदानुक्रमों पर when की पूर्ण जाँचें
  • परीक्षण योग्य शुद्ध फ़ंक्शन
  • स्वयं-दस्तावेज़ीकरण वाला कोड

त्वरित जाँच

अपवाद फेंकने की तुलना में डोमेन त्रुटियों के लिए sealed class पदानुक्रम का उपयोग करने का प्राथमिक लाभ क्या है?

पुनरावलोकन: Arrow के मुख्य प्रकारों के साथ कार्यात्मक डोमेन मॉडलिंग

मुख्य बातें:

  • मान वर्ग आदिम प्रकारों के प्रति आसक्ति से बचाते हैं
  • सीलबंद त्रुटि पदानुक्रम विफलता के सभी मामलों को स्पष्ट और प्रकार-सुरक्षित बनाते हैं
  • स्मार्ट निर्माणकर्ता मान्य उदाहरणों की गारंटी देते हैं
  • either { }.bind() विफल हो सकने वाली क्रियाओं को साफ़-सुथरे ढंग से संयोजित करता है
  • अपरिवर्तनीय डेटा + सुरक्षित अवस्था-परिवर्तनों के लिए copy() / Arrow Optics
शुरुआत निःशुल्क

एआई शिक्षक के साथ Kotlin सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
51
पाठ
203

अक्सर पूछे जाने वाले प्रश्न

क्या “Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग” पाठ निःशुल्क है?

हाँ — Kotlin Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Kotlin Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग” में मैं क्या सीखूँगा?

Either, NonEmptyList और मान्यीकृत त्रुटि-संचयन का उपयोग करके जटिल डोमेन का मॉडल बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Kotlin Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Kotlin Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Kotlin Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 4वाँ पाठ है।

“Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Kotlin Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Kotlin Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Either : Exceptions के बिना Typed Error Handling
  2. Arrow Raise DSL: टाइपयुक्त त्रुटियों का संयोजन
  3. Option और Nullable: प्रत्येक का उपयोग कब करें
  4. Arrow के मुख्य प्रकारों से कार्यात्मक डोमेन मॉडलिंग
← Kotlin Academy पर वापस जाएँ