क्या टेक्स्ट मार्कर को स्ट्रिंग्स के अंदर रखना खराब शैली है? क्या कोई विकल्प है?


10

मैं बड़े पैमाने पर तार के साथ काम करता हूं जिसमें बहुत अधिक हेरफेर की आवश्यकता होती है।

उदाहरण के लिए, मैं इस तरह एक स्ट्रिंग उत्पन्न कर सकता हूं:

भाग 1
नाव

अनुभाग ए
प्रोग्रामिंग

भाग 2
प्रोग्रामिंग के लिए विभाजन नौकाओं।

अनुभाग AA
खंड SQL प्रविष्टियाँ।

स्ट्रिंग मैन्युअल रूप से इसके प्रत्येक भाग की जांच करने के लिए बहुत बड़ी होगी। अब मैं करने की जरूरत है splitइस stringएक में stringlistवर्गों और भागों से। मैं दो विकल्पों के बारे में सोच सकता हूं:

एक नियमित अभिव्यक्ति:

QStringList sl = s.split(QRegularExpression("\n(?=Part [0-9]+|Section [A-Z]+)"));

ऐसा लगता है कि यह काम करना चाहिए, लेकिन कभी-कभी अपवाद के माध्यम से फिसल जाता है (आईई: Section SQL Entriesगलती से विभाजन हो जाएगा)

अन्यथा जब मैं कर सकता था तो एक मार्कर रखा जाता है जब मैं प्रारंभिक स्ट्रिंग उत्पन्न करता हूं:

🚤💻पार्ट 1
बोट

🚤💻Section A
प्रोग्रामिंग


प्रोग्रामिंग के लिए .Part 2 विभाजन नौकाओं।

EctionSection AA
खंड SQL प्रविष्टियाँ।

जिसका अर्थ है कि स्ट्रिंग को विभाजित करना आसान हो जाएगा:

QStringList sl = s.split("🚤💻"));

हालांकि कुछ मुझे बताता है कि इनमें से कोई भी अच्छी शैली या प्रोग्रामिंग अभ्यास नहीं है, लेकिन मैं तब तक रहा हूं जब तक इस बिंदु पर चर्चा नहीं हुई और न ही इसका कोई विकल्प मिला।

  • यदि आप मेरे प्रोजेक्ट मैनेजर होते, तो क्या आप इन विधियों में से किसी को स्वीकार करते?
  • यदि नहीं, तो आप मुझे एक सर्वोत्तम अभ्यास के रूप में क्या सुझाव देंगे?

6
यदि आपका प्रोग्राम जानता है कि इन मार्करों को कहां रखा जाए, तो क्यों न शुरू करने के लिए अलग-अलग तारों के रूप में अनुभाग तैयार करें?
जैकब रायहले

मुझे नहीं लगता कि उपयोगकर्ता एक मार्कर है जो आपके वर्तमान एन्कोडिंग में अच्छी तरह से अनुवाद नहीं करता है, एक अच्छा विचार है।
ट्यूलेंस कोरडोवा

2
उपयोग किए जाने वाले वास्तविक प्रतीक काफी हद तक अप्रासंगिक हैं, क्या फर्क पड़ने वाला है, जिस चीज को आप पार्स करने की कोशिश कर रहे हैं, उसका व्याकरण
jk।

4
@Akiva क्या आप प्रदर्शन हिट के बारे में निश्चित हैं? आप किसी भी मामले में समान डेटा के साथ काम कर रहे हैं, मुझे संदेह है कि एक महत्वपूर्ण अंतर होगा। हजारों फ़ंक्शन को एक फ़ंक्शन में लिखें, एक लूप में आमंत्रित करें, और कुछ माप लें।
जैकब रायहले

2
@ अकीवा को पुनः प्राप्त करना और सूची में तत्वों को बदलना एक बड़े तार को विभाजित करने के लिए सबसे खराब होना चाहिए ।
याकूब रायहले

जवाबों:


17

यह एक स्ट्रिंग में पाठ के रूप में एम्बेडेड दस्तावेज़ एन्कोडिंग है बुरा अभ्यास नहीं है। मार्कडाउन, HTML, XML, JSON, YAML, LaTeX आदि के बारे में सोचें।

क्या बुरा अभ्यास पहिया को सुदृढ़ कर रहा है। अपना स्वयं का टेक्स्ट प्रोसेसर लिखने के बजाय, मौजूदा मानक का उपयोग करने के बारे में सोचें। बहुत सारे मुफ्त सॉफ़्टवेयर हैं जो आपके लिए बहुत कुछ करते हैं, और कई के पास एक गैर-प्रतिबंधक लाइसेंस है जो आपको अपने स्वयं के स्वामित्व वाले सॉफ़्टवेयर में सॉफ़्टवेयर का उपयोग करने देता है।


मेरे मामले में, मैं एक पहिया का आविष्कार कर रहा हूं, अगर मैं जो करने की कोशिश कर रहा हूं वह एक मार्का भाषा के लिए एक अद्वितीय दुभाषिया का निर्माण करना है। उदाहरण के लिए, मेरी एक परियोजना एसएसएल के रूप में लेटेक्स की व्याख्या कर रही थी जो मानव कान द्वारा पठनीय है: meta.wikimedia.org/wiki/Grants:IdeaLab/… । << उस URL के अंत में एक अवधि है, अन्यथा यह काम नहीं करेगा
अकावा

2
@ अकिवा को मुझे अपने कार्यस्थल द्वारा विकसित एक कस्टम पाठ प्रारूप के साथ काम करना है जो शाब्दिक रूप से पहिया को फिर से स्थापित करता है। मुझे इसके लिए 3 भाषाओं (जावास्क्रिप्ट, जावा और ऑब्जेक्टिव-सी) में 4 पार्सर बनाए रखने हैं और यह एक भयावह दुःस्वप्न हैअब सही काम करें और इस कस्टम पाठ प्रारूप को निरस्त करें । मैं इस बात पर जोर नहीं दे सकता कि सड़क के नीचे कुछ साल के रखरखाव का कितना बड़ा स्तर बन जाएगा। मौजूदा संरचित प्रारूप, XML, JSON आदि का उपयोग करें
Chris Cirefice

@ChrisCirefice क्या आप मुझे एक उदाहरण दे सकते हैं कि यह कैसे एक बुरा सपना है?
अकीवा

1
@ अकिवा मुझे लगता है कि इस तथ्य को भी आपको एक ही पार्सर बनाए रखना होगा (मेरे मामले में कई और अलग-अलग भाषाओं में)। मानक प्रारूप एक कारण से मौजूद हैं - वे आपके द्वारा आवश्यक डेटा का प्रतिनिधित्व कर सकते हैं - और आपके हिस्से पर बहुत कम प्रयास के साथ, क्योंकि उन पार्सर को बनाया गया है, परिष्कृत किया गया है और बनाए रखा गया है। कस्टम पाठ प्रारूप भी अत्यंत विशिष्ट ज्ञान है, जिसका अर्थ है कि आमतौर पर केवल एक या दो डेवलपर्स ही इसे सफलतापूर्वक बनाए रखने के लिए प्रारूप से परिचित होंगे। वह बोलना चाहिए। ज्यादातर लोग CML, JSON से परिचित हैं - कम ही लोग जानते हैं कि कस्टम प्रारूप।
क्रिस क्रॉफिस

1
@ अकिवा वास्तव में! मार्काडाउन प्रारूप (पाठ प्रारूपण के लिए एसई और कई अन्य साइटें जो उपयोग करती हैं) कुछ मानक है , जैसे एसक्यूएल है। लेकिन कस्टम एक्सटेंशन (जैसे SE) के साथ कई अलग-अलग 'स्वाद' हैं। एक मानक पुस्तकालय है जो 'कोर' को पार्स करता है, यदि आप अतिरिक्त सुविधाएं चाहते हैं तो आप लाइब्रेरी का विस्तार करते हैं। लेकिन, अपने स्वयं के फॉर्मैटर का निर्माण और रखरखाव लचर होगा - कई पहले से मौजूद हैं (मार्कडाउन, बीबी कोड, आदि), इसलिए पहिया को फिर से क्यों लगाया जाए और उस सभी कोड को बनाए रखें? मई के साथ ही एक मौजूदा पुस्तकालय का उपयोग करें :)
क्रिस Cirefice

8

कुछ सामान्य विभाजक का उपयोग करते हुए बड़े मनमाने तारों को विभाजित करते समय ठीक काम करना चाहिए, लेकिन मैं एक मनमाना प्रतीक का उपयोग करने के खिलाफ सलाह दूंगा। किसी ने उस स्ट्रिंग को प्लेनटेक्स्ट के रूप में पढ़ा, भ्रमित हो सकता है, न कि यूटीएफ के साथ परेशानियों का उल्लेख करने के लिए और प्रतीक वर्गों के अंदर दिखाई देता है या नहीं।

इसका सबसे महत्वपूर्ण हिस्सा यह है कि प्रत्येक अनुभाग बरकरार है, जबकि प्रत्येक "अनुभाग हेडर" को उचित रूप से पहचाना जाना चाहिए।

एक आम विभाजक का उपयोग क्यों न करें लेकिन इसे पठनीय रखें? कुछ इस तरह:

[SECTION]
Part 1
Boat

[SECTION]
Section A
Programming

[SECTION]
Part 2
Partitioning boats for programming.

[SECTION]
Section AA
Section SQL Entries.

समस्या यह तय कर रही है कि विभाजक क्या होना चाहिए, क्योंकि इसमें कुछ ऐसा होना चाहिए जो किसी भी अनुभाग को न दिखाने की गारंटी हो। आप इसे एक विभाजक के रूप में आगे की पहचान कर सकते हैं यह आवश्यक है कि यह एक पंक्ति के प्रारंभ में हो और उस रेखा पर एकमात्र पाठ हो

प्रत्येक अनुभाग में किस पाठ की अपेक्षा की जाती है, इसके बारे में अधिक जानकारी के बिना , इस मामले में आम विभाजक क्या करना चाहते हैं, इस बारे में सिफारिश करना कठिन है ।


मुझे पठनीयता पर आपके उत्तर का जोर पसंद है। डेटा स्क्रैपिंग उपयोगकर्ता द्वारा उत्पन्न पाठ के माध्यम से तार उत्पन्न होते हैं, उदाहरण के लिए, प्रश्न और उत्तर लिखने के लिए एसई में प्रयुक्त मार्कअप भाषा। इस प्रकार आप आसानी से कल्पना कर सकते हैं कि किस प्रकार के स्ट्रिंग हेरफेर के मुद्दे खेलने में आ सकते हैं।
अकिवा

5

स्वीकृत उत्तर से लगता है कि आपने एक टिप्पणी में क्या लिखा है:

कारण यह है कि मेरे द्वारा किए जाने वाले बहुत सारे हेरफेर के लिए पूर्ण स्ट्रिंग की आवश्यकता है

और इसे एक उदाहरण के रूप में दिया:

s.replace ("बोट", "प्रोग्रामिंग");

यदि आप जो चाहते हैं, तो यह IMHO है जो आपके संपूर्ण स्ट्रिंग के लिए कुछ "मार्काडाउन" या पाठकीय विभाजक का उपयोग करने के लिए एक बहुत बुरा विचार है, यह हमेशा हेरफेर के साथ हस्तक्षेप करने का एक निश्चित जोखिम है और इससे मजबूत कोड नहीं होगा। विशेष रूप से जब आप ऐसे संयुक्त स्ट्रिंग पर नियमित अभिव्यक्तियों का उपयोग करना शुरू करने का प्रयास करते हैं, तो आप संभवत: उन्हीं समस्याओं में भाग लेंगे, जिन्हें लोग नियमित अभिव्यक्तियों के साथ HTLM या XML को पार्स करने की कोशिश करते हैं

विशेष रूप से क्योंकि आपने लिखा था कि "हजारों [इस तरह के हेरफेर] कार्य" हो सकते हैं, यह जोखिम एक वास्तविक समस्या बन सकती है। यहां तक ​​कि अगर आप स्ट्रिंग सूची को आंतरिक रूप से संग्रहीत करने के लिए एक्सएमएल जैसे कुछ मार्कडाउन का उपयोग करते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि हेरफेर केवल सामग्री को संसाधित करेगा, मार्कडाउन को नहीं, ताकि किसी भी प्रसंस्करण करने से पहले स्ट्रिंग को भागों में विभाजित करने का मतलब हो, और इसमें शामिल हों यह बाद में फिर से - तो यह है कि आप एक बुरा प्रदर्शन देने के एक उच्च जोखिम होगा।

यहां बेहतर डिज़ाइन विकल्प एक सार डेटाटाइप प्रदान करना है (यदि आपको पसंद है तो एक वर्ग का उपयोग करें), इसे कॉल करने की अनुमति देता है MyStringList, और बुनियादी संचालन का एक छोटा सा सेट प्रदान करता है जो आपको उस ऑपरेशन के संदर्भ में अपने "हजारों कार्यों" को लागू करने की अनुमति देता है। उदाहरण के लिए, सामान्य findऔर replaceसंचालन या एक सामान्य कार्यात्मक mapसंचालन हो सकता हैJoinToStringयदि आप वास्तव में पूरी सूची की जरूरत है तो आप एक ऑपरेशन की तरह कुछ जोड़ सकते हैं कुछ ख़ास पर्पस के लिए।

इन परिचालनों का उपयोग करते हुए, आपका डर कि कोड अधिक जटिल हो जाता है, क्योंकि "सब कुछ लूप के लिए करना होगा" व्यर्थ हो जाता है, क्योंकि forआपके द्वारा प्राप्त किए जाने वाले एकमात्र लूप को डेटाटाइप के संचालन के अंदर समझाया जाता है। और मैं प्रदर्शन के बारे में चिंतित नहीं होता जब तक कि आपके पास वास्तविक, औसत दर्जे का प्रदर्शन प्रभाव नहीं होता (जो मुझे संदेह है कि यदि आप बुनियादी कार्यों को सही ढंग से लागू करते हैं तो आपको मिलता है)।


अपवोट क्योंकि मैंने वास्तव में ऐसा कुछ बनाया था। यह मुझे कस्टम ब्रैकेट्स को सेट करने की अनुमति देता है, <और >, और यह उस स्ट्रिंग के हर उदाहरण को हड़प लेगा जहां मैं आसानी से उन इंस्टेंस को हटा सकता हूं जो मैं नहीं चाहता हूं, और जिस तरह से मैं चाहता हूं, उसे आसानी से हेरफेर कर सकता हूं। यह अच्छा है क्योंकि स्वयं द्वारा नियमित अभिव्यक्ति इस तरह से सब्सट्रिंग को संभालती नहीं है: <boat <programming>>अच्छी तरह से जहां कोष्ठक की कई परतें हैं।
अकिवा

1

वर्णित प्रारूप INI फ़ाइलों के समान है:

https://en.wikipedia.org/wiki/INI_file

उस स्थिति में वर्ग वर्ग कोष्ठक द्वारा संलग्न है [] तो आप जो वर्णन करते हैं वह उस पाठ में अतिरिक्त अर्थ जोड़ने के लिए कुछ फैशन में अनुभाग को चिह्नित करके समझ में आता है।


0

उदाहरण के लिए, मैं इस तरह एक स्ट्रिंग उत्पन्न कर सकता हूं:

प्रश्न: क्या आप इस स्ट्रिंग को "उत्पन्न" करते हैं?

चाहेंगे कि किसी भी हेरफेर करने के लिए आसान हो सकता है?


स्ट्रिंग एक वेबसाइट से डेटास्कैपिंग उपयोगकर्ता सामग्री से उत्पन्न होती है।
अकीवा

1
यह वेब साइट से डेटा प्राप्त करने का एक विश्वसनीय तरीका नहीं है, बस इसलिए कि वे बदलते हैं और चीजें पूरी तरह से घूम जाती हैं या पूरी तरह से गायब हो जाती हैं। आप प्रकाशित (और इसलिए विश्वसनीय) एपीआई के कुछ प्रकार से डेटा को पुनः प्राप्त करना बेहतर होगा। इसके अलावा, कई वाणिज्यिक वेब साइटों का उपयोग विशेष रूप से इस तरह के प्रतिबंध लगाता है।
Phill W.

कभी-कभी मुझे यह चुनने के लिए नहीं मिलता है कि कौन सा डेटा मेरे लिए मूल्यवान है, और इसलिए हमेशा जो आप देख रहे हैं, उसके लिए अखंडता की जांच करने की आवश्यकता है, या केवल सादे समझौता और सर्वश्रेष्ठ के लिए आशा है। उदाहरण के लिए: मैंने एक दुभाषिया LaTeXको लिखा SSML, और मुद्दों में से एक यह है कि आप समान रूप से अलग-अलग कोड के साथ समान छवियां उत्पन्न कर सकते हैं, और इसलिए यह संगत होना असंभव है अगर उपयोगकर्ता अपने सूत्रों को उत्पन्न करने के खराब या गूढ़ तरीके चुनता है। दिन के अंत में इसका मतलब यह है कि जो लोग अच्छे अभ्यास का उपयोग नहीं करते हैं, उनकी लिपियों की एक सभ्य व्याख्या नहीं होगी।
अकिवा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.