आप जिस प्रोग्रामिंग भाषा में अक्सर प्रयोग करते हैं, उसमें आपको किस वाक्य-रचना तत्व से सबसे अधिक नफरत है? [बन्द है]


27

कोई फर्क नहीं पड़ता कि आप एक प्रोग्रामिंग भाषा से कितना प्यार करते हैं, इसमें हमेशा कुछ विवरण होते हैं जो उतना अच्छा नहीं है जितना कि वे हो सकते हैं।

इस प्रश्न में, मैं विशेष रूप से वाक्यविन्यास तत्वों पर ध्यान देना चाहूंगा एक प्रोग्रामिंग भाषा में जिसे आप अक्सर उपयोग करते हैं (शायद आपकी पसंदीदा प्रोग्रामिंग भाषा, या शायद वह जिसे आप काम में उपयोग करने के लिए मजबूर हैं), कौन सा वाक्यविन्यास तत्व आपको सबसे अधिक अपठनीय, अस्पष्ट, असुविधाजनक या अप्रिय लगता है?


@ नथन टेलर, इस सवाल के लिए नहीं, बल्कि एक और सवाल के लिए
फिनेव सिप 11'10

क्या यह प्रश्न संशोधित हुआ? क्योंकि जब मैंने उत्तर दिया, तो यह "सिंटैक्स तत्वों" पर केंद्रित नहीं था ... मुझे अब अपना उत्तर संशोधित करना होगा।
तलवी वटिया

@ तालवी: नहीं, यह शुरू से ही वाक्यविन्यास के बारे में था।
Timwi

@ टिमवी अजीब, यह एक सवाल का जवाब देने का मामला होना चाहिए यह सोचकर कि यह एक अलग था '।
तलवी वटिया

यदि आप वोट कर सकते हैं और सोच सकते हैं कि यह एक उपयोगी प्रश्न है या इसके नीचे उपयोगी उत्तर हैं, तो कृपया वोट करें। StackExchange साइटों को एक अच्छे समुदाय के निर्माण के लिए वोटों की आवश्यकता होती है। आप प्रति दिन 30 वोट दे सकते हैं, उन्हें बर्बाद मत करो। विशेष रूप से दिए गए उच्च प्रतिष्ठा और कम मतों वाले उपयोगकर्ताओं को कृपया इसे पढ़ें: meta.programmers.stackexchange.com/questions/393/…
Maniero

जवाबों:


39

जावास्क्रिप्ट में अर्धविराम सम्मिलन।

मैं वास्तव में अक्सर इसे काट नहीं पाया है, लेकिन यह सिर्फ एक ऐसी बुरी तरह से बुरा विचार है जो मेरा सिर घूमता है।


यहाँ नियम हैं (ECMA-262 धारा 7.9 से)

  1. जब प्रोग्राम में एक टोकन होता है जिसे औपचारिक व्याकरण द्वारा अनुमति नहीं दी जाती है, तो एक अर्धविराम डाला जाता है यदि (ए) उस बिंदु पर एक पंक्ति विराम होता है, या (बी) अप्रत्याशित टोकन एक समापन ब्रेस था।
  2. जब किसी फ़ाइल का अंत हो जाता है, यदि प्रोग्राम को अन्यथा पार्स नहीं किया जा सकता है, तो एक अर्धविराम डाला जाता है।
  3. जब "प्रतिबंधित उत्पादन" का सामना किया जाता है और इसमें एक लाइन टर्मिनेटर होता है, जिसमें व्याकरण में एनोटेशन होता है "[यहां कोई लाइनटर्मिनेटर नहीं है"), तो एक अर्धविराम डाला जाता है।

उदाहरण:

return 1; // returns 1

return
1; // returns undefined

2
जावास्क्रिप्ट: विश्व का सबसे गलत समझा जाने वाला प्रोग्रामिंग लैंग्वेज ~ डगलस
क्रॉकफ़ोर्ड

हाँ, बहुतों को उम्मीद है कि जावास्क्रिप्ट एक "फ्री-फॉर्म भाषा" होगी, लेकिन ऐसा नहीं है।
एंड्रियास रिजेब्रैंड

13
यह समझ में आने के बाद कि जावास्क्रिप्ट को HTML बनाने के लिए डिज़ाइन किया गया है, जिसका अर्थ यह बताने का एक लंबा इतिहास है कि आपका कोड "वास्तव में" का अर्थ क्या है जब यह वाक्य-रचना के लिए वैध नहीं है। (कुछ समय के लिए रोबस्टनेस सिद्धांत देखें - कंप्यूटिंग के इतिहास में सबसे बड़ी आपदा।)
मेसन व्हीलर

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

7
वोहू, आखिरकार कोई और जो यह भी सोचता है कि रोबस्टनेस सिद्धांत एक आपदा है जिसने एचटीएमएल को पूरी तरह से गड़बड़ कर दिया है कि यह क्या है।
रोमन स्टार्कोव

39

C # प्रॉपर्टी की कमी के कारण जावा-बीन सिंटैक्स

/**
 * Name of user
 */
private String name;

/**
 * Gets name of user
 * @return Name of user
 */
public String getName() {
    return this.name;
}

/**
 * Sets name of user. 
 * @param name
 */
public void setName(final String name) {
    this.name = name;
}

GAH !!!

मेरे पास इसके साथ समस्याएँ हैं

  • बहुत अधिक कोड - एक फ़ील्ड है जिसे प्रलेखित किया जाता है, एक गेटर विधि जिसे प्रलेखित किया जाता है, और एक सेटर विधि जिसे प्रलेखित किया जाता है। इस अत्यंत मूल उदाहरण में एकल संपत्ति के लिए कोड की 20 लाइनें हैं
  • Clutters विधि सूचियों : - "मुझे लगता है कि विधि, पर हाथ पता करते हैं getX, getY, getZ, getAnotherAnnoyingField, getWhyIHateJavaBeans, getThisIsVerbose, getGAH, ... आह वहाँ यह है hashCode
  • दस्तावेज़ीकरण के कई क्षेत्र खराब, पुरानी, ​​या गुम प्रलेखन की ओर ले जाते हैं - यह समझने की कोशिश करना कि कोड क्या करता है
  • तो एक 3 पार्टी को परेशान करने के लिए इसे आसानी से करने के लिए एक प्लगइन के साथ आना पड़ा - चम्मच , शार्क , दूसरों के बीच।

9
एक बार फिर जब कोड इतना वर्बोज़ है कि उसे ऑटो जनरेटिंग टूल की ज़रूरत है, तो कुछ गलत है। मैं एक नेटबीन्स लड़का हूं, लेकिन इसमें ऑटो को गेटर्स और सेटर जनरेट करने की क्षमता भी है। लेकिन Javadoc syn से बाहर हो जाता है, यह अभी भी
क्रिया है

11
अगर आपको हर चीज के लिए गेटर्स की जरूरत है तो क्लाइंट कोड में कुछ गड़बड़ है ।
19

7
गेटर्स और सेटर होने से इनकैप्सुलेशन टूट जाता है। क्षेत्र भी हो सकता है public। सदस्यों को निजी होना चाहिए और उच्च स्तर के तर्क के साथ वर्ग द्वारा समझदारी से हेरफेर किया जाना चाहिए, क्लाइंट कोड से गेटर्स और सेटर के साथ नहीं
ग्रेफेड 5

6
@ ग्रेफैड: यदि यह सार्वजनिक है, तो आप आसानी से सेटिंग कोड में बदलाव नहीं कर सकते (आपको बाहर से फ़ील्ड सेट करने वाले सभी कोड को बदलना होगा)।
बार्ट वैन ह्युकेलोम

3
@SHiNKiROU: जावा साफ दिखता है? मैंने पहले कभी नहीं सुना है! जावा के साथ मेरा मुख्य आकर्षण तथ्य यह है कि प्रतीत होता है कि साधारण चीज कोड की दर्जनों लाइनें लेती है जो मुझे मानसिक रूप से अनदेखा करने की आवश्यकता है।
विन्यासकर्ता

33

व्हाट्सएप संवेदनशीलता।

इस संबंध में अजगर ने मुझे नाराज किया। मेरा मतलब है कि मैं ठीक से वैसे भी इंडेंट, लेकिन यह मुझे कीड़े मैं चाहिए कि राशि के लिए। वाक्य रचना का प्रस्तुति हिस्सा मुझे परेशान करता है।


8
आप इसे पसंद करना सीखेंगे
user10008

2
वाक्य रचना है प्रस्तुति
विंस्टन Ewert

32

switchबयान (सी, C ++, C #, जावा, आदि)

यहाँ एक उदाहरण है कि मुझे यह अत्यधिक असुविधाजनक क्यों लगता है:

switch (someVariable)
{
    case 1:
        int i = something();
        doSomething(i);
        break;

    case 2:
        int i = somethingElse();
        doSomethingElse(i);
        break;
}

यह संकलित नहीं करता है क्योंकि चर iएक ही दायरे में पुन: घोषित किया जाता है। यह एक मामूली विवरण की तरह लगता है, लेकिन यह मुझे वास्तव में अक्सर काटता है। मैं इसे कम करने के लिए घुंघराले कोष्ठक जोड़ सकता हूं, लेकिन यह अच्छा होता अगर घुंघराले कोष्ठक वाक्यविन्यास का अनिवार्य हिस्सा होते, और कोई अतिरिक्त अतिरिक्त स्तर का इंडेंटेशन नहीं होता। मुझे भी वास्तव में अतिरिक्त लिखने से नफरत है break। यह बहुत अच्छा होगा:

switch (someVariable)
case 1
{
    int i = something();
    doSomething(i);
}
case 2
{
    int i = somethingElse();
    doSomethingElse(i);
}
default
{
    ...
}

यह एक if/ elseश्रृंखला की तरह दिखता है , जो अच्छी बात है क्योंकि यह शब्दार्थ के समान भी है। कम से कम सी # में यह अभी भी एक ही बात नहीं होगी, क्योंकि एक switchबयान में केस लेबल का क्रम मायने नहीं रखता है, लेकिन एक if/ में elseऐसा करता है।


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

7
नहीं, यह इसके साथ दूर नहीं करता है। इसके लिए केवल यह आवश्यक है कि इसे अधिक स्पष्ट ( gotoया समान का उपयोग करके ) किया जाए, जैसा कि C # में पहले से ही है।
टिमवी

8
@ ग्रेफेड: सी में डफ डिवाइस का उपयोग करने वाले किसी भी कोड को एक भयानक मौत मरने की जरूरत है। कंपाइलर इस तरह की चीजों के बारे में आपसे बेहतर निर्णय लेते हैं।
बिली ओपल

4
@ ग्रेफडे: डेल्फी मामले में कई सूचकांकों की अनुमति देकर कई मूल्य के मुद्दे के आसपास हो जाता है case Foo of 1,3: Result := 'odd'; 2,4: Result := 'even' end;:।
फ्रैंक शीयर

3
@ जुकरियन: अब कल्पना breakडिफ़ॉल्ट थी और निर्दिष्ट किए जाने के लिए केवल आवश्यक गिरावट थी। यह टिप्पणी करने के लिए याद रखने की आवश्यकता नहीं है! :)
तिमवी

27

VB.NET में ऐरे घोषणाएँ

मैं हमेशा यह भूलने का प्रबंधन करता हूं कि जब VB.NET में निश्चित सरणियों को आरम्भ किया जाता है, तो आप सरणी के ऊपरी बाउंड को निर्दिष्ट कर रहे हैं कि C / C ++, PHP, या Java जैसे तत्वों की संख्या को। VB6 के अलावा (हम वहां नहीं जाएंगे ...), मैं इस तरह से करने वाली दूसरी भाषा के बारे में नहीं सोच सकता:

Dim myArray(20) as Integer  '# Creates an array with 21 elements,
                            '# indexed from 0 to 20

मुझे लगता है कि सभी बेसिक भाषाएं ऐसा करती हैं ... मुझे पता है कि मूल संगठन बुनियादी और QBasic करते हैं।
माइकल के

OMG जो वास्तव में भयावह है .... +1
मिकेरा

25

VB6 - अलग-अलग परिवर्तनीय घोषणा और असाइनमेंट

अधिकांश भाषाएं आपको एक चर घोषित करती हैं और इसे कोड की एक पंक्ति में असाइन करती हैं; दूसरी ओर, VB6 आपको दो का उपयोग करने के लिए मजबूर करता है।

Dim i as Integer
i = 0

Dim derpderp as Collection
Set derpderp = new Collection

आप एक पंक्ति में दो कमांड डालने के लिए एक कोलन का उपयोग कर सकते हैं, लेकिन यह जल्दी से वास्तविक कोड में गड़बड़ हो जाता है।

Dim i as Integer: i = 0
Dim derpderp as Collection: Set derpderp = new Collection

7
VB6 को आपकी सबसे लगातार भाषा के रूप में उपयोग करने के लिए +1।
वाल्टर

9
मैं इसे दैनिक उपयोग करता हूं..बस।
systempuntoout

क्या पास्कल में एक समान वाक्यविन्यास नहीं है? मैंने हमेशा सोचा था कि यह बुरा था।
ग्रेफेड 20

1
एक विशेष मामला है: यदि आप Dim Hurp As New Collection, यदि आप Hurpइसे संदर्भित करते समय एक्सेस करते हैं , तो Nothingयह एक्सेस से पहले जादुई रूप से आरंभिक होगा। यदि आप स्पष्ट रूप से इसे सेट करते हैं Nothingऔर इसे फिर से छूते हैं, तो यह पुनर्जीवित हो जाता है ... हांफना!
जेफरी हेंटिन

1
Derp के लिए + 1 मिलियन। Derp de derp de tiddly tum de derp।
एमवीकैनिल

24

CSS में टिप्पणी करना

//यह कई अन्य भाषाओं, जैसे PHP और जावास्क्रिप्ट की तरह कोड की लाइनों पर टिप्पणी नहीं करता है। हालांकि /* this is commented out */काम करता है, मैं उपयोग करना पसंद करता हूं //

इसका एक उपद्रव, क्योंकि आधा समय मैं भूल जाता हूं कि मैं सीएसएस का संपादन कर रहा हूं और फिर वापस जाकर त्रुटि को ठीक करना होगा।


आप इस दिन और उम्र में विचार करेंगे कि कच्चे CSS को ऑब्जेक्ट कोड माना जाएगा।
टॉम हॉल्टिन -

// सीएसएस बाहर टिप्पणी करने के लिए बस ठीक काम करता है। मुझे हर व़क्त यह करना है। मैं वास्तव में कचरा कर रहा हूं। लेकिन यह अप्राप्य रेखा को लंघन द्वारा काम करने लगता है।
एमवीकैनिल

1
@MVCylon यदि आप एक पंक्ति के बारे में टिप्पणी करने के लिए // का उपयोग करते हैं, तो उस पंक्ति के बाद कुछ भी छोड़ दिया जाता है। {उस विशिष्ट शैली के भीतर} दूसरे शब्दों में, यह ठीक है क्योंकि उन रेखाओं को छोड़ना नहीं चाहिए।
तलवी वटिया

20

PHP - तर्कों का लगातार क्रम

PHP के पास बहुत सारे ऑपरेशन करने के लिए बहुत सारे कार्य हैं जो आप किसी सरणी या स्ट्रिंग पर सोच सकते हैं। इनमें से कई ऑपरेशनों को ए $needleऔर ए दोनों का उपयोग करने की आवश्यकता होती है $haystack, लेकिन विभिन्न कार्य उन्हें अलग-अलग क्रम में लेते हैं। किस फ़ंक्शन की आवश्यकता है, उन तर्कों में से एक है जो मेरे मस्तिष्क को अवशोषित करने से इनकार करते हैं, चाहे मैं कितनी भी बार उनके पास आऊं!

लो कार्यों in_array और strstr :

// Check whether $needle occurs in array $haystack
bool in_array (mixed $needle, array $haystack [, bool $strict])

// Check whether $needle is a substring of $haystack
string strstr (string $haystack, mixed $needle [, bool $before_needle=false])

मजेदार रूप से पर्याप्त, PHP इन आदेशों के साथ आंतरिक रूप से सुसंगत प्रतीत होता है जिसमें सभी स्ट्रिंग फ़ंक्शंस का उपयोग करने के लिए लगता है $haystack, $needleजबकि सरणी फ़ंक्शंस अन्य तरीके से होते हैं, लेकिन PHP के लिए किसी नए व्यक्ति के लिए इसका उपयोग करने में थोड़ा सा समय लग सकता है। इस विशेष quirk के बारे में और अधिक विस्तार से बात करते हुए ExpressionEngine पर एक अच्छी पोस्ट है, साथ ही साथ PHP बग सूची पर एक चर्चा है , जो PHP टीम से बहुत कम प्रतिक्रिया की सुविधा देता है!

helly@php.net
फिर एक सभ्य IDE का उपयोग करें।

2
आदेश को याद रखना आसान है $needle, $haystackक्योंकि यह कहने का तरीका याद दिलाता है कि एक छेद में एक सुई मिल जाती है
kiamlaluno

3
Protip: सरणी फ़ंक्शंस में, सुई पहले आती है। कड़े कार्यों में, हिस्टैक पहले आता है।
2

17
मुझे नाम से प्यार है strstr। इतना सुंदर अर्थहीन।
विन्यासकर्ता

5
बस PHP के बगट्रैकर में लिंक की गई प्रविष्टि को पढ़ें। गंभीरता से, wtf? oO इम्हो स्थिरता किसी भी एपीआई के लिए एक वैध मुद्दा है और सिर्फ "एक सभ्य IDE का उपयोग करें" के साथ जवाब देना सिर्फ एक वैध उत्तर नहीं है। कम से कम इसे देवों द्वारा कम भड़काऊ शब्द कहा जा सकता था।
बाल्नोर्न

2
ईमानदारी से, जो मुझे इस बारे में पागल कर रहा है वह यह है कि यह एक फ़ंक्शन नहीं होना चाहिए! यह सिर्फ एक तरीका होना चाहिए: $ haystack-> खोज ($ सुई)। सौदा किया।
रिवालक

19

अजगर

self आवृत्ति विधि परिभाषा में पैरामीटर


एक क्लासमेथोड में, इसे आमतौर पर cls नाम दिया जाता है और स्वयं का उपयोग करना सम्मेलन के खिलाफ जाता है।

यह वास्तव में समझ में आता है अगर आप इसके बारे में सोचते हैं। यह अन्य भाषाओं में एक निजी पद्धति घोषित करने के समान है, स्व पैरामीटर केवल अजगर में स्पष्ट है जहां यह अन्य भाषाओं में निहित है। यदि आप चाहते हैं कि यह निहित हो तो विधि की घोषणा से पहले @classmethod डेकोरेटर जोड़ें। Docs.python.org/library/functions.html#classmethod देखें । यह कैसे काम करता है, इसका विवरण सीखना आपको कुछ अंतर्दृष्टि देगा कि यह अन्य भाषाओं में कैसे किया जाता है।
इवान प्लाइस

4
मैं कारणों को समझने और वह वहाँ क्यों छोड़ दिया है neopythonic.blogspot.com/2008/10/... लेकिन मैं अभी भी यह पसंद नहीं है
गोरान पेरोस

@ इवन प्लाइस: 'स्व पैरामीटर सिर्फ अजगर में स्पष्ट है जहां यह अन्य भाषाओं में निहित है' यह कहानी का केवल एक हिस्सा है। दूसरा हिस्सा अजगर टाइप का साप्ताहिक है। एक साथ यह भयानक है, भूलना selfआसानी से होता है और समय खर्च होता है।
माआर्टिनस

@maaartinus तब अपने उदाहरण के तरीकों में एक क्लासमेथोड डेकोरेटर जोड़ें। का 'कमजोर टाइप्ड' से कोई लेना-देना नहीं है। यह केवल स्थैतिक तरीकों / कार्यों (कोई 'स्वयं' पैरामीटर) और उदाहरण विधियों ('स्वयं' शामिल है) के बीच संबंध स्पष्ट करता है। जब तक आप इसे ऐसा करने के लिए संदर्भ नहीं देते हैं, तब तक यह अभिभावक वर्ग के बारे में पता नहीं है। अन्य भाषाओं में मैंने जो विशिष्ट विशेषता बताई है, वह सिंटैक्टिक शुगर के पीछे छिपी है। अगर मेरे पास यह करने का विकल्प होता तो मैं पहले पायथन में OOP सीखना शुरू कर देता।
इवान प्लाइस

18

जावा

अवधि। पूर्ण विराम। कहानी का अंत।

कहा से शुरुवात करे? ओह, मुझे पता है कि कहां से शुरू करना है: जावा का पागलपन जटिल और बदसूरत और बेवकूफ और स्वाभाविक रूप से टूटी हुई जेनरिक। क्या मुझे कुछ और कहने की ज़रूरत है? :( ठीक है, फिर: प्रकार मिटाएँ

फिर गैर-निर्धारक संसाधन प्रबंधन है। केवेल फुटचर!

आगे क्या है? ओह, हाँ: जावा के बेवकूफ रीजैक्स मेरे सबसे चिड़चिड़े होते हैं, जो बीफ खाते हैं। मैं यह नहीं गिन सकता कि मैंने कितनी बार बैकस्लैश नहीं किए हैं। यह इस सहस्राब्दी से किसी भी यूनिकोड गुणों तक पहुंच न होने से भी बदतर है - जो कि पूर्ण बैल है। दस फ्रेशिंग डेट ऑफ़ आउट ऑफ़ डेट !!! पूरी तरह से बेकार। कूडेदान मैं डालो।

फिर यह बग है कि चरित्र वर्ग शॉर्टकट गैर-एएससीआईआई पर काम नहीं करते हैं। क्या शाही दर्द है! और उपयोग करने पर भी विचार न करें \p{javaWhiteSpace}; यह कई बहुत सामान्य यूनिकोड व्हाट्सएप कोड बिंदुओं के साथ सही काम नहीं करता है।

क्या आप जानते हैं कि एक \p{javaJavaIdentifierStart}संपत्ति है? वे क्या सोच रहे थे? तो ख़ुशी है कि उन्हें ऐसे स्मार्ट पीपर मिल गए जो सख्त सख्त थे।

कभी CANON_EQ ध्वज का उपयोग करने का प्रयास किया गया है? क्या आप जानते हैं कि वास्तव में ऐसा होता है, और यह क्या नहीं करता है? तथाकथित "यूनिकोड केस" के बारे में कैसे? सामान्य आवरण वाली चीजों का एक गुच्छा बस काम नहीं करता है।

फिर वे बनाए रखने योग्य regexes लिखना मुश्किल बनाते हैं। जावा अभी भी यह पता नहीं लगा पाया है कि मल्टीलाइन स्ट्रिंग्स को कैसे लिखना है, इसलिए आप इस तरह से पागल बातें लिखना समाप्त करते हैं:

    "(?= ^ [A-Z] [A-Za-z0-9\\-] + $)      \n"
  + "(?! ^ .*                             \n"
  + "    (?: ^     \\d+      $            \n"
  + "      | ^ [A-Z] - [A-Z] $            \n"
  + "      | Invitrogen                   \n"
  + "      | Clontech                     \n"
  + "      | L-L-X-X                      \n"
  + "      | Sarstedt                     \n"
  + "      | Roche                        \n"
  + "      | Beckman                      \n"
  + "      | Bayer                        \n"
  + "    )      # end alternatives        \n"
  + ")          # end negated lookahead   \n" 

वे सभी नए समाचार क्या हैं? ओह, सिर्फ जावा मूर्खता। उन्होंने पर्ल कमेंट्स का इस्तेमाल किया, न कि जावा कमेंट्स ( बेवकूफों! ) का, जो लाइन के अंत तक चलते हैं। इसलिए यदि आप उन लोगों को \nवहां नहीं रखते हैं, तो आप अपने बाकी पैटर्न को काट देते हैं। दुह और डबल दु!

जावा में regexes का उपयोग न करें: आप बस चीजों को तोड़ना चाहते हैं, यह सब इतना दर्दनाक और टूट गया है। मुझे विश्वास नहीं हो रहा है कि लोग इस पर ध्यान देंगे। कुछ नहीं

फिर हम एन्कोडिंग के साथ जावा के बेवकूफ बकवास के बारे में बात करना शुरू कर सकते हैं। सबसे पहले, यह तथ्य है कि डिफ़ॉल्ट प्लेटफ़ॉर्म एन्कोडिंग हमेशा कुछ लंगड़ा 8-बिट एन्कोडिंग है, भले ही जावा के चार्चर्स यूनिकोड हैं। फिर वहाँ है कि कैसे वे एन्कोडिंग त्रुटि पर अपवाद नहीं उठाते हैं। आपको बकवास लगने की गारंटी है। या इसके बारे में कैसे:

OutputStreamWriter(OutputStream out) 
          Creates an OutputStreamWriter that uses the default character encoding.
OutputStreamWriter(OutputStream out, Charset cs) 
          Creates an OutputStreamWriter that uses the given charset.
OutputStreamWriter(OutputStream out, CharsetEncoder enc) 
          Creates an OutputStreamWriter that uses the given charset encoder.
OutputStreamWriter(OutputStream out, String charsetName) 
          Creates an OutputStreamWriter that uses the named charset.

क्या फर्क पड़ता है? क्या आप जानते हैं कि एन्कोडिंग त्रुटि होने पर उनमें से केवल एक ही अपवाद करेगा? बाकी बस उन्हें थूथन देते हैं।

तो फिर जावा वर्णों की मूढ़ता एक चरित्र को धारण करने के लिए पर्याप्त नहीं है! वे क्या सोच रहे हैं? इसलिए मैं उन्हें चारित्र कहता हूं। आपको इस तरह से कोड लिखना होगा यदि आप उम्मीद करते हैं कि यह सही काम करेगा:

private static void say_physical(String s) { 
    System.out.print("U+");
    for (int i = 0; i < s.length(); i++) {
        System.out.printf("%X", s.codePointAt(i));
        if (s.codePointAt(i) > Character.MAX_VALUE) { i++; }  // UG!
        if (i+1 < s.length()) { System.out.printf("."); }
    }
}

और जो कभी ऐसा करने की सोचता है? किसी के आगे नहीं।

इसमें कितने किरदार हैं "\uD83D\uDCA9"? एक अथवा दो? निर्भर करता है कि आप उन्हें कैसे गिनते हैं। रेगेक्स इंजन निश्चित रूप से तार्किक पात्रों से संबंधित है, इसलिए एक पैटर्न ^.$सफल होगा और एक पैटर्न ^..$विफल हो जाएगा। इस पागलपन का प्रदर्शन यहाँ किया गया है:

String { U+61, "\u0061", "a" }  =~ /^.$/ => matched.
String { U+61, "\u0061", "a" }  =~ /^..$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^.$/ => failed.
String { U+61.61, "\u0061\u0061", "aa" }  =~ /^..$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^.$/ => matched.
String { U+DF, "\u00DF", "ß" }  =~ /^..$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^.$/ => failed.
String { U+DF.DF, "\u00DF\u00DF", "ßß" }  =~ /^..$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^.$/ => matched.
String { U+3C3, "\u03C3", "σ" }  =~ /^..$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^.$/ => failed.
String { U+3C3.3C3, "\u03C3\u03C3", "σσ" }  =~ /^..$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^.$/ => matched.
String { U+1F4A9, "\uD83D\uDCA9", "💩" }  =~ /^..$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^.$/ => failed.
String { U+1F4A9.1F4A9, "\uD83D\uDCA9\uD83D\uDCA9", "💩💩" }  =~ /^..$/ => matched.

वह मूढ़ता सभी है क्योंकि आप पूरी तरह से उचित नहीं लिख सकते हैं \u1F4A9, न ही आपको कोई चेतावनी मिलती है कि आप ऐसा नहीं कर सकते। यह सिर्फ गलत काम करता है।

Stoooopid।

जब हम उस पर होते हैं, तो पूरी \uXXXXधारणा जन्मजात रूप से मृत होती है। जावा प्रीप्रोसेसर ( हाँ, आपने मुझे सुना है ) जावा के होने से पहले इसे प्राप्त कर लेता है, इसलिए आपको पूरी तरह से उचित चीजें लिखने से मना किया जाता है "\u0022", क्योंकि जब तक जावा देखता है, तब तक इसका प्रीप्रोसेसर बदल गया है """, इसलिए आप हार जाते हैं। ओह इंतजार, नहीं करता है, तो यह एक regex में है! तो आप "\\u0022"बस ठीक उपयोग कर सकते हैं।

Riiiiiiiight!

क्या आपको पता है कि isatty(0)कॉल करने के लिए जावा में कोई रास्ता नहीं है ? आपको ऐसे विचार करने की अनुमति भी नहीं है। यह आपके लिए अच्छा नहीं होगा।

और फिर वहाँ पूरी क्लासपैथ घृणा है।

या तथ्य यह है कि आपके जावा स्रोत फ़ाइल के एन्कोडिंग को उसी स्रोत फ़ाइल में निर्दिष्ट करने का कोई तरीका नहीं है ताकि आप इसे खो न दें? एक बार फिर से मैं यह जानने की माँग करता हूँ: वह क्या है जो उन्हें लगता है कि

पागलपन बंद करो! मैं विश्वास नहीं कर सकता कि लोग इस कचरे के साथ डाल रहे हैं। यह पूरी तरह से मजाक है। मैं नहीं बल्कि वॉलमार्ट अभिवादन करने वाले की तुलना में अपमानजनक जावा पागलपन के स्लिंग्स और तीरों को पीड़ित करूंगा। यह सब टूट गया है, और वे न केवल इसे ठीक कर सकते हैं, वे इसे ठीक नहीं करेंगे

यह उसी लोमड़ी-अंगूर वाले लोगों द्वारा किया जाता है, जो खुद को एक ऐसी भाषा पर गर्व करते हैं, जिसने एक printf()फ़ंक्शन को गैरकानूनी बना दिया । जी, यकीन है कि असली अच्छी तरह से काम किया, हालांकि यह नहीं था !?

सरासर सुन्न। कुतिया-थप्पड़ उनके लिए बहुत दयालु है। अगर मैं असेंबलर में प्रोग्राम करना चाहता हूं, तो मैं करूंगा। यह एक निंदनीय भाषा नहीं है। राजा ने कोई कपड़ा नहीं पहना है।

हम इससे नफरत करते हैं। हम इससे हमेशा के लिए नफरत करते हैं । यह मर मर चलो मरने !


हाहा, अच्छा एक, मैं जावा को नहीं छूता क्योंकि यह आपके वर्णन की तरह बहुत अधिक अनपढ़ है। जैसा कि \ uD83D के लिए ... अच्छी तरह से मुझे यह कहने का एक बेहतर तरीका लगता है कि यह है कि आप यूटीएफ -16 नहीं बल्कि यूटीएफ -32 के बजाय तार होंगे। यदि आप UTF-16-ness को स्वीकार करते हैं तो रेगेक्स सही काम करता है; यह .length कॉल है जो बकवास करता है।
रोमन स्टार्कोव

4
-1। Regexp टिप्पणियों और यूनिकोड के अपवाद के साथ, आपके द्वारा उल्लिखित चीजों में से एक भी एक वाक्यविन्यास तत्व नहीं है।
जोर्ग डब्ल्यू मित्तग

3
@ Jörg, आप सिंटैक्स चाहते हैं? ठीक है ठीक है: जावा आपको नियंत्रण वर्ण डालने की अनुमति देता है, पहचानकर्ताओं में ईएससी और एनयूएल को शामिल करें। क्या वे सोच रहे थे ???
tchrist

4
@ टीचर: वाह! अगर मैं कभी जावा प्रोग्राम दोबारा लिखता हूं, तो मेरे सभी चरों में अलग-अलग बैकस्पेस कैरेक्टर्स ( ^H) :) के नाम होंगे
j_random_hacker

1
@ टिचर, अब बेहतर महसूस कर रहे हैं?

16

C और C ++ में फ़ंक्शन पॉइंटर घोषणा सिंटैक्स:

(int)(*f)(int, int);

यह एक फ़ंक्शन पॉइंटर घोषित करता है, fजिसका पॉइंटर दो ints ले सकता है और वापस आ सकता है int

मैं इस तरह से एक वाक्यविन्यास को बहुत पसंद करूंगा:

f: (int, int) => int

आप एक समारोह सूचक की घोषणा करना चाहते हैं gजिसका pointee दो ले जा सकते हैं intऔर से एक समारोह intऔर intकरने के लिए int, और एक वापसी int

C या C ++ संकेतन के साथ, आप इसे इस रूप में घोषित करेंगे:

(int)(*g)(int, int, int(int, int));

उपरोक्त प्रस्तावित नोटेशन के साथ ही इस बात को घोषित किया जा सकता है:

g: (int, int, (int, int) => int) => int

लैटर बहुत अधिक सहज IMO है।


एक तरफ: प्रोग्रामिंग भाषा जिसे OOC कहा जाता है, इस वाक्यविन्यास (और C और C ++ में विभिन्न अन्य वाक्यविन्यास मुद्दों) को ठीक करता है। यहां इसका होमपेज देखें ।


सहमत हूँ, कुछ "सादे सी" / "सी ++" इसका समर्थन नहीं करता है, या विभिन्न वाक्यविन्यास के साथ इसका समर्थन करता है। एक विशेष वाक्यविन्यास, यह इंगित करने में मदद करता है कि प्रोग्रामिंग भाषा सुविधा कब समर्थित है। यही कारण है कि C # जोड़ा "प्रतिनिधि" वाक्यविन्यास।
umlcat

डेलिगेट्स न केवल सिंथैटिक चीनी हैं, क्योंकि वे ऑब्जेक्ट को भी स्टोर करते हैं (C ++ सदस्य फ़ंक्शन पॉइंटर्स के विपरीत, जो नियमित फ़ंक्शन पॉइंटर्स की तुलना में भी बदतर सिंटैक्स हैं)
तामसे सजेलेई

14

जावा में वर्बोसिटी।

अर्थात:

public static final int 

6
की तुलना में? (15 वर्ण)
TheLQ

7
की तुलना में: const intउदाहरण के लिए।
OscarRyz

11
"सार्वजनिक स्थिर अंतिम int x = 4;" हास्केल में "x = 4" की तुलना में।
जेरेड अपडेटेड

24
यह वाचालता नहीं है। जावा में a+(b*c)/d*e+f/g^20प्रयोग करके लिखने का प्रयास करें BigInteger। यह भाषा ऑपरेटर को ओवरलोडिंग की अनुमति क्यों नहीं देती है?
माक

4
@ मिचेल: प्रोग्रामर जिन्हें इस कीमत पर खुद से सुरक्षित होने की जरूरत है, वे बिल्कुल भी प्रोग्रामिंग न करके खुद की रक्षा कर सकते हैं (और बाकी सभी के लिए दर्द कम कर सकते हैं)।
MAK

12

PHP में \ we \ \ \ \ \ parser नाम स्थान वाक्यविन्यास को ठीक नहीं करेंगे

वाक्यविन्यास न केवल बदसूरत है, यह भ्रम की ओर जाता है जब नए डेवलपर्स को स्ट्रिंग्स में नाम स्थान के बारे में सोचना पड़ता है। (PHP डबल-उद्धृत स्ट्रिंग्स में बैकस्लैश को इंटरव्यू सीक्वेंस के रूप में इंटरपोल करता है। एक नेक्स्ट \you\should\never\do\that-स्ट्रिंग स्ट्रिंग के बजाय एक नेमप्लेस स्ट्रिंग की तरह एक नेमस्पेस का प्रतिनिधित्व करने की कोशिश करने से नए लिंक, टैब और डिजास्टर हो जाएंगे।


हाँ, किसी ने ऐसा करने के लिए एक बेहतर :: तरीका सोचा, लेकिन PHP का कहना है कि हर ऑपरेटर को अलग होना चाहिए। मैं इस बात को लेकर उत्सुक हूं कि यहां दुरुपयोग का मुद्दा क्या है।
एलन पीयर्स

इस बात से सहमत। PHP को नामस्थानों की आवश्यकता होती है, लेकिन यह वाक्य रचना इसे पेंच करती है
umlcat

9

मैं इस तथ्य से घृणा करता हूं कि कर्ली ब्रेसिज़ एक / अगर / बयान के लिए वैकल्पिक हो सकते हैं।

खासकर जब मैं जैसे कोड देखता हूं,

if (...)
    for(...)
        ... One line of stuff ...

कृपया केवल ब्रेसिज़ को अंदर रखें और इसके साथ किया जाए।


6
हम्म .. यह निर्भर करता है। "एबॉर्ट इफ़्स" के लिए जो केवल एक शर्त की जांच करते हैं और एक त्रुटि कोड लौटाते हैं (या एक अपवाद फेंकते हैं), मैं बहुत बल्कि ब्रेसिज़ नहीं देखूंगा।
बिली ओपल

4
यदि आप अपने आप को अत्यधिक बहु-स्तरीय मामलों तक सीमित रखते हैं, तो मैं सहमत हो जाऊंगा, लेकिन आपका कथन बहुत ही कम्बल है। सरल, एकल-कथन ifs और लूप के लिए संक्षिप्त रूप रखने की क्षमता में बहुत उपयोगिता है।
तिमवी

2
मेरा नियम: केवल तभी जब किसी वक्तव्य में कई सबस्टेशनों की आवश्यकता होती है या यदि उसमें ऐसा विवरण होता है तो उसे ब्रेसिज़ में लपेटा जाना चाहिए। इस प्रकार , उपयुक्त इंडेंटेशन के साथ, निश्चित for (...) while (...) if (...) { x(); y(); }रूप से बेहतर फिर से लिखा गया है for (...) { while (...) { if (...) { x(); y(); } } }
जॉन प्यूडी

6
मैं इसके विपरीत नहीं हूं - मैं उन लोगों को तुच्छ समझता हूं जो पूरी तरह से अनावश्यक होने पर ब्रेसिज़ में डालने पर जोर देते हैं। बस प्रोग्राम करना सीखो।
जेरी कॉफिन

3
मैं सच में भले ही बयान में भी कोष्ठक पसंद है। यह मुझे एक कार्यक्रम के प्रवाह का बेहतर तरीके से पालन करने में सक्षम बनाता है।
रिकार्डो सैंटोस

9

VBScript लॉजिकल ऑपरेटर्स नहीं है

लगभग हर समझदार भाषा के विपरीत, VBScript तार्किक ऑपरेटरों के बजाय बिटवाइज़ ऑपरेटरों का उपयोग करता है। अभ्यास में इसका क्या मतलब है? खैर, जैसा कि एरिक लिपर्ट बताते हैं :

If Blah = True Then Print "True!" Else Print "False!"

तथा

If Blah Then Print "True!" Else Print "False!"

VBScript में समान नहीं हैं!

भी बदतर है, हालांकि, इस का मतलब है वहाँ बहुत VBScript में कोई शॉर्ट सर्किट मूल्यांकन कि निम्न कथन जाएगा कि दुर्घटना यदि आपके प्रोग्राम BlahहैNothing

If (Not Blah Is Nothing) And (Blah.Frob = 123) Then
...

यह सही है, VBScript, AND और तुलना के दोनों भागों का मूल्यांकन करेगा , भले ही पहला झूठ हो! उसको डूबने दो...


3
जब तक आप एक बग के अंदर शिकार करते हैं If x Then ... If Not x Then ... End If ... End Ifऔर यह पता लगाया है कि x 2 है, तो आपने वास्तव में VB / VBScript में प्रोग्राम नहीं किया है।
विन्यासकर्ता

7

EDIT: टिप्पणियों में चर्चा के बाद मैंने खुद को बेहतर तरीके से समझाने के लिए इस उत्तर को अपडेट करने का निर्णय लिया।

मैं वास्तव में सी में फ़ंक्शन पॉइंटर्स को देखने के तरीके से नफरत करता हूं। आमतौर पर किसी भी चर घोषणा की तरह दिखता है: type varname; फ़ंक्शन नाम से पहले * के साथ फ़ंक्शन की घोषणा की तरह दूसरी तरफ फ़ंक्शन सूचक घोषणाएं दिखती हैं। मैं इसे एक सूचक प्रकार के विवरण के रूप में स्वीकार कर सकता हूं, लेकिन सी में यह उस प्रकार के एक प्रकार के नाम और प्रकार दोनों को घोषित करता है। यह मेरे लिए असंगत लगता है क्योंकि प्रकार की घोषणाएं परिवर्तनीय घोषणाओं से भिन्न होती हैं। struct myStruct{int X; int Y;}केवल एक प्रकार को परिभाषित करता है, यह नाम के एक चर को परिभाषित नहीं करता है myStruct। इसी तरह मुझे फंक्शन पॉइंटर्स में एक परमाणु कथन में वर्गीकृत किए जाने वाले प्रकार की घोषणाओं और चर घोषणाओं का कोई कारण नहीं दिखता है , और न ही मैं type varname;संरचना से विचलन की सराहना करता हूं ।

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


1
यह भाषा के बाकी हिस्सों के अनुरूप है, इसलिए हो सकता है कि आपकी पकड़ सामान्य तौर पर C घोषणाकर्ताओं के वाक्यविन्यास के बारे में हो? क्या आप गो में प्रयुक्त सिंटैक्स पसंद करते हैं ?
फाइननव

किस तरीके से संगत? आमतौर पर यह जाता है: प्रकार varname; और जब हम एक नए मिश्रित प्रकार का निर्माण करते हैं, तो एक संरचना की तरह, पहले घोषणा आती है, शायद एक टाइपराइफ़ के साथ, और फिर हम उस प्रकार का एक चर बनाते हैं। जब हम एक फ़ंक्शन पॉइंटर की घोषणा करते हैं, तो यह int (* foo) (int arg1, int arg2) है, जो तब किसी फ़ंक्शन में दिए गए तर्क के प्रकार के रूप में उपयोग किया जाता है: void newFoo (int (* foo) (int arg1, int art2) )) .... और एक चर के रूप में: foo = a_compatible_func; मुझे लगता है कि पहले एक फ़ंक्शन घोषणा, और उसके बाद एक var घोषणा अधिक सुसंगत होगी, जैसे: typedef int (* foo) (int, int) MyFoo; MyFoo myfoo;
एप्सिलॉनवेक्टर

इसलिए आपको मिल गया typedef
15

4
@ ईप्सिलॉनवेक्टर: मैं इस बात से सहमत हूं कि फ़ंक्शन पॉइंटर सिंटैक्स बुरा है, लेकिन इसका पालन करने के लिए एक सरल नियम है जो पढ़ने में आसान बनाता है। दक्षिणावर्त सर्पिल नियम (शायद आपने इसे देखा है?): C-faq.com/decl/spiral.anderson.html
greyfade

1
एप्सिलॉनवेक्टर: मुझे यकीन नहीं है कि आप पॉइंटर वैरिएबल डिक्लेरेशन से वैरिएबल के नाम के अलावा और क्या डिक्लेयर करेंगे।

6

VBScript में अर्धविराम - या इसके अभाव

मैं पूरे दिन उन भाषाओं में काम कर रहा हूं जो प्रत्येक पंक्ति के अंत में अर्धविराम की अपेक्षा करती हैं। VBScript में पंक्ति के अंत में एक जोड़ें और आपका कोड अब नहीं चलता है।


4
यह मतदान, इसलिए नहीं कि मैं विशेष रूप से अर्धविराम पसंद करता हूं, लेकिन क्योंकि मैं वास्तव में जिस तरह से नफरत करता हूं वीबी वास्तव में लंबी लाइनों को इतनी असुविधाजनक बनाकर प्रोत्साहित करता है।
Shog9

6

में / बाहर तर्क। मैं सभी के लिए बहस कर रहा हूँ (अच्छी बात यह है कि), बाहर तर्क भी ठीक हैं, लेकिन एक तर्क जो इन दो राज्यों को व्यक्त करता है, वह मुझसे दूर हो जाता है।

यहां मैं जो लक्ष्य करता हूं, वे कार्य हैं जो एक पैरामीटर से इनपुट लेते हैं फिर कुछ आउटपुट के साथ उस इनपुट को अधिलेखित करते हैं। इसे अद्यतन करने के लिए संदर्भ द्वारा किसी ऑब्जेक्ट को पास करना ठीक है। लेकिन, ज्यादातर आदिम प्रकारों के लिए, किसी वस्तु को लेना, उसका उपयोग करना, फिर उसे पूरी तरह से बदलना, मेरे द्वारा सही नहीं है। आपको एक इनाउट के माध्यम से तर्क का अर्थ नहीं बदलना चाहिए ।


आपके मन में कौन सी भाषा है? यदि C # तो मैं असहमत हूं कि यह कष्टप्रद है क्योंकि यह हमेशा स्पष्ट है (C ++ के विपरीत)। मुझे ऐसी किसी भी मुख्यधारा की भाषा के बारे में पता नहीं है, जहां आपके द्वारा / बाहर के रूप में तर्क घोषित करने के लिए मजबूर किया जाता है।
5

@finnw मैं कभी नहीं देखा है एक भाषा जहां था कहने के लिए inके लिए inया तो तर्क, मैं सिर्फ उनके बारे में बात कर रहा हूँ। इसके अलावा, मेरी राय में, कुछ भी एक / बाहर तर्क में बहाना नहीं कर सकता है, और उन्हें स्पष्ट करने से दर्द से राहत नहीं मिलती है। फ़ंक्शन के लिए उपयोगी मान के साथ एक स्थानीय चर को इनिशियलाइज़ करने का कोई कारण नहीं होना चाहिए, और यह एक ही वैरिएबल होता है, जिसमें अचानक फ़ंक्शन को वहां डालने का निर्णय लिया जाता है। ये दोनों अलग-अलग होने चाहिए। हमेशा।
15

क्षमा करें, मैं वहां बहुत स्पष्ट नहीं था। मेरे कहने का मतलब है "मुझे किसी भी भाषा का पता नहीं है, जहां सभी तर्क निहित रूप से + बाहर हैं" अर्थात आपको उस सुविधा का उपयोग करने के लिए मजबूर नहीं किया जाता है, लेकिन वैध उपयोग के मामले हैं (उदाहरण के लिए structजहां नया मान अपडेट करना मूल्य पर निर्भर करता है) उसी के दूसरे क्षेत्र में struct।)
19

@finnw ऑब्जेक्ट्स को संदर्भ द्वारा पास किया गया (जैसे classC # में ऑब्जेक्ट्स के इंस्टेंस ) एक फ़ंक्शन द्वारा संशोधित किया जाना मेरे लिए ठीक है। इसके अलावा कि मैं गैर-स्थिर संरचनाओं को नापसंद करता हूं, यह अद्यतन करने के structलिए refकीवर्ड के साथ गुजरना ठीक है, भी। जब इनपुट आउटपुट के साथ ओवरराइट हो जाता है तो मुझे वास्तव में क्या नफरत है । सबसे अच्छा उदाहरण मैं सोच सकता हूं कि बर्कले सॉकेट का acceptकार्य है: इसे एक socklen_t*तर्क की आवश्यकता है, इनपुट पर, struct sockaddr*आपके पास पास का आकार होना चाहिए ; और आउटपुट पर, उस पर लिखी गई बाइट की संख्या शामिल होगी। यह आपराधिक होना चाहिए।
zneak

मैं मानता हूं कि खराब है (IIRC कुछ Win32 I / O फ़ंक्शन समान है) लेकिन वह सुविधा का दुरुपयोग है (फ़ंक्शन कॉल पास-इन चर का अर्थ बदलता है, न कि केवल इसके मूल्य) और इसका मतलब यह नहीं है कि सुविधा खुद बुरा है।
finnw

6

C और C ++ में ऐरे की घोषणा।

आमतौर पर, एक चर घोषणा प्रारूप का होता है type variable_name। आप उन घोषणाओं को आसानी से बाएं से दाएं तरीके से पढ़ सकते हैं। लेकिन int foo[size]पहले ऐसा लगता है कि यह fooएक इंट के रूप में घोषित हो रहा है , और फिर आप आगे पढ़ते हैं और देखते हैं कि फू का "पूर्णांक का सरणी" है। int[size] fooबहुत बेहतर पढ़ता है।

और मैं भी यह नफरत जब प्रोग्रामर एक ऐसी ही कारण के लिए इस तरह संकेत घोषित: int *foo। किसी कारण से मुझे यह पता नहीं चला, कि यह लिखा हुआ विशिष्ट तरीका है।


1
पुन: सूचक घोषणाएँ: वे इस तरह लिखी जाती हैं क्योंकि ' ' चर नाम से बंधता है, प्रकार नहीं। तो int* a, b;* घोषित नहीं करता हैa और bसंकेत के रूप में; केवल aहै। इसलिए इसे लिखना बेहतर है int *a, b;(या दो घोषणाओं के रूप में लिखना भी बेहतर है)।
स्टीव मेलनिकॉफ़

अच्छी बात। यह बहुत बुरा *है टाइप करने के लिए बाध्य नहीं है।
याकूब

2
और यह फंक्शन पॉइंटर्स का कुछ नहीं कहना है ... void(int) *f;? नोप:void (*f)(int);
स्व पर ध्यान दें -

आधुनिक C ++ में संकेत और सरणियों की बहुत कम आवश्यकता होती है।
fredoverflow

2
@ स्तेव मेलनिकॉफ़: हालाँकि मैंने इस उत्तर को 1ed किया है, लेकिन मुझे लगता है कि int* a, b;आपने जिस मुद्दे का उल्लेख किया है वह बहुत अधिक है।
j_random_hacker

5

जावा में अनावश्यक परिमाणीकरण:

HashMap<String,HashMap<String,String>> foo = new HashMap<String, HashMap<String, String>>();

कंपाइलर के विचार से अन्य प्रकार का पैरामीटर किस तरह का fooहो सकता है?


4
मुझे आशा है कि आप जावा के (सीमित) प्रकार के निष्कर्षों से अवगत हैं? HashMap<String,HashMap<String,String>> foo = Maps.newHashMap();
फाइनेंशियल

1
जावा 7:HashMap<String,HashMap<String,String>> foo = new HashMap<>();
बार्ट वैन ह्युकेलोम

5
वैसे इसका कोई भी प्रकार हो सकता है, जो भी हो, प्रकार वैसे भी मिट जाते हैं ...
विन्यासकर्ता

प्रकार की कमी की कमी, आप मतलब है?
लापता

What other type parameterization does the compiler think foo could have?- जो भी कारण यह है कि यह कच्चे प्रकार की चीजें हैं - जैसे कि कोई भी समझदार भी कच्चे और पैराड्राइज्ड प्रकारों को मिलाएगा।
मातरिनस

5

चूंकि लोगों ने पहले ही =बनाम के बारे में शिकायत कर दी है ==, इसलिए मुझे एक बहुत बुरा विकल्प बताते हैं। पी एल / मैं दोनों के लिए किया था :=और =, लेकिन जब कुछ "स्पष्ट रूप से" एक काम था, यह आप का उपयोग कर के साथ दूर होने दिया जाएगा =यह करने के लिए। :=आपको किसी ऐसी स्थिति में असाइनमेंट होने के लिए मजबूर करने का उपयोग करना चाहिए जहां कंपाइलर अन्यथा इसकी तुलना के रूप में व्याख्या करेगा।

दुर्भाग्य से, कंपाइलर ने हमेशा चीजों पर फैसला नहीं किया, जिस तरह से आप उम्मीद कर सकते हैं। केवल एक स्पष्ट उदाहरण पर विचार करें:

A = B = 0;

अब, अधिकांश "साधारण" भाषाओं से परिचित अधिकांश लोगों के लिए, इसका अर्थ बहुत स्पष्ट है - ए और बी दोनों के लिए 0 असाइन करें। पीएल / मैं बस थोड़ा सा है ... हालांकि अलग। केवल भाषा के (पागल) डिजाइनरों के लिए ज्ञात कारणों के लिए, पहले =को एक असाइनमेंट के रूप में व्याख्या की जाती है, लेकिन दूसरे =की तुलना के रूप में व्याख्या की जाती है। इसलिए, यह बी से 0 की तुलना करता है, और फिर ए की तुलना के परिणाम को बताता है (सी-स्टाइल सम्मेलन का अनुसरण करते हुए कि "झूठे" का परिणाम 0 और "सच" 1 में है)।

इसलिए, यदि B 0 था, तो A 1 हो जाता है। अन्यथा, A बन जाता है। दूसरे शब्दों में, A और B को समान मान देने के बजाय, यह वास्तव में यह सुनिश्चित करता है कि A में B के समान मान नहीं हो सकता

नीचे पंक्ति: भले ही सी / सी ++ / पीएचपी शैली शुरू में दर्द की तरह लगती है, विकल्प 1 बहुत खराब है ।

1 खैर, तकनीकी रूप से, एक और विकल्प है: पास्कल शैली, जहां =हमेशा तुलना और असाइनमेंट की हमेशा आवश्यकता होती है :=। थोड़ी देर के लिए उपयोग करने के बाद, यह बहुत स्पष्ट है (कम से कम मेरे लिए) कि असाइनमेंट तुलना की तुलना में काफी अधिक सामान्य है कि अगर आपको दोनों को अलग करने के लिए अतिरिक्त "सामान" की आवश्यकता हो, तो आपको निश्चित रूप से असाइनमेंट को साफ और सरल रखना चाहिए तुलना पर अतिरिक्त "ग्रंज" की आवश्यकता होती है, इसके विपरीत नहीं।


1
मैं भी ==समानता के लिए और :=असाइनमेंट के लिए उपयोग करने का प्रस्ताव था। इस तरह आपके पास टाइप करने के लिए अधिक है, लेकिन अकेले =से बचने से कीड़े से बचने में मदद मिलती है।
मआर्टिनस २६'११

@maartinus: कम से कम मेरे लिए, जो कि सबसे बुरी संभावना की तरह लगता है, लेकिन ऐसा ही जीवन है ...
जैरी कॉफिन

3

पर्ल

  1. काश पर्ल मुझे लिखने दे if($x < 10) do_something();। फिलहाल, आपको यह लिखना होगा कि do_something() if($x < 10);या तो if($x < 10) { do_something(); }

9
do_something() if ($x < 10);यह बुरा नहीं है।
zneak

यह नहीं है, और कई मामलों में if(..) ...बूट की तुलना में बहुत अधिक स्वच्छ है , क्योंकि आप सभी अभिव्यक्तियों को सही पर पंक्तिबद्ध कर सकते हैं। लेकिन ऐसा समय है जब मैं वास्तव में कहना चाहता हूं if($x < 10) do_something();, और यह दुर्भाग्यपूर्ण है कि पर्ल मुझे नहीं होने देंगे।
गौरव

7
यह दुर्भाग्यपूर्ण है जब तक आप लिखते हैं if ($x<10) do_something(); and_call_me(); और फिर आश्चर्य करते हैं कि आपको कभी कॉल क्यों नहीं मिलता है। मैं चाहता हूं कि सी और परिवार को उस प्रकार की त्रुटि को रोकने के लिए ब्रेसिज़ की आवश्यकता होगी।
एएसपीली

2
@AShelly: या आपको हमेशा कॉल क्यों मिलता है, वास्तव में।
zneak 1

1
@zneak को छोड़कर कोई elseएस। (मुझे लगता है कि यह EXPR1 if COND else EXPR2अजगर की तरह है)
मिंग-तांग

3

reinterpret_cast<unsigned long>सी ++ में। यह ऑपरेशन विदेशी एपीआई से निपटने और संख्यात्मक परिशुद्धता सुनिश्चित करने में उपयोगी है, इसे देखने के लिए इतना दर्द क्यों होना चाहिए और इतना बदसूरत क्यों होना चाहिए?


17
यह आपको याद दिलाने के लिए बदसूरत है कि आपको उस कोड को लिखने का प्रयास करना चाहिए जिसकी आवश्यकता नहीं है। :)
ग्रेफेड 20

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

5
यह वास्तव में एक सैद्धांतिक सीएस तर्क नहीं है: reinterpret_castसी ++ में ए का उपयोग करना एक बहुत मजबूत कोड गंध है। 99% समय, जब आप इसका उपयोग करने वाले होते हैं, तो संभावना होती है, आपको इसकी आवश्यकता नहीं होनी चाहिए - आपने शायद कुछ गलत किया है। अन्य 1% समय, आप सी के साथ हस्तक्षेप कर रहे हैं। reinterpret_castकुछ काम करने के लिए टाइप सिस्टम को तोड़ता है जब वह अन्यथा नहीं कर सकता। यह आमतौर पर एक बुरी बात है।
ग्रेफेड 5

3

के लिए ... जावास्क्रिप्ट में निर्माण और PHP में foreach निर्माण जब arrays पर पाशन। दोनों को सही कोड की तुलना में बग्स लिखना आसान लगता है।


3
वाह, ऐसी बकवास है। "सही कोड की तुलना में"। चले जाओ।
जोनाथन स्टर्लिंग

यदि मुझे उन्हें सुरक्षित रूप से उपयोग करने के लिए अतिरिक्त कोड लिखना है, तो वे मेरी पुस्तक में गलत उपयोग करना आसान हैं। के लिए ... यह सुनिश्चित करने के लिए कि आपको प्रोटोटाइप से ऑब्जेक्ट्स पर पुनरावृत्ति नहीं हो रही है, और फ़ॉरच के अंतिम मान को ओवरराइट करने के लिए आपको रिफ़र करना होगा या फ़ॉर्वर्ड करने के लिए अतिरिक्त चेक की आवश्यकता होगी।
जोरी सेबर्ट्स

बदलते संदर्भों के साथ (और ऑपरेटर) एक प्रसिद्ध बग है ...
umlcat

1
मैं भ्रमित हूं, मुझे लगा कि यह सामान्य ज्ञान था कि जावास्क्रिप्ट में "for..in" निर्माण टूट गया है ... यह आपत्तिजनक क्यों है?
lvilnis

2

C / C ++ में संकेत या सरणियों के संकेत। मैं अभी भी इनके बारे में उलझन में हूं।


3
प्रकार को पीछे की ओर पढ़ें। int[]*पूर्णांक की एक सरणी के लिए एक सूचक है, और पूर्णांक int*[]के लिए संकेत की एक सरणी है। constएस के साथ भी अच्छी तरह से काम करता है: int* constपूर्णांकों के लिए एक निरंतर सूचक है, जबकि const int*और int const*निरंतर पूर्णांक (या पूर्णांक स्थिरांक) के संकेत हैं।
zneak

@zneak: "राइट टू लेफ्ट" काम नहीं करता है, उल्लेखित " क्लॉकवाइज स्पाइरल" / "इनसाइड आउट" नियम देखें।

या, बस टाइप करें, और कोई भ्रम नहीं है।
बिली ओपल

आधुनिक C ++ में संकेत और सरणियों की बहुत कम आवश्यकता होती है।
fredoverflow

4
@ टिचर: सच नहीं। 10 ints की एक सरणी के लिए एक सूचक होने की int (*p)[10];घोषणा करता pहै। यदि sizeof (int) == 4, तब 40 p++से आगे p
बढ़ेगा।

2

यह तथ्य कि पायथन पाठ प्रारूपण पर निर्भर करता है।


1

जावास्क्रिप्ट / जावा आदि, तुलना के बराबर है, उदाहरण के लिए अगर (a == 1)

मैं कितनी बार लिखता हूँ अगर (a = 1)?

एक इंसान के रूप में मैंने उसे पूरी तरह से पढ़ा। लेकिन darn दुभाषिया / कंपाइलर कहता है, "हे मैं 1 को असाइन करूँगा, फिर जांचें कि क्या यह 1 के बराबर है, और क्या आप मानते हैं कि यह हाँ है!

मुझे दीवार पर चढ़ाता है।

अगर (a == 1) बहुत कम पठनीय है, और दुभाषिया / संकलक को पता होना चाहिए कि मेरा क्या मतलब है; कई अन्य कम भाषाएँ (VB) सैकड़ों वर्षों से इसे सफलतापूर्वक काम कर रही हैं।


क्या if (a = true)मतलब है?
टॉम हॉल्टिन - 17

2
असाइनमेंट केवल मान वापस नहीं करना चाहिए। यह कभी-कभी उपयोगी होता है, लेकिन ज्यादातर मामलों में यह सिर्फ गर्दन में दर्द होता है।
विन्यासकर्ता

जावास्क्रिप्ट में JSLint कि आप के लिए एक पकड़ लेंगे।
Zachary K

मुसीबत यह है, स्थितियों में असाइनमेंट उपयोगी हो सकता है। मुझे <tt> जबकि (तत्व = सूची-> अगला ()) </ tt> काफी सुपाठ्य लगता है। इसलिए मुझे यकीन नहीं है कि मैं चाहूंगा कि इसे हटा दिया जाए।
इंका

3
@ टॉम: इसका मतलब है कि आप बूलियंस को नहीं समझते हैं। अगर आपका मतलब है if (a == true), तो बस लिखें if (a)। अगर आपका मतलब है a = true, तो ifबयान बेमानी है।
dan04


0

structPointer->memberC / C ++ में। किसी और के कोड को पढ़ने के लिए अच्छा हो सकता है, लेकिन मुझे यह पसंद नहीं है। एक के बदले दो चरित्र ... अंतरिक्ष की बर्बादी क्या!


2
दुर्भाग्य से, इसे अलग किया जाना चाहिए ., जो गैर-पॉइंटर ऑब्जेक्ट के सदस्यों पर लागू होता है। अस्पष्ट सिंटैक्स बुरा है, mmmkay?
ग्रेफेड 20

2
@ ग्रेफेड: हां! क्योंकि कंपाइलर संभवतः अपने प्रकार के सिस्टम नियमों का उपयोग यह बताने के लिए नहीं कर सकता है कि आप पॉइंटर-टू-स्ट्रक्चर प्रकार का उपयोग कब कर रहे हैं और डीरेंस को अंतर्निहित रूप से लागू करते हैं। नहीं, यह पागल बात है! (और फिर भी यह किसी भी तरह आपको एक त्रुटि संदेश दे सकता है जब आप इसे गलत पाते हैं।) सिंटैक्स के बारे में अस्पष्ट कुछ भी नहीं है। यह हमेशा की तरह सिर्फ सी एक गड़बड़ गड़बड़ है। डेल्फी का अर्थ है कि आप वास्तव में अंधेरे कोनों में काम कर रहे हैं, अगर आपको पॉइंटर्स-टू-रिकॉर्ड की आवश्यकता होती है, तो यह निश्चित रूप से एक पार्सर को भ्रमित किए बिना किया जा सकता है ...
मेसन व्हीलर

5
@ मेसन: उन मामलों के बारे में क्या है shared_ptr, जहां ->निहित प्रकार .तक पहुंच है और shared_ptrस्वयं के गुणों तक पहुंच है? मुझे खेद है, लेकिन मैं यहां पूरी तरह से असहमत हूं।
बिली ओपल

2
और भी बुरा हो सकता था। PHP हो सकता है, जहाँ आपको किसी भी चीज़ के-> सदस्यों का उपयोग करने के लिए उपयोग करना होगा ।
कार्सन मायर्स

1
@maaartinus: कोई भी कोड जो इस बात पर निर्भर करता है कि ऑपरेशन के गैर-स्पष्ट आदेश पर बहुत अधिक कोड नहीं है, मैं लिखूंगा।
बिली ओनेल

0

कोष्ठक में स्केल बहु-पंक्ति कोड

उदाहरण के लिए:

class Foo(
         val bar: String,
         val baz: Int,
         val bing: String,
         val bong: Boolean
 ) extends Model {
   // body here
 }

आप वास्तव में इससे जो प्राप्त करते हैं वह बहुत बढ़िया है। यह कंस्ट्रक्टर और गेटर्स को जेनरेट करता है और आपके लिए बसता है। लेकिन यह निश्चित रूप से बदसूरत है और मेरे सभी मानसिक मॉडल को तोड़ता है कि कोड को कैसे इंडेंट करना है और मूल रूप से मुझे ऐसा महसूस होता है कि मैं एक तरह से विचित्र सैंडविच हूं जिसमें एक तरफ जावा और दूसरी तरफ लिस्प है। (ओह, रुको ... यह स्काला का मुद्दा है।)


मैं उलझन में हूँ - क्या आप कोष्ठक में भाग का मतलब है ( val barऔर इतने पर) या घुंघराले ब्रेसिज़ में भाग (निम्नलिखित भाग extends Model)? (उस कोड में कोई ब्रैकेट नहीं हैं)
बिली ओनेल

3
कोष्ठकों में हिस्सा। मैं अंग्रेजी हूँ। हम उन्हें कोष्ठक, लानत के रूप में संदर्भित करते हैं, क्योंकि उस स्थिति में वे एक पैतृक भूमिका नहीं निभा रहे हैं।
टॉम मॉरिस

2
यह सब बुरा नहीं लगता है अगर इस तरह से इंडेंट किया जाए: pastebin.com/h9qC8XGg
17

मुझे इन रचनाकार पैरामीटर सूचियों को क्षैतिज रूप से लिखना अधिक पठनीय लगता है, खासकर जब मेरे पास केवल कुछ पैरामीटर हैं।
एमजेपी

मेरे लिए एक विधि की तरह लग रहा है। जैसे सिमूला। अच्छा पुराना स्कूल।
टॉम हॉल्टिन -
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.