ड्रैग-एंड-ड्रॉप प्रक्रिया डिज़ाइन गलतियाँ और उन्हें कैसे रीफ़ैक्टर करें
ड्रैग-एंड-ड्रॉप प्रक्रिया डिज़ाइन की गलतियाँ वर्कफ़्लोज़ को बदलना मुश्किल और टूटने में आसान बना देती हैं। आम एंटी-पैटर्न और व्यावहारिक रीफ़ैक्टरिंग कदम सीखें।

क्यों ड्रैग-एंड-ड्रॉप वर्कफ़्लो गलत हो जाते हैं
विज़ुअल प्रोसेस एडिटर इसलिए सुरक्षित लगते हैं क्योंकि आप पूरा फ्लो देख लेते हैं। लेकिन डायग्राम फिर भी धोखा दे सकता है। वर्कफ़्लो साफ़-सुथरा दिखकर प्रोडक्शन में फेल हो सकता है जब असली यूज़र, असली डेटा और असली टाइमिंग की समस्याएँ सामने आती हैं।
कई समस्याएँ इस सोच से आती हैं कि डायग्राम एक चेकलिस्ट है, जबकि असल में यह एक प्रोग्राम है। ब्लॉक्स में अभी भी लॉजिक होता है। वे स्टेट बनाते हैं, ब्रांच करते हैं, रिट्राय करते हैं और साइड-इफेक्ट ट्रिगर करते हैं। जब ये हिस्से स्पष्ट नहीं होते, तो “छोटे” एडिट भी बर्ताव silently बदल देते हैं।
वर्कफ़्लो एंटी-पैटर्न एक दोहरने योग्य बुरा पैटर्न होता है जो बार-बार परेशानी पैदा करता है। यह केवल एक बग नहीं है—यह एक आदत है, जैसे महत्वपूर्ण स्टेट को डायग्राम के एक कोने में छुपाना और कहीं और उपयोग करना, या फ्लो को इतना बड़ा होने देना कि कोई भी उसके बारे में तर्क नहीं कर सके।
लक्षण सामान्य हैं:
- एक ही इनपुट अलग रन में अलग परिणाम देता है
- डीबगिंग अंदाजों पर निर्भर हो जाती है क्योंकि आप नहीं बता पाते कहाँ वैल्यू बदली
- छोटे एडिट अनजाने में अनसंबंधित पाथ तोड़ देते हैं
- फिक्सेस और ब्रांच जोड़ते हैं बजाय उन्हें घटाने के
- फेल्यर आंशिक अपडेट छोड़ते हैं (कुछ स्टेप सफल, कुछ नहीं)
सस्ता और दृश्य से शुरू करें: स्पष्ट नामकरण, तंग ग्रुपिंग, मृत पाथ हटाना, और हर स्टेप के इनपुट व आउटपुट को स्पष्ट बनाना। AppMaster जैसे प्लेटफ़ॉर्म में यह अक्सर Business Process को केंद्रित रखने का मतलब होता है—हर ब्लॉक एक काम करे और डेटा खुले तौर पर पास हो।
फिर संरचनात्मक समस्याओं के लिए गहरे रीफैक्टर की योजना बनाएं: स्पैगेटी फ्लो को अलग करना, निर्णय केंद्रीकृत करना, और आंशिक सफलता के लिए कम्पनसेशन जोड़ना। लक्ष्य सिर्फ़ सुंदर डायग्राम नहीं है। लक्ष्य एक ऐसा वर्कफ़्लो है जो हर बार एक जैसा व्यवहार करे और जब रिक्वायरमेंट बदलें तो उसे सुरक्षित तरीके से बदला जा सके।
छुपा हुआ स्टेट: अचानक चौंकाने का शांत स्रोत
कई विज़ुअल वर्कफ़्लो फेल्यर एक अदृश्य समस्या से शुरू होते हैं: स्टेट जिस पर आप भरोसा करते हैं लेकिन जिसे आपने स्पष्ट नामित नहीं किया।
स्टेट वह सब कुछ है जिसे आपका वर्कफ़्लो सही व्यवहार के लिए याद रखता है। इसमें वेरिएबल्स (जैसे customer_id), फ़्लैग्स (जैसे is_verified), टाइमर्स और रिट्राय, और आपके डायग्राम के बाहर का स्टेट भी शामिल है: डेटाबेस रो, CRM रिकॉर्ड, भुगतान स्थिति, या कोई संदेश जो पहले ही भेज दिया गया हो।
छुपा हुआ स्टेट तब दिखाई देता है जब वह “मेमोरी” किसी ऐसी जगह रहती है जिसकी आप उम्मीद नहीं करते। आम उदाहरण हैं: नोड सेटिंग्स जो चुपके से वेरिएबल्स जैसा व्यवहार करती हैं, इम्प्लिसिट डिफ़ॉल्ट्स जिन्हें आपने जानबूझ कर सेट नहीं किया, या साइड-इफेक्ट्स जो डेटा बदलते हैं बिना स्पष्ट किए। एक स्टेप जो कुछ “चेक” करता है पर साथ ही एक स्टेटस फ़ील्ड अपडेट भी कर देता है, क्लासिक जाल होता है।
यह अक्सर तब तक काम करता है जब तक आप एक छोटा एडिट नहीं करते। आप एक नोड को मूव करते हैं, एक सबफ्लो को री-यूज़ करते हैं, डिफ़ॉल्ट बदलते हैं, या एक नई ब्रांच जोड़ते हैं। अचानक वर्कफ़्लो “रैंडम” व्यवहार करने लगता है क्योंकि कोई वेरिएबल ओवरराइट हो गया, कोई फ़्लैग रिसैट नहीं हुआ, या कोई बाहरी सिस्टम थोड़ी अलग वैल्यू वापस कर रहा है।
स्टेट कहाँ छिपता है (यहाँ तक कि साफ दिखने वाले डायग्राम में भी)
स्टेट अक्सर छिपता है:
- नोड सेटिंग्स में जो वेरिएबल की तरह व्यवहार करती हैं (हार्डकोडेड IDs, डिफ़ॉल्ट स्टेटस)
- पहले के स्टेप्स से इम्प्लिसिट आउटपुट ("use last result")
- "रीड" स्टेप्स जो साथ में राइट भी करते हैं (DB अपडेट्स, स्टेटस परिवर्तन)
- बाहरी सिस्टम्स (पेमेंट, ईमेल/SMS प्रोवाइडर्स, CRMs) जो पिछले एक्शंस को याद रखते हैं
- टाइमर्स और रिट्राय जो एक ब्रांच बदल जाने के बाद भी चलते रहते हैं
वह नियम जो ज़्यादातर आश्चर्यों को रोकता है
स्टेट को स्पष्ट और नामित बनाइए। अगर कोई वैल्यू बाद में मायने रखती है, तो उसे एक स्पष्ट नाम वाले वेरिएबल में स्टोर करें, एक ही जगह सेट करें, और जब पूरा काम हो जाए तो रिसैट कर दें।
उदाहरण के लिए, AppMaster के Business Process Editor में हर महत्वपूर्ण आउटपुट को एक फर्स्ट-क्लास वेरिएबल की तरह ट्रीट करें, न कि कुछ जो आपने माना कि "उपलब्ध है क्योंकि एक नोड पहले चला था"। एक छोटा बदलाव—status का नाम बदलकर payment_status करना, और उसे तब ही सेट करना जब पुष्टि की गई पेमेंट रिस्पॉन्स मिले—अगले महीने फ्लो बदलने पर घंटों का डीबग बचा सकता है।
स्पैगेटी फ्लो: जब डायग्राम पढ़ने लायक नहीं रहता
एक स्पैगेटी फ्लो वह विज़ुअल प्रोसेस है जहाँ कनेक्टर्स हर जगह क्रॉस करते हैं, स्टेप्स आश्चर्यजनक जगहों पर लूप बैक करते हैं, और कंडीशन्स इतनी गहरी नेस्टेड होती हैं कि कोई भी बिना ज़ूम और स्क्रोल किए हैप्पी पाथ समझा नहीं सकता। अगर आपका डायग्राम एक नैपकिन पर खींचे गए सबवे मैप जैसा लग रहा है, तो आप पहले से ही इसके दाम चुका रहे हैं।
इससे रिव्यू अविश्वसनीय हो जाते हैं। लोग एज केस मिस करते हैं, अप्रूवल में समय लगता है, और किसी एक कोने में बदलाव दूर कहीं कुछ तोड़ देता है। किसी घटना के दौरान, बुनियादी सवालों का जवाब देना मुश्किल हो जाता है जैसे "अंत में कौन सा स्टेप चला?" या "हम इस ब्रांच में क्यों पहुँचे?"
स्पैगेटी आमतौर पर अच्छी नीयत से बढ़ता है: किसी काम करने वाली ब्रांच को "बस एक बार" कॉपी-पेस्ट करना, दबाव में क्विक फिक्स जोड़ना, एक्सेप्शन हैंडलिंग को नेस्टेड कंडीशन्स के रूप में लेयर करना, पहले के स्टेप्स की तरफ़ बैक-जंप करना बजाय रीयूजेबल सब-प्रोसेस बनाने के, या एक ही ब्लॉक में बिज़नेस रूल, डेटा फ़ॉर्मैटिंग और नोटिफिकेशन मिक्स करना।
एक आम उदाहरण ऑनबोर्डिंग है। यह साफ़ शुरू होता है, फिर फ्री ट्रायल्स, पार्टनर रेफरल्स, मैनुअल रिव्यू और "VIP" हैंडलिंग के अलग ब्रांच जोड़ने पर बढ़ता है। कुछ स्प्रिंट के बाद, डायग्राम में कई बैक-एजेस "Collect docs" की ओर और कई अलग जगहों पर वेलकम ईमेल भेजने वाली नोड्स हो जाती हैं।
एक स्वस्थ लक्ष्य सरल है: सामान्य केस के लिए एक मुख्य पाथ, और एक्सेप्शन्स के लिए स्पष्ट साइड पाथ्स। AppMaster के Business Process Editor जैसे टूल्स में यह अक्सर दोहराए जाने वाले लॉजिक को रीउस करने योग्य सब-प्रोसेस में निकालने, ब्रांचों को इंटेंट के नाम देने ("Needs manual review"), और लूप्स को स्पष्ट व सीमित रखने का मतलब होता है।
निर्णय का ओवरलोड और डुप्लिकेट रूल्स
एक सामान्य पैटर्न कई कंडीशन नोड्स की लंबी चेन है: पहले A चेक करो, फिर बाद में फिर A चेक करो, फिर तीन अलग जगहों पर B चेक करो। यह "बस एक और नियम" से शुरू होता है, और फिर वर्कफ़्लो भूलभुलैया बन जाता है जहाँ छोटे बदलाव बड़े साइड इफ़ेक्ट्स लाते हैं।
बड़ा जोखिम फैलाव वाले नियमों का है जो धीरे-धीरे असहमत हो जाते हैं। एक पाथ किसी एप्लीकेशन को अप्रूव कर सकता है क्योंकि क्रेडिट स्कोर हाई है। दूसरे पाथ में वही एप्लीकेशन ब्लॉक हो सकता है क्योंकि एक पुराना स्टेप "missing phone number" को हार्ड स्टॉप मानता है। दोनों निर्णय स्थानीय तौर पर "ठीक" दिखाई दे सकते हैं, पर साथ मिलकर अप्रत्याशित परिणाम देते हैं।
डुप्लिकेट चेक्स क्यों संघर्ष पैदा करते हैं
जब वही नियम डायग्राम में कई जगह दोहराए जाते हैं, लोग एक कॉपी अपडेट करके दूसरों को भूल जाते हैं। समय के साथ चेक्स समान दिखते हैं पर एक जैसे नहीं होते: एक कहता है "country = US", दूसरा कहता है "country in (US, CA)"," और तीसरा "currency = USD" को प्रोक्सी के रूप में इस्तेमाल करता है। वर्कफ़्लो चल तो रहा है, पर यह पूर्वानुमेय नहीं रहा।
एक अच्छा रीफैक्टर निर्णयों को एक स्पष्ट नामित निर्णय स्टेप में सम्मिलित करना है जो कुछ सीमित परिणाम देता हो। AppMaster के Business Process Editor में यह अक्सर संबंधित चेक्स को एक ही निर्णय ब्लॉक में ग्रुप करने और ब्रांचों को अर्थपूर्ण बनाने का मतलब होता है।
आउटकम्स रखिए सरल, उदाहरण के लिए:
- Approved
- Needs info
- Rejected
- Manual review
फिर सब कुछ उस एक निर्णय बिंदु के माध्यम से रूट करें बजाय छोटे-छोटे निर्णय पूरे फ्लो में बिखेरने के। अगर कोई नियम बदलता है, तो आप उसे एक बार अपडेट करते हैं।
एक ठोस उदाहरण: साइनअप वेरिफिकेशन वर्कफ़्लो तीन जगह ईमेल फॉर्मेट चेक करता है (OTP से पहले, OTP के बाद, और अकाउंट क्रिएशन से पहले)। सारे वेलिडेशन को एक "Validate request" निर्णय में ले जाएँ। अगर परिणाम "Needs info" है, तो एक ही मैसेज स्टेप पर रूट करें जो यूज़र को ठीक से बताये कि क्या कमी है, बजाय बाद में सामान्य एरर दिखाने के।
आंशिक सफलता के बाद गायब कम्पनसेशन स्टेप्स
सबसे महँगी गलतियों में से एक यह मानना है कि हर वर्कफ़्लो या तो पूरी तरह सफल होगा या पूरी तरह फेल। असली फ्लोज अक्सर आधे रास्ते तक सफल होते हैं। अगर बाद वाला स्टेप टूट जाए, तो आपके पास गड़बड़ बचती है: पैसा कैप्चर हो गया, मैसेज भेजे गए, रिकॉर्ड बने, पर वापस लौटने का साफ़ तरीका नहीं है।
उदाहरण: आप ग्राहक का कार्ड चार्ज करते हैं, फिर ऑर्डर बनाते हैं। पेमेंट सफल हो गया, पर ऑर्डर क्रिएशन फेल हो जाता है क्योंकि इन्वेंटरी सर्विस टाइमआउट हो गई। अब सपोर्ट को गुस्से भरे ईमेल मिलते हैं, फाइनेंस चार्ज देखता है, और सिस्टम में कोई मेल खाता ऑर्डर नहीं होता।
कम्पनसेशन वह "अनडू" (या "इसे सुरक्षित बनाओ") पाथ है जो तब चलता है जब कुछ आंशिक सफलता के बाद फेल हो। यह परफ़ेक्ट होने की ज़रूरत नहीं है, पर यह जानबूझकर होना चाहिए। सामान्य तरीकें हैं: एक्शन को उलटना (रिफ़ंड, रद्द करना, ड्राफ्ट डिलीट करना), परिणाम को सुरक्षित स्थिति में बदलना ("Payment captured, fulfillment pending" चिह्नित करना), मैनुअल रिव्यू के पास संदर्भ के साथ रूट करना, और आइडेम्पोटेंसी चेक्स का उपयोग ताकि रिट्राइज डबल-चार्ज या डबल-सेंड न कर दें।
कम्पनसेशन कहाँ रखा जाता है यह महत्वपूर्ण है। सारे क्लीनअप को डायग्राम के अंत में एक "एरर" बॉक्स में छिपाकर न रखें। उसे रिस्की स्टेप के बगल में रखें, जब आपके पास अभी भी ज़रूरी डेटा हो (payment ID, reservation token, external request ID)। AppMaster जैसे टूल्स में इसका मतलब अक्सर कॉल के ठीक बाद उन IDs को सेव करना, और फिर सफलता बनाम विफलता पर तुरंत ब्रांच करना होता है।
एक उपयोगी नियम: हर स्टेप जो किसी बाहरी सिस्टम से बात करता है, उसे आगे बढ़ने से पहले दो प्रश्नों का उत्तर देना चाहिए: "हमने क्या बदला?" और "अगर अगला स्टेप फेल हो जाए तो हम उसे कैसे अनडू या कंटेन करेंगे?"
बाहरी कॉल्स के आसपास कमजोर एरर हैंडलिंग
कई फेल्यर तब दिखाई देते हैं जब आपका वर्कफ़्लो आपकी प्रणाली से बाहर जाता है। बाहरी कॉल्स गड़बड़ तरीके से फेल होती हैं: धीमा रिस्पॉन्स, अस्थायी आउटेज, डुप्लिकेट रिक्वेस्ट्स, और आंशिक सफलता। अगर आपका डायग्राम मानता है "कॉल सफल हुई" और आगे बढ़ जाता है, तो यूज़र्स को अंततः मिसिंग डेटा, डबल चार्जेस, या गलत समय पर भेजे गए नोटिफिकेशन दिखेंगे।
शुरू में उन स्टेप्स को चिन्हित करें जो उन कारणों से फेल हो सकते हैं जिन पर आपका नियंत्रण नहीं है: बाहरी APIs, पेमेंट्स और रिफंड्स (उदाहरण के लिए, Stripe), संदेश (ईमेल/SMS, Telegram), फ़ाइल ऑपरेशन्स, और क्लाउड सर्विसेज।
दो जाल खास तौर पर आम हैं: गायब टाइमआउट और ब्लाइंड रिट्राइज। बिना टाइमआउट के, एक धीमा रिक्वेस्ट पूरे प्रोसेस को फ्रीज़ कर सकता है। रिट्राइज्स के साथ पर नियम न होने पर आप चीज़ें और बिगाड़ सकते हैं, जैसे वही मैसेज तीन बार भेज देना या थर्ड-पार्टी सिस्टम में डुप्लिकेट बनाना।
यहीं आइडेम्पोटेंसी का महत्व आता है। साधारण शब्दों में, एक आइडेम्पोटेंट एक्शन फिर से चलाने पर सुरक्षित होता है। अगर वर्कफ़्लो किसी स्टेप को दोबारा चलाता है, तो उसे दूसरा चार्ज, दूसरा ऑर्डर, या दूसरा "वेलकम" मैसेज नहीं बनाना चाहिए।
एक व्यावहारिक फिक्स यह है कि आप कॉल करने से पहले एक रिक्वेस्ट की-और-स्टेट सेव करें। AppMaster के Business Process Editor में यह उतना ही सरल हो सकता है जितना कि एक रिकॉर्ड लिखना: "payment_attempt: key=XYZ, status=pending," और फिर रिस्पॉन्स के बाद उसे "success" या "failed" मार्क करना। अगर वर्कफ़्लो फिर से उसी स्टेप पर पहुँचता है, तो पहले उस रिकॉर्ड को चेक करें और तय करें क्या करना है।
एक भरोसेमंद पैटर्न कुछ ऐसा दिखता है:
- टाइमआउट और रिट्राय लिमिट्स सेट करें (और परिभाषित करें कौन-से एरर्स रिट्रायबल हैं)
- कॉल से पहले रिक्वेस्ट की और करंट स्टेट सेव करें
- बाहरी कॉल करें
- सफलता पर रिज़ल्ट लिखें और स्टेट को कंप्लीट मार्क करें
- विफलता पर एरर लॉग करें और यूज़र-फ्रेंडली रिकवरी पाथ पर रूट करें
ओवरलोडेड स्टेप्स और अस्पष्ट जिम्मेदारियाँ
एक सामान्य गलती एक ऐसे स्टेप का निर्माण है जो चुपके से चार काम कर देता है: इनपुट वेलिडेट करना, वैल्यूज़ कैल्क्युलेट करना, डेटाबेस में लिखना, और लोगों को नोटिफाई करना। यह प्रभावी लग सकता है, पर इससे बदलाव जोखिम भरा हो जाता है। जब कुछ टूटता है, आप नहीं जानते किस हिस्से ने किया, और आप इसे सुरक्षित रूप से कहीं और रीयूज़ नहीं कर सकते।
ओवरलोडेड स्टेप कैसे पहचानें
एक स्टेप ओवरलोडेड होता है जब उसका नाम अस्पष्ट हो (जैसे "Handle order") और आप इसके आउटपुट को एक वाक्य में वर्णित न कर सकें। एक और लाल झंडा है बहुत सारे इनपुट जो केवल स्टेप के "कुछ हिस्सों" द्वारा उपयोग होते हैं।
ओवरलोडेड स्टेप अक्सर यह मिक्स करते हैं:
- वेलिडेशन और म्यूटेशन (save/update)
- बिज़नेस रूल और प्रेज़ेंटेशन (मैसेज फ़ॉर्मैटिंग)
- एक ही जगह कई बाहरी कॉल्स
- कई साइड-इफेक्ट बिना स्पष्ट ऑर्डर के
- अस्पष्ट सफलता मानदंड ("done" का क्या मतलब है?)
स्पष्ट कॉन्ट्रैक्ट्स वाले छोटे ब्लॉक्स में रीफ़ैक्टर करें
बड़े स्टेप को छोटे, नामित ब्लॉक्स में विभाजित करें जहाँ हर ब्लॉक का एक ही काम हो और स्पष्ट इनपुट-आउटपुट हो। एक सरल नामकरण पैटर्न मदद करता है: स्टेप्स के लिए वर्ब्स (Validate Address, Calculate Total, Create Invoice, Send Confirmation) और डेटा ऑब्जेक्ट्स के लिए नाउन्स।
इनपुट्स और आउटपुट्स के नाम भी स्थिर रखें। उदाहरण के लिए, "OrderDraft" (सेव करने से पहले) और "OrderRecord" (सेव करने के बाद) का उपयोग करें बजाय "order1/order2" या "payload/result" के। यह डायग्राम को महीनों बाद भी पठनीय बनाता है।
जब आप किसी पैटर्न को दोहराते हैं, तो उसे एक रीयूजेबल सबफ्लो में एक्सट्रैक्ट करें। AppMaster के Business Process Editor में यह अक्सर "Validate -> Normalize -> Persist" को एक साझा ब्लॉक में मूव करने जैसा दिखता है जिसे कई वर्कफ़्लोज़ उपयोग कर सकते हैं।
उदाहरण: एक ऑनबोर्डिंग वर्कफ़्लो जो "यूज़र बनाता है, परमिशन्स सेट करता है, ईमेल भेजता है, और ऑडिट लॉग करता है" को चार स्टेप्स बना दिया जा सकता है प्लस एक रीयूजेबल "Write Audit Event" सबफ्लो। इससे टेस्टिंग सरल होती है, एडिट सुरक्षित होते हैं, और सरप्राइज़ कम होते हैं।
गंदे वर्कफ़्लो को चरण-दर-चरण रीफ़ैक्टर कैसे करें
अधिकांश वर्कफ़्लो समस्याएँ "बस एक और" नियम या कनेक्टर जोड़ने से आती हैं जब तक कोई भी भविष्यवाणी करने योग्य नहीं रह जाता। रीफ़ैक्टर का मकसद फ्लो को फिर से पठनीय बनाना और हर साइड-इफेक्ट व फेल्योर केस को दिखाई देना है।
शुरुआत हैप्पी पाथ को एक साफ़ लाइन के रूप में ड्रॉ करके करें—स्टार्ट से फिनिश तक। अगर मुख्य लक्ष्य "ऑर्डर अप्रूव करना" है, तो वह लाइन केवल आवश्यक स्टेप्स दिखाए जब सब कुछ सही चले।
फिर छोटे पास में काम करें:
- हैप्पी पाथ को एक सिंगल फॉरवर्ड पाथ के रूप में फिर से ड्रॉ करें, सुसंगत स्टेप नामों (verb + object) के साथ
- हर साइड-इफेक्ट की सूची बनाएं (ईमेल भेजना, कार्ड चार्ज करना, रिकॉर्ड बनाना) और हर एक को एक अलग स्पष्ट स्टेप बनाएं
- हर साइड-इफेक्ट के लिए उसकी फ़ेल्योर पाथ उसी के बगल में जोड़ें, जिसमें कम्पनसेशन भी शामिल हो जब आपने कुछ बदल दिया हो
- दोहराए गए कंडीशन्स को एक निर्णय बिंदु में बदलें और वहाँ से रूट करें
- दोहराए गए चंक्स को सबफ्लो में निकालें, और वेरिएबल्स को ऐसा नाम दें कि उनके अर्थ स्पष्ट हों (
payment_statusबेहतर हैflag2से)
छिपी जटिलता को जल्दी पकड़ने का तरीका यह पूछना है: "अगर यह स्टेप दो बार चला, तो क्या टूटेगा?" अगर उत्तर है "हम डबल-चार्ज कर सकते हैं" या "दो ईमेल भेज सकते हैं", तो आपको स्पष्ट स्टेट और आइडेम्पोटेंट व्यवहार चाहिए।
उदाहरण: एक ऑनबोर्डिंग वर्कफ़्लो अकाउंट बनाता है, प्लान असाइन करता है, Stripe को चार्ज करता है, और वेलकम मैसेज भेजता है। अगर चार्ज सफल हो और वेलकम मैसेज फेल, तो आप पैड यूज़र को बिना एक्सेस के नहीं चाहेंगे। पास के कम्पनसेशन ब्रांच जोड़ें: यूज़र को pending_welcome चिन्हित करें, मैसेजिंग रिट्राय करें, और अगर रिट्राइज फेल हों तो रिफंड और प्लान रिवर्ट करें।
AppMaster में यह सफाई तब आसान होती है जब आप Business Process Editor फ्लो को शैलो रखें: छोटे स्टेप्स, स्पष्ट वेरिएबल नाम, और "Charge payment" या "Send notification" जैसे सबफ्लो जिन्हें आप हर जगह रीयूज़ कर सकें।
सामान्य रीफ़ैक्टरिंग जाल जिनसे बचें
विज़ुअल वर्कफ़्लोज़ के रीफ़ैक्टर का मकसद प्रोसेस को समझने में आसान और बदलाव के लिए सुरक्षित बनाना है। पर कुछ फिक्स नई जटिलता जोड़ देते हैं, खासकर जब समय कम हो।
एक जाल है पुराने पाथ्स को "बस रखो" बिना किसी स्पष्ट स्विच, वर्शन मार्कर, या रिटायर डेट के। लोग पुरानी रूट टेस्ट करना जारी रखते हैं, सपोर्ट उसे संदर्भित करता है, और जल्द ही आप दो प्रक्रियाएँ मेंटेन कर रहे होते हैं। अगर धीरे-धीरे रोलआउट चाहिए, तो उसे स्पष्ट करें: नए पाथ का नाम रखें, एक दृश्य निर्णय से उसे गैट करें, और तय करें कब पुराना हटेगा।
टेम्पररी फ़्लैग्स एक और धीरे-धीरे रिसाव हैं। डिबग या एक-सप्ताह माइग्रेशन के लिए बनाए गए फ़्लैग अक्सर स्थायी बन जाते हैं, और हर नया बदलाव उसे ध्यान में रखता है। फ़्लैग्स को पेरिश करने योग्य मानें: क्यों हैं, किसके जिम्मे हैं, और हटाने की तारीख लिखें।
तीसरा जाल है मॉडल में बदलाव करने की बजाय एक-ऑफ एक्सेप्शन्स जोड़ना। अगर आप बार-बार "स्पेशल केस" नोड्स डाल रहे हैं, तो डायग्राम साइडवेज़ बढ़ता है और नियम अप्रत्याशित हो जाते हैं। जब वही एक्सेप्शन दो बार दिखे, तो अक्सर डेटा मॉडल या प्रोसेस स्टेट्स में सुधार की ज़रूरत होती है।
अंत में, बिज़नेस रूल्स को अनसंबंधित नोड्स के अंदर छिपाकर न रखें सिर्फ़ इसलिए कि काम चल जाए। यह खासकर विज़ुअल एडिटर्स में मोहक होता है, पर बाद में कोई भी उस नियम को नहीं ढूँढ पाएगा।
चेतावनी संकेत:
- दो पाथ्स जो लगभग एक ही काम करते हैं पर छोटे अंतर रखते हैं
- अस्पष्ट अर्थ वाले फ़्लैग्स (जैसे "temp2" या "useNewLogic")
- एक्सेप्शन्स जिन्हें केवल एक ही व्यक्ति समझा सकता है
- नियम कई नोड्स में बंटे हुए बिना किसी स्रोत ऑफ ट्रूथ के
- विफलों के बाद जो "फिक्स" नोड्स जोड़े गए बजाय पहले स्टेप में सुधार करने के
उदाहरण: अगर VIP ग्राहकों को अलग अप्रूवल चाहिए, तो उसे तीन जगह छिपाकर न डालें। एक स्पष्ट "Customer type" निर्णय जोड़ें और वहीं से रूट करें।
शिप करने से पहले जल्दी से चेकलिस्ट
अधिकांश समस्याएँ लॉन्च से ठीक पहले ही सामने आती हैं: कोई वर्कफ़्लो असली डेटा के साथ चलाता है और डायग्राम कुछ ऐसा कर देता है जिसे कोई समझ नहीं पाता।
ज़ोर से वाक्य में वॉकथ्रू करें। अगर हैप्पी पाथ एक लंबी कहानी माँगता है, तो फ्लो में संभवतः छिपा हुआ स्टेट, डुप्लिकेट रूल्स, या बहुत सारी ब्रांचें हैं जिन्हें समूहित किया जाना चाहिए।
शिप से पहले एक त्वरित चेक
- हैप्पी पाथ एक साँस में समझा सकें: ट्रिगर, मुख्य स्टेप्स, फ़िनिश लाइन
- हर साइड-इफेक्ट को उसका अलग दिखने वाला स्टेप बनाएं (चार्जिंग, मैसेज भेजना, रिकॉर्ड अपडेट, टिकट बनाना)
- हर साइड-इफेक्ट के लिए तय करें फेल होने पर क्या होगा और आंशिक सफलता को कैसे अनडू करेंगे (रिफंड, रद्द, रोलबैक, या मैनुअल रिव्यू)
- वेरिएबल्स और फ़्लैग्स चेक करें: स्पष्ट नाम, हर एक केवल एक जगह सेट हो रहा हो, और कोई रहस्यमय डिफ़ॉल्ट न हों
- कॉपी-पेस्ट लॉजिक ढूँढें: उसी चेक का कई ब्रांचों में होना, या वही मैपिंग हल्की-सी बदलकर बार-बार होना
एक साधारण टेस्ट जो अधिकांश मुद्दे पकड़ता है
वर्कफ़्लो तीन केस के साथ चलाएं: एक सामान्य सफलता, एक संभावित फेल (जैसे पेमेंट डिक्लाइन), और एक अजीब एज केस (ऑप्शनल डेटा गायब)। देखें कौन-सा स्टेप "काफ़ी चल तो रहा है" पर सिस्टम आधा-छूटा छोड़ देता है।
AppMaster के Business Process Editor में यह अक्सर एक साफ़ रीफ़ैक्टर में बदल जाता है: दोहराए गए चेक्स को एक साझा स्टेप में खींचना, साइड-इफेक्ट्स को स्पष्ट नोड्स बनाना, और हर रिस्की कॉल के पास स्पष्ट कम्पनसेशन पाथ जोड़ना।
एक वास्तविक उदाहरण: ऑनबोर्डिंग फ्लो रीफ़ैक्टर
मान लीजिए एक कस्टमर ऑनबोर्डिंग वर्कफ़्लो है जो तीन काम करता है: यूज़र की पहचान सत्यापित करता है, उनका अकाउंट बनाता है, और पेड़ सब्सक्रिप्शन शुरू करता है। यह सरल लगता है, पर यह अक्सर ऐसा फ्लो बन जाता है जो "अक्सर काम करता है" जब तक कुछ फेल न हो जाए।
गंदा संस्करण
पहला संस्करण धीरे-धीरे बढ़ता है। एक "Verified" चेकबॉक्स जुड़ता है, फिर एक "NeedsReview" फ़्लैग, फिर और फ़्लैग्स। चेक्स जैसे "if verified" कई जगह दिखाई देते हैं क्योंकि हर नई सुविधा अपनी शाखा जोड़ती है।
जल्द ही वर्कफ़्लो ऐसा दिखने लगता है: verify identity, create user, charge card, send welcome email, create workspace, फिर किसी बाद के स्टेप को निर्भर देखकर वापस re-check verification। अगर चार्ज सफल हो पर workspace बनाना फेल, तो कोई रोलबैक नहीं है। ग्राहक का चार्ज हो गया पर अकाउंट आधा बना है, और सपोर्ट टिकट फॉलो करते हैं।
रीफ़ैक्टर
एक साफ़ डिज़ाइन state को दिखाई और नियंत्रित बनाकर शुरू होता है। बिखरे हुए फ़्लैग्स को बदलकर एक स्पष्ट ऑनबोर्डिंग स्टेट रखें (उदाहरण: Draft, Verified, Subscribed, Active, Failed)। फिर "क्या आगे बढ़ें?" लॉजिक को एक निर्णय बिंदु में रखें।
रीफ़ैक्टर के लक्ष्य जो अक्सर जल्दी दर्द हल कर देते हैं:
- एक निर्णय गेट जो स्पष्ट स्टेट पढ़ता है और अगले कदम को रूट करता है
- डायग्राम में कोई दोहराया चेक नहीं, केवल रीयूजेबल वेलिडेशन ब्लॉक्स
- आंशिक सफलता के लिए कम्पनसेशन (रिफंड, सब्सक्रिप्शन रद्द करना, वर्कस्पेस ड्राफ्ट हटाना)
- एक स्पष्ट फेल पाथ जो कारण रिकॉर्ड करे और सुरक्षित बंद हो जाए
उसके बाद, डेटा और वर्कफ़्लो को साथ मॉडल करें। अगर "Subscribed" true है, तो सब्सक्रिप्शन ID, payment ID, और प्रोवाइडर रिस्पॉन्स एक जगह स्टोर करें ताकि कम्पनसेशन बिना अनुमान के चले।
अंत में, फेल्योर केस जानबूझ कर टेस्ट करें: वेरिफिकेशन टाइमआउट, पेमेंट सफलता पर ईमेल फेल होना, वर्कस्पेस क्रिएशन एरर, और डुप्लिकेट वेबहुक इवेंट्स।
अगर आप ये वर्कफ़्लो AppMaster में बना रहे हैं, तो बिज़नेस लॉजिक को रीयूजेबल Business Processes में रखना और प्लेटफ़ॉर्म को साफ़ कोड फिर से जेनरेट करने देना मदद करता है ताकि पुराने ब्रांच्स लटके न रहें। अगर आप जल्दी प्रोटोटाइप करना चाहते हैं (बैकएंड, वेब, और मोबाइल हिस्सों के साथ), तो AppMaster on appmaster.io इसी तरह के एंड-टू-एंड वर्कफ़्लो बिल्ड के लिए बनाया गया है।


