2010-08-03 12 views
5

मुझे हाल ही में एक ऐप में "स्ट्रिंग मैथ" का उपयोग करने के लिए एक साथी डेवलपर द्वारा बेरेट किया गया था। मैं पूरी तरह से विकास की बात नहीं कर रहा हूं, बिना किसी औपचारिक प्रशिक्षण के, और मैंने इस मुद्दे के बारे में नहीं सुना है। यह क्या है? सवाल में"स्ट्रिंग गणित" क्या है और यह बुरा क्यों है?

कोड:

$('.submit-input').click(function() { 
    var valid = true; 
    $('input, select, radio').removeClass('error'); 
    $('.error-message').hide(); 

    $('.validate').each(function() { 
     if($(this).val() == $(this).attr('default')){ 
      valid = false; 
      $(this).addClass('error'); 
     } 
    }); 

    if(!$('select[name="contact"] option:selected').val() != ''){ 
     $('select[name="contact"]').addClass('error'); 
     valid = false; 
    } 

    if(!$('input[name="ampm"]:checked').length){ 
     $('input[name="ampm"]').addClass('error');   
     valid = false; 
    } 

    if(!valid){ 
     $('.error-message').css('display','block'); 
     return false; 
    } else { 

     var services_selected = 'Services Selected: '; 
     services_selected += $('.l3').text() + ', ' + $('.l4').text() + ', ' + $('.l5').text() + '; ' + $('.l6').text(); 
     var prices = 'Prices: '; 
     prices += $('.l7').text() + ', ' + $('.l8').text() + ', ' + $('.l9').text() + ', ' + $('.l10').text(); 
     var name = 'Name: '; 
     name += $('input[name="name"]').val(); 
     var phone = 'Phone: ' 
     phone += $('input[name="phone"]').val(); 
     var time = 'Preferred contact time: '; 
     time += $('select[name="contact"] option:selected').val() + $('input[name="ampm"]:checked').val(); 

     $.ajax({ 
      url: 'php/mailer.php', 
      data: 'services_selected=' + services_selected +'&prices=' + prices + '&name=' + name + '&phone=' + phone + '&time=' + time, 
      type: "POST", 
      success: function() { 
       $('#email_form_box .container').children().fadeOut(500, function() { 
        $('#email_form_box .container').html('<div style="margin:20px auto;text-align:center;width:200px;">yada yada yada<br /><span class="close">Close</span></div>'); 
       }); 
      } 
     }); 
    } 

}); 

संपादित करें: सार मैं यहाँ हो रही है कि यह एक मानक विकास बोलचाल की भाषा नहीं है, और मैं शायद पुरुष जो मुझे पहले में बक दिया से बात करनी चाहिए जगह। तो मैं वह करूँगा। धन्यवाद दोस्तों। मैं एक जवाब के साथ वापस आऊंगा, या जो भी पहले से जानता था उसे जांचने के लिए।

+4

मुझे लगता है कि केवल आपका मित्र ** "स्ट्रिंग गणित" ** चीज़ के बारे में जानता है :) – Sarfraz

+6

हमें वह कोड दिखाएं जिस पर उन्होंने ऑब्जेक्ट किया था। – tpdi

+4

तो आपने अपने साथी डेवलपर से यह सवाल क्यों नहीं पूछा? – Codesleuth

उत्तर

6

अधिकांश जावास्क्रिप्ट ब्राउज़र कार्यान्वयन में, अत्यधिक प्रतिलिपि के कारण तारों को जोड़ना धीमा है।देखें JavaScript: String Concatenation slow performance? Array.join('')?

पसंदीदा तरीका एक सरणी का उपयोग करें और शामिल होने के लिए है:

var pieces = ["You purchased "]; 
pieces.push(num, " widgets."); 
el.innerHTML = pieces.join(''); 

जोड़ा अधिक:

मुझे लगता है कि आप अपने कोड में एक गुप्त बग हो सकता है: आप से बचने जा करने के लिए प्रकट नहीं होते हैं आपके डेटा मूल्य। यदि उनमें से कोई भी एम्परसैंड शामिल करता है, तो आप परेशानी में होंगे। अपने सभी डेटा मानों के लिए बचें() का उपयोग करें।

ps। और यह एक असली बग है कि अन्य डेवलपर चूक गया। स्ट्रिंग गणित मुद्दा एक प्रदर्शन/रखरखाव मुद्दा है।

जोड़ा गया:

मैं अपने ईमेल लिखने की धारा (जल्दी) दुबारा लिखा। मुझे लगता है कि एक टुकड़ा सरणी का उपयोग करते समय यह क्लीनर (और थोड़ा तेज होगा)।

.... 
} else { 

var d = []; // the post_data pieces table 

d.push ('services_selected='); // Start the services_selected value 
d.push ('Services Selected: '); 
d.push ($('.l3').text(), ', ', $('.l4').text(), ', ', $('.l5').text(), 
     '; ', $('.l6').text()); 

d.push ('&prices='); // Start the prices value 
d.push ('Prices: '); 
d.push ($('.l7').text(), ', ', $('.l8').text(), ', ', $('.l9').text(), 
     ', ', $('.l10').text()); 

d.push ('&name='); // Start the name value 
d.push ('Name: ', $('input[name="name"]').val()); 

d.push ('&phone='); // Start the phone value 
d.push ('Phone: ', $('input[name="phone"]').val()); 

d.push ('&time='); // Start the timevalue 
d.push ('Preferred contact time: ', 
     $('select[name="contact"] option:selected').val(), 
     $('input[name="ampm"]:checked').val()); 

    $.ajax({ 
     url: 'php/mailer.php', 
     data: d.join(''), 
     type: "POST", 
     success: function() { 
      $('#email_form_box .container').children().fadeOut(500, function() { 
       $('#email_form_box .container').html('<div style="margin:20px auto;text-align:center;width:200px;">yada yada yada<br /><span class="close">Close</span></div>'); 
      }); 
     } 
    }); 
} 
+0

मैं ईसीएमएस्क्रिप्ट के अगले संस्करण में देशी स्ट्रिंग बिल्डर को देखना पसंद करूंगा। – ChaosPandion

+0

यह बहुत अच्छा हो सकता है, लेकिन जेएस एक उपयोगकर्ता को बिक्री जानकारी के लिए उनसे संपर्क करने के लिए एक सीएसआर को ई-मेल भेजने की अनुमति देना था। जब हम इस तरह के असंगत उपयोग (केवल उपयोगकर्ता अनुरोध पर सक्रिय होते हैं) के बारे में बात कर रहे हैं, तो क्या केवल एक pedantic होने के अलावा concatenation बनाम '.join()' का उपयोग कर एक मुद्दा भी है? – dclowd9901

+0

मैंने कहीं पढ़ा है कि यह आईई में केवल धीमा है (आईई 7 तक)। फ़ायरफ़ॉक्स में "सरणी शामिल होना" धीमा है लेकिन मुझे लगता है कि यह संदर्भ पर निर्भर करता है और इंजन अभिव्यक्ति को अनुकूलित कैसे कर सकता है। –

1

संपादित करें: ठीक है, मेरा बुरा, आप + का उपयोग संगतता के लिए नहीं करते हैं।

EDIT2:: नीचे संपादित ठीक है, इसे जावास्क्रिप्ट, वापस + है: पी


मुझे लगता है कि वह शायद की तरह कुछ करने के लिए बात कर:

$my_html = "<p>" + someVar + "<em>" + somethingImportant + "</em></p>"; 

यानी संयोजन के लिए . का उपयोग कर ।

+0

या '' 'के बजाय' .' के साथ। –

+1

यह PHP में भी काम नहीं करेगा, क्योंकि '+' अतिरिक्त के लिए आरक्षित है और '.' स्ट्रिंग concatenation के लिए प्रयोग किया जाता है। –

+0

क्षमा करें, गलत। "जावास्क्रिप्ट" होना चाहिए – dclowd9901

1

क्या आप शायद तारों का उपयोग करके संख्यात्मक डेटा संग्रहित/कुशल बना रहे हैं? यह शायद ही कभी एक अच्छा विचार है।

+0

क्या यह एक अच्छा विचार नहीं है भले ही आप उन्हें संख्यात्मक डेटा के रूप में उपयोग नहीं कर रहे हों ? – dclowd9901

+0

@ dclowd9901 इम्हो सभी मानों को डेटा संरचना के अनुसार संग्रहीत किया जाना चाहिए और इसका मतलब है, संख्याओं के लिए int (डबल ..) का उपयोग करें। मुझे यह पसंद है क्योंकि संख्याएं हमेशा संख्यात्मक डेटा होती हैं भले ही आप इसका उपयोग नहीं करते हैं। लेकिन मुझे नहीं पता कि अन्य मेरी राय से सहमत होंगे या नहीं। – InsertNickHere

+1

@InsertNickHere: समस्या यह है कि दशमलव और दशमलव दोनों (जैसे पैसे) के लिए उपयुक्त डेटा संरचनाएं दोनों में नहीं हैं।स्ट्रिंग्स वास्तव में वहां एक बेहतर विकल्प हो सकता है (उदा। PHP का बीसीएमएथ एक्सटेंशन)। –

0

Skilldrick के जवाब का विस्तार करने के लिए:

वहाँ का उपयोग कर "+" आपके चर में से एक तक तार (अपनी भाषा के आधार पर) concat को कुछ भी गलत नहीं एक स्ट्रिंग नहीं है है:

echo 0 + ": hi!<br />"; 
echo 0 .. ": hi!<br />"; 

पहली पंक्ति आउटपुट "0" हो सकता है (क्योंकि यह स्ट्रिंग को किसी संख्या में कनवर्ट करने का प्रयास करता है)। दूसरी पंक्ति अपेक्षित लेखन के रूप में काम करती है "0: हाय!
"।

1

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

+0

प्रश्न पूछने से डरो मत। कोई डेवलपर सबकुछ जानता है, और आप अकेले संघर्ष करके दूसरों से अधिक सीखेंगे। यह प्रोग्रामिंग शैली पर व्यर्थ तर्कों से बचने के लिए, आपके सहकर्मी चीजों को कैसे करना पसंद करते हैं, यह जानने में भी मदद करता है। –

+0

@ क्रिस्टोफर जॉनसन: कहने में आसान, अभ्यास में कठिन। यह एक बहुत ही डरावनी दुनिया है, यह विकास की बात है, और मुझे पता है कि मैं ज्यादातर अन्य लोगों के पीछे मील हूं। यह अच्छा होगा अगर शायद अधिक रणनीति शामिल थी। – dclowd9901

+1

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

1

जब से तुम जावास्क्रिप्ट के साथ अपने प्रश्न retagged, तो आपके सहयोगी अपने कोड में कीड़े कि, Strange javascript addition problem

मूल रूप से "1" + 1 जावास्क्रिप्ट में 11 का आकलन करती तरह से पूछे जाने वाले हैं, जबकि 1 + 12 का मूल्यांकन मतलब हो सकता है। अब एक चर के साथ + के पहले तर्क को प्रतिस्थापित करें और आप कुछ अप्रत्याशित व्यवहार प्राप्त कर सकते हैं।

+0

हाँ, मुझे यह मिलता है, और अगर वे स्ट्रिंग डेटा के माध्यम से आते हैं तो संख्याओं को पार्स कर दें, लेकिन मैं जो काम कर रहा था, वह तारों के माध्यम से और उसके माध्यम से काम कर रहा था, इसलिए मुझे पूरी तरह से यकीन नहीं है कि उसे क्या समस्या होगी । – dclowd9901

1

शायद यह आपके सहकर्मी के साथ इस तरह की रेखाएं हैं। सिद्धांत में यह बिल्कुल सही कोड है, लेकिन इसे पढ़ने के लिए काफी असंभव है।

services_selected += $('.l3').text() + ', ' + $('.l4').text() + ', ' + $('.l5').text() + '; ' + $('.l6').text(); 

समारोह और चर्चा यहाँ पर एक नजर है: http://frogsbrain.wordpress.com/2007/04/28/javascript-stringformat-method/

आप आसानी से अपने जे एस को यह समारोह जोड़ सकते हैं और फिर आप की तरह कुछ करने के लिए कोड के इस भयानक लाइन बदल सकते हैं:

services_selected = '{0} , {1}, {2}, {3}; {4}'.format($('.l3').text(), $('.l4').text(), $('.l5').text(), $('.l6').text()); 
+0

मैं यह मामला देख सकता हूं। वह स्वच्छ, सुंदर कोड के लिए एक स्टिकर है। उन रूबी हेडों में से एक: \ – dclowd9901

0

मैं "स्ट्रिंग गणित" सुनने के बारे में सोचता हूं। मैं भी उससे चिल्लाऊंगा।

public String StringAdd (String str1, String str2){ 
    int int1, int2; 
    switch (str1){ 
     case "Zero": 
     int1 = 0; 
     break; 
     case "One": 
     int1 = 1; 
     break; 
     //...etc... 
     default: 
     throw new BadNumberSpellingException("You spelled a number wrong."); 
    } 
    switch (str2){ 
     case "Zero": 
     int2 = 0; 
     break; 
     //...etc... 
    } 

    int result = int1 + int2; 
    switch (result){ 
     case 0: 
     return "Zero"; 
     case 1: 
     return "One"; 
     case 2: 
     return "Two"; 
     //etc.... 
    } 
} 
2

ठीक है, तो यहाँ जवाब उसने मुझसे कहा है:

I should have said inline string concatenation/parsing, which is a potential injection vulnerability and a sign of sloppy code or bypassing the framework.

करता कौन वास्तव में अन्य उत्तर फिट नहीं हम यहाँ है। मैं सबसे ऊपर के जवाब के साथ उत्तर देने के लिए जा रहा हूं, क्योंकि यह शायद सबसे उपयोगी है, लेकिन सिर्फ सूचित करना चाहता था।

+1

हमें यह बताने के लिए धन्यवाद कि उसका क्या मतलब है। बीटीडब्ल्यू, आपको अपना जवाब स्वीकार करने की अनुमति है (लेकिन जब आप करते हैं तो आपको कोई प्रतिनिधि नहीं मिलता है)। – GreenMatt

+1

उसे वापस जाने पर अच्छा काम! – Irwin

संबंधित मुद्दे