छोटा जवाब
- JSON फ़ॉर्मैटर खोलिए, पहली फ़ाइल चिपकाइए, इंडेंटेशन दो स्पेस पर रखिए, और हर ऑब्जेक्ट की कुंजियाँ क्रम में लगाइए पर सही का निशान लगाइए। नतीजा कॉपी कर लीजिए।
- टेक्स्ट डिफ़ खोलिए और उसे बाएँ डिब्बे में चिपका दीजिए।
- दूसरी फ़ाइल के साथ भी वही कीजिए, दाएँ डिब्बे में।
अब जो जगमगाता है वह असली है: कोई बदला हुआ मान, कोई प्रकट हुई कुंजी, कोई गया हुआ प्रविष्टि। फ़ॉर्मैटिंग के फ़र्क और क्रम बदल चुकी कुंजियाँ, जो आम डिफ़ को डुबो देतीं, गायब हैं — क्योंकि तुलना शुरू होने से पहले दोनों पक्ष एक ही हिज्जे में लिखे जा चुके थे।
दोनों में से किसी पन्ने में कोई नेटवर्क सुविधा है ही नहीं — यह जानना काम का है, क्योंकि लोग जो JSON मिलाते हैं वह इतनी बार वही कॉन्फ़िग फ़ाइल होती है जिसमें क्रेडेंशियल अब भी पड़े हैं।
कच्चा JSON डिफ़ लगभग पूरा शोर क्यों है
JSON को खाली जगह की परवाह नहीं, और कुंजियों के क्रम को वह कोई अर्थ नहीं देता। वही दस्तावेज़ एक पंक्ति का हो सकता है या चार सौ का, कुंजियाँ टाइप किए क्रम में या किसी लाइब्रेरी के उगले क्रम में — और टूल दोनों चीज़ें बेझिझक दोबारा लिख देते हैं। एक तरफ़ मिनिफ़ाई, एक तरफ़ फैलाई हुई; एक हाथ से सहेजी, दूसरी वर्णक्रम में लगाने वाले सीरियलाइज़र से: पंक्ति-दर-पंक्ति डिफ़ को दो अनजान फ़ाइलें दिखती हैं।
दो सबसे बुरे मामले बात साफ़ कर देते हैं। मिनिफ़ाई की हुई फ़ाइल एक पंक्ति है, तो उसके खिलाफ़ डिफ़ एक विशाल बदली हुई पंक्ति है — सही और बेकार। और वही सामग्री दूसरे क्रम में रखने वाली दो फ़ाइलें सब-कुछ-बदला बनकर मिलती हैं, जबकि ईमानदार जवाब “कुछ नहीं” होता।
फ़ॉर्मैटर का मानक रूप क्या सुधारता है
दोनों फ़ाइलों को एक ही फ़ॉर्मैटर से, एक ही सेटिंग्स के साथ गुज़ारना वही है जो डिफ़ को चाहिए: हर दस्तावेज़ का एक हिज्जा।
- वही इंडेंटेशन हर कुंजी को उसकी अपनी पंक्ति देता है, तो डिफ़ पंक्ति-दर-पंक्ति काम करता है, और उसके शब्द-निशान उस एक मान की ओर इशारा कर पाते हैं जो किसी पंक्ति के भीतर बदला।
- क्रमबद्ध कुंजियाँ दोनों पक्षों को एक ही क्रम में बिठा देती हैं, और क्रम फ़र्क होना छोड़ देता है। क्रम कोड-पॉइंट से नहीं, कुंजियों के पढ़े जाने के ढंग से लगता है —
item2पहले,item10बाद में — और दोनों पक्षों पर एक जैसा लागू होता है। - और कुछ नहीं हिलता। यह फ़ॉर्मैटर संख्याएँ आपके लिखे अंकों में रखता है और दोहरी कुंजियाँ सुलझाने के बजाय बनाए रखता है — तो मानक रूप देना खुद कोई फ़र्क गढ़ नहीं सकता। फ़ॉर्मैटर गाइड समझाती है कि यह जितना आम होना चाहिए उससे दुर्लभ क्यों है।
एक ईमानदार चेतावनी: क्रमबद्ध नतीजा वह दस्तावेज़ है जिसकी कुंजियाँ खिसक चुकी हैं। आगे का कोई टूल कुंजियों के क्रम की परवाह करता हो — कम करते हैं, पर होते हैं — तो क्रमबद्ध प्रतियों को वह चीज़ मानिए जिनकी तुलना हुई, मूल की जगह लेने वाली नहीं।
नतीजा पढ़ना, और साथ ले जाना
डिफ़ हटी पंक्तियाँ बाईं ओर, जुड़ी पंक्तियाँ दाईं ओर दिखाता है, और बदली पंक्ति के भीतर अलग पड़ते शब्द उभार देता है — मानक रूप पर वह आम तौर पर वही एक मान होता है जो false से true चला गया। बिना बदला बीच का हिस्सा एक गिनती में सिमट जाता है, तो दो हज़ार पंक्तियों की कॉन्फ़िग तीन बदलावों के साथ तीन छोटे अंशों की तरह पढ़ी जाती है।
डाउनलोड एक यूनिफ़ाइड पैच है, एक .patch — वह फ़ॉर्मैट जो कोड-रिव्यू समझता है। वह मानक रूपों का वर्णन करता है, और रिव्यू को वैसे भी अक्सर यही चाहिए: बदलाव, दोबारा-फ़ॉर्मैटिंग के बिना।
यही नुस्खा हर उस चीज़ पर चलता है जो दोनों पन्ने बोलते हैं। YAML और XML इसी तरह मानक रूप में आते हैं; और अलग-अलग स्रोतों से आई एक ही बनावट की दो फ़ाइलों के लिए डिफ़ के अनदेखा-स्विच — खाली जगह, बड़े-छोटे अक्षर, खाली पंक्तियाँ — उसी सोच का हल्का रूप हैं।
अगर आप यह हर हफ़्ते करते हैं
दो बार फ़ॉर्मैट, दो बार चिपकाना — कदम दो पन्नों पर इसलिए रहते हैं कि हर पन्ना एक काम करता है, और हर एक अपने दम पर साबित कर सकता है कि आपके चिपकाए में से कुछ भी कहीं नहीं गया। मगर दोनों ओपन सोर्स हैं: MIT लाइसेंस, बिना निर्भरता के ES मॉड्यूल — फ़ॉर्मैटर का पार्सर कुंजियों का क्रम और अंक सँभालता है, डिफ़ Myers का एल्गोरिद्म है — हर एक के साथ उसे समझाने वाला README।
यह आपके दिन का हिस्सा हो, तो किसी कोडिंग एजेंट को रिपॉज़िटरी पर लगाइए और दो डिब्बों वाला ऐसा पन्ना माँगिए जो मिलाते-मिलाते मानक रूप भी देता चले — parseJson, printJson और compareText बस तीन import दूर हैं। ये मॉड्यूल पढ़े जाने के लिए लिखे गए हैं, और इन्हें उठा ले जाना ही तो वह चीज़ है जिसके लिए लाइसेंस बना है।