क्यों जंजीरों में बंधे अपरंपरागत है?


46

बीन्स पर लागू होने वाली चेनिंग बहुत आसान है: निर्माणकर्ताओं, मेगा कंस्ट्रक्टरों, कारखानों को ओवरलोड करने की कोई आवश्यकता नहीं है, और इससे आपको पठनीयता में वृद्धि होती है। मैं किसी भी गिरावट के बारे में नहीं सोच सकता, जब तक आप नहीं चाहते कि आपकी वस्तु अपरिवर्तनीय हो , जिस स्थिति में यह किसी भी तरह से नहीं होगा। तो क्या यह OOP सम्मेलन नहीं है एक कारण है?

public class DTO {

    private String foo;
    private String bar;

    public String getFoo() {
         return foo;
    }

    public String getBar() {
        return bar;
    }

    public DTO setFoo(String foo) {
        this.foo = foo;
        return this;
    }

    public DTO setBar(String bar) {
        this.bar = bar;
        return this;
    }

}

//...//

DTO dto = new DTO().setFoo("foo").setBar("bar");

32
क्योंकि जावा एकमात्र ऐसी भाषा हो सकती है जहां
बसने वाला

11
यह खराब शैली है क्योंकि वापसी मूल्य शब्दार्थ से सार्थक नहीं है। यह भ्रामक है। केवल उल्टा बहुत कम कीस्ट्रोक्स बचा रहा है।
usr

58
यह पैटर्न बिल्कुल भी असामान्य नहीं है। यहां तक ​​कि इसके लिए एक नाम भी है। इसे धाराप्रवाह इंटरफ़ेस कहा जाता है
फिलीपींस

9
आप इस रचना को एक बिल्डर में अधिक पठनीय परिणाम के लिए भी सार कर सकते हैं। myCustomDTO = DTOBuilder.defaultDTO().withFoo("foo").withBar("bar").Build();मैं ऐसा करूँगा, ताकि सामान्य विचार के साथ टकराव न हो जो बसने वाले लोग हैं।

9
@Philipp, जबकि तकनीकी रूप से आप सही हैं, यह नहीं कहेंगे कि new Foo().setBar('bar').setBaz('baz')बहुत "धाराप्रवाह" लगता है। मेरा मतलब है, यकीन है कि यह बिल्कुल उसी तरह से लागू किया जा सकता है, लेकिन मैं बहुत कुछ पढ़ने की उम्मीद करूंगाFoo().barsThe('bar').withThe('baz').andQuuxes('the quux')
वेन वर्नर

जवाबों:


50

तो क्या यह OOP सम्मेलन नहीं है एक कारण है?

मेरा सबसे अच्छा अनुमान: क्योंकि यह सीक्यूएस का उल्लंघन करता है

आपको एक कमांड मिला है (ऑब्जेक्ट की स्थिति बदल रहा है) और एक क्वेरी (राज्य की एक प्रति लौटाता है - इस मामले में, ऑब्जेक्ट खुद) एक ही विधि में मिलाया जाता है। यह जरूरी नहीं कि एक समस्या है, लेकिन यह कुछ बुनियादी दिशानिर्देशों का उल्लंघन करता है।

उदाहरण के लिए, C ++ में, std :: stack :: pop () एक कमांड है जो शून्य देता है, और std :: stack :: top () एक क्वेरी है जो स्टैक में शीर्ष तत्व का संदर्भ देता है। शास्त्रीय रूप से, आप दोनों को संयोजित करना चाहेंगे, लेकिन आप ऐसा नहीं कर सकते और सुरक्षित रहें। (जावा में कोई समस्या नहीं है, क्योंकि जावा में असाइनमेंट ऑपरेटर नहीं फेंकता है)।

यदि DTO एक मूल्य प्रकार था, तो आप इसके साथ एक समान अंत प्राप्त कर सकते हैं

public DTO setFoo(String foo) {
    return new DTO(foo, this.bar);
}

public DTO setBar(String bar) {
    return new DTO(this.foo, bar);
}

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

अंत में, समस्या यह है कि डिफ़ॉल्ट निर्माता को एक ऑब्जेक्ट के साथ छोड़ देना चाहिए जो एक मान्य स्थिति में है। यदि आपको ऑब्जेक्ट को एक वैध स्थिति में पुनर्स्थापित करने के लिए कमांड का एक गुच्छा चलाना चाहिए , तो कुछ बहुत गलत हो गया है।


4
अंत में, यहाँ एक असली बिल्ली। विरासत वास्तविक समस्या है। मुझे लगता है कि चाइनिंग डेटा-प्रतिनिधित्व-वस्तुओं के लिए एक पारंपरिक सेटर हो सकता है जो रचना में उपयोग किए जाते हैं।
बेन

6
"किसी वस्तु से राज्य की प्रति लौटाता है" - यह ऐसा नहीं करता है।
user253751

2
मैं यह तर्क दूंगा कि उन दिशानिर्देशों का पालन करने का सबसे बड़ा कारण (पुनरावृत्तियों जैसे कुछ उल्लेखनीय अपवादों के साथ) यह है कि यह कोड को बड़े पैमाने पर आसान बनाता है ।
jpmc26

1
@MatthieuM। नहीं। मैं मुख्य रूप से जावा बोलता हूं, और यह उन्नत "द्रव" एपीआई में वहां प्रचलित है - मुझे यकीन है कि यह अन्य भाषाओं में भी मौजूद है। अनिवार्य रूप से आप अपने प्रकार को सामान्य बनाने वाले प्रकार पर सामान्य बनाते हैं । फिर आप abstract T getSelf()जेनेरिक प्रकार रिटर्न के साथ एक विधि जोड़ते हैं । अब, thisअपने return getSelf()बसने वालों से लौटने के बजाय , आप और फिर कोई भी ओवरराइडिंग क्लास बस टाइप को अपने आप में सामान्य बनाता है और वापस लौटता thisहै getSelf। इस तरह बसने वाले वास्तविक प्रकार लौटाते हैं न कि घोषित प्रकार।
बोरिस द स्पाइडर

1
@MatthieuM। वास्तव में? C ++ के लिए CRTP के समान लगता है ...
बेकार

33
  1. कुछ कीस्ट्रोक्स सहेजना सम्मोहक नहीं है। यह अच्छा हो सकता है, लेकिन ओओपी कन्वेंशन अवधारणाओं और संरचनाओं के बारे में अधिक ध्यान रखते हैं, कीस्ट्रोक्स नहीं।

  2. वापसी मूल्य अर्थहीन है।

  3. अर्थहीन होने से भी अधिक, वापसी मूल्य भ्रामक है, क्योंकि उपयोगकर्ता वापसी मूल्य की उम्मीद कर सकते हैं। वे उम्मीद कर सकते हैं कि यह एक "अपरिवर्तनीय सेटर" है

    public FooHolder {
        public FooHolder withFoo(int foo) {
            /* return a modified COPY of this FooHolder instance */
        }
    }
    

    वास्तव में आपका सेटर वस्तु को बदल देता है।

  4. यह वंशानुक्रम के साथ अच्छी तरह से काम नहीं करता है।

    public FooHolder {
        public FooHolder setFoo(int foo) {
            ...
        }
    }
    
    public BarHolder extends FooHolder {
        public FooHolder setBar(int bar) {
            ...
        }
    } 
    

    मैं लिख सकता हूँ

    new BarHolder().setBar(2).setFoo(1)

    लेकिन नहीं

    new BarHolder().setFoo(1).setBar(2)

मेरे लिए, # 3 के माध्यम से # 1 महत्वपूर्ण हैं। अच्छी तरह से लिखा कोड सुखद व्यवस्थित पाठ के बारे में नहीं है। अच्छी तरह से लिखा कोड मौलिक अवधारणाओं, संबंधों और संरचना के बारे में है। पाठ केवल कोड के सही अर्थ का एक बाहरी प्रतिबिंब है।


2
हालांकि इनमें से अधिकांश तर्क किसी भी धाराप्रवाह / श्रृंखलाबद्ध इंटरफ़ेस पर लागू होते हैं।
केसी

@ कैसी, हाँ। बिल्डर्स (यानी सेटलर्स के साथ) सबसे अधिक मामला है जिसे मैं चेंजिंग के रूप में देखता हूं।
पॉल ड्रेपर

10
यदि आप एक धाराप्रवाह इंटरफ़ेस के विचार से परिचित हैं, तो # 3 लागू नहीं होता है, क्योंकि आपको रिटर्न प्रकार से एक धाराप्रवाह इंटरफ़ेस पर संदेह करने की संभावना है। मुझे इस बात से भी असहमत होना है कि "अच्छी तरह से लिखा कोड सुखद व्यवस्था वाले पाठ के बारे में नहीं है"। यह सब इसके बारे में नहीं है, लेकिन अच्छी तरह से व्यवस्थित पाठ बल्कि महत्वपूर्ण है, क्योंकि यह कार्यक्रम के मानव पाठक को इसे कम प्रयास के साथ समझने की अनुमति देता है।
माइकल शॉ

1
सेटर चेनिंग पाठ की सुखद व्यवस्था या कीस्ट्रोक्स को बचाने के बारे में नहीं है। यह पहचानकर्ताओं की संख्या को कम करने के बारे में है। सेटर चेनिंग से आप ऑब्जेक्ट को एक ही एक्सप्रेशन में बना और सेट कर सकते हैं, जिसका अर्थ है कि आपको इसे एक वैरिएबल में सहेजना नहीं पड़ सकता है - एक वैरिएबल जिसका आपको नाम देना होगा , और जो कि स्कोप के अंत तक रहेगा।
इदं आर्ये

3
बिंदु # 4 के बारे में, यह कुछ ऐसा है जिसे जावा में हल किया जा सकता है: public class Foo<T extends Foo> {...}सेटर के लौटने के साथ Foo<T>। इसके अलावा जो 'सेटर' तरीके हैं, मैं उन्हें 'विधियों' के साथ कॉल करना पसंद करता हूं। यदि ओवरलोडिंग ठीक काम करती है, तो बस Foo<T> with(Bar b) {...}, अन्यथा Foo<T> withBar(Bar b)
योयो

12

मुझे नहीं लगता कि यह एक ओओपी सम्मेलन है, यह भाषा के डिजाइन और इसके सम्मेलनों से अधिक संबंधित है।

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

बेशक आप पूछ सकते हैं, कि विनिर्देश का हिस्सा क्यों नहीं है। मुझे उत्तर नहीं पता, शायद यह पैटर्न उस समय सिर्फ ज्ञात / लोकप्रिय नहीं था।


हाँ, JavaBeans बिल्कुल वही है जो मेरे मन में था।
बेन

मुझे नहीं लगता कि अधिकांश एप्लिकेशन जो जावाबिन की देखभाल का उपयोग करते हैं, लेकिन वे (सेट '...' नाम के तरीकों को हथियाने के लिए प्रतिबिंब का उपयोग कर सकते हैं, एक एकल पैरामीटर है, और शून्य रिटर्न हैं )। कई स्थैतिक विश्लेषण कार्यक्रम एक ऐसी विधि से रिटर्न मान की जांच नहीं करने के बारे में शिकायत करते हैं जो कुछ देता है और यह बहुत कष्टप्रद हो सकता है।

जावा में विधियाँ प्राप्त करने के लिए @MichaelT चिंतनशील कॉल वापसी प्रकार निर्दिष्ट नहीं करते हैं। किसी विधि को कॉल करना Objectजो वापसी करता है , जिसके परिणामस्वरूप एकल प्रकार का सिंगलटन Voidलौटाया जा सकता है यदि विधि voidअपने रिटर्न प्रकार के रूप में निर्दिष्ट करती है । अन्य समाचारों में, जाहिरा तौर पर "एक टिप्पणी छोड़ना लेकिन मतदान नहीं करना" एक "पहली पोस्ट" ऑडिट को विफल करने का आधार है भले ही यह एक अच्छी टिप्पणी हो। मैं इसके लिए शोग को दोषी मानता हूं।

7

जैसा कि अन्य लोगों ने कहा है, इसे अक्सर एक धाराप्रवाह इंटरफ़ेस कहा जाता है ।

आमतौर पर सेटर किसी एप्लिकेशन में लॉजिक कोड के जवाब में वेरिएबल्स में कॉल करते हैं ; आपका डीटीओ वर्ग इसका एक उदाहरण है। परम्परागत कोड जब सेटलर्स कुछ भी वापस नहीं करते हैं तो इसके लिए सबसे अच्छा है। अन्य उत्तरों ने रास्ता समझाया है।

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

  • स्थिरांक ज्यादातर वासियों को दिए जाते हैं
  • प्रोग्राम लॉजिक बदल नहीं जाता है जो कि वासियों को दिया जाता है।

कॉन्फ़िगरेशन सेट करना, उदाहरण के लिए धाराप्रवाह-निबर्नेट

Id(x => x.Id);
Map(x => x.Name)
   .Length(16)
   .Not.Nullable();
HasMany(x => x.Staff)
   .Inverse()
   .Cascade.All();
HasManyToMany(x => x.Products)
   .Cascade.All()
   .Table("StoreProduct");

यूनिट टेस्ट में परीक्षण डेटा सेट करना, विशेष टेस्टडेटाबुलरक्लासेस (ऑब्जेक्ट मदर्स) का उपयोग करना

members = MemberBuilder.CreateList(4)
    .TheFirst(1).With(b => b.WithFirstName("Rob"))
    .TheNext(2).With(b => b.WithFirstName("Poya"))
    .TheNext(1).With(b => b.WithFirstName("Matt"))
    .BuildList(); // Note the "build" method sets everything else to
                  // senible default values so a test only need to define 
                  // what it care about, even if for example a member 
                  // MUST have MembershipId  set

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


5

मुझे लगता है कि इसका कारण यह है कि एक के बाद एक सेटर को चेन करने के लिए यह एक कन्वेंशन नहीं है क्योंकि उन मामलों के लिए एक कंस्ट्रक्टर में एक विकल्प ऑब्जेक्ट या मापदंडों को देखना अधिक विशिष्ट है। C # में एक आरंभिक सिंटैक्स भी है।

के बजाय:

DTO dto = new DTO().setFoo("foo").setBar("bar");

कोई लिख सकता है:

(जेएस में)

var dto = new DTO({foo: "foo", bar: "bar"});

(सी # में)

DTO dto = new DTO{Foo = "foo", Bar = "bar"};

(जावा में)

DTO dto = new DTO("foo", "bar");

setFooऔर setBarफिर आरंभीकरण के लिए आवश्यक नहीं हैं, और बाद में उत्परिवर्तन के लिए उपयोग किया जा सकता है।

हालांकि कुछ परिस्थितियों में चेनबिलिटी उपयोगी होती है, लेकिन यह महत्वपूर्ण है कि न्यूलाइन वर्णों को कम करने के लिए केवल एक लाइन पर सब कुछ सामान करने की कोशिश न करें।

उदाहरण के लिए

dto.setFoo("foo").setBar("fizz").setFizz("bar").setBuzz("buzz");

यह पढ़ने और समझने में कठिन बनाता है कि क्या हो रहा है। सुधार करने के लिए:

dto.setFoo("foo")
    .setBar("fizz")
    .setFizz("bar")
    .setBuzz("buzz");

समझने में बहुत आसान है, और पहले संस्करण में "गलती" को और अधिक स्पष्ट करता है। एक बार जब आपने उस प्रारूप में कोड को वापस ले लिया है, तो कोई वास्तविक लाभ नहीं है:

dto.setFoo("foo");
dto.setBar("bar");
dto.setFizz("fizz");
dto.setBuzz("buzz");

3
1. मैं वास्तव में पठनीयता के मुद्दे से सहमत नहीं हो सकता, प्रत्येक कॉल से पहले उदाहरण जोड़ना यह बिल्कुल भी स्पष्ट नहीं कर रहा है। 2. जेएस और सी # के साथ आपके द्वारा दिखाए गए प्रारंभिक पैटर्न का निर्माणकर्ताओं से कोई लेना-देना नहीं है: आपने जेएस में जो किया वह एक एकल तर्क है, और आपने सी # में जो किया है वह एक सिंटेक्स शूगर है जो गेटर्स को कॉल करता है और पर्दे के पीछे बस जाता है, और जावा सी # की तरह गेटर-सेटर शुगर नहीं है।
बेन

1
@ बेनेडिक्टस, मैं कई अलग-अलग तरीके दिखा रहा था कि ओओपी भाषाएँ इस मुद्दे को बिना जंजीर के संभालती हैं। बिंदु समान कोड प्रदान करने के लिए नहीं था, बिंदु वैकल्पिक विकल्पों को दिखाने के लिए था जो कि अनावश्यक का निर्माण करते हैं।
zzzzBov

2
"प्रत्येक कॉल से पहले उदाहरण जोड़ने से यह बिल्कुल भी स्पष्ट नहीं हो रहा है" मैंने कभी दावा नहीं किया कि प्रत्येक कॉल से पहले आवृत्ति को जोड़ने से कुछ भी स्पष्ट हो जाता है, मैंने सिर्फ यह कहा कि यह अपेक्षाकृत समकक्ष था।
zzzzBov

1
VB.NET में एक प्रयोग करने योग्य "विथ" कीवर्ड भी है जो एक संकलक-अस्थायी संदर्भ बनाता है ताकि उदाहरण के लिए [ /लाइन ब्रेक का प्रतिनिधित्व करने के लिए] के With Foo(1234) / .x = 23 / .y = 47बराबर हो Dim temp=Foo(1234) / temp.x = 23 / temp.y = 47। इस तरह के वाक्यविन्यास से अस्पष्टता पैदा नहीं होती है क्योंकि .xस्वयं के पास "स्टेटमेंट" [अगर कोई नहीं है, या कोई सदस्य नहीं है x, तो .xअर्थहीन है] के आसपास बाँधने के अलावा कोई अर्थ नहीं हो सकता है । जावा में ओरेकल ने ऐसा कुछ भी शामिल नहीं किया है, लेकिन ऐसा निर्माण भाषा में आसानी से फिट होगा।
सुपरकैट

5

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

x = ObjectBuilder()
        .foo(5)
        .bar(6);

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


6
अंतर यह है कि, बिल्डर पैटर्न का उपयोग करते समय, आप आमतौर पर केवल लिखने योग्य ऑब्जेक्ट (बिल्डर) लिख रहे होते हैं जो अंततः एक रीड-ओनली (अपरिवर्तनीय) ऑब्जेक्ट (आप जिस भी क्लास में निर्माण कर रहे हैं) का निर्माण करते हैं। उस संबंध में, विधि कॉल की एक लंबी श्रृंखला होना वांछनीय है क्योंकि इसका उपयोग एकल अभिव्यक्ति के रूप में किया जा सकता है।
डार्कहॉग

"या यदि रिटर्न ऑब्जेक्ट वह मान है जिसे अभी सौंपा गया था" मुझे उससे नफरत है, अगर मैं उस मूल्य को रखना चाहता हूं जिसे मैंने अभी पारित किया है तो मैं इसे पहले एक चर में डाल दूंगा। यह उस मूल्य को प्राप्त करने के लिए उपयोगी हो सकता है जिसे पहले सौंपा गया था , हालांकि (कुछ कंटेनर इंटरफेस ऐसा करते हैं, मुझे विश्वास है)।
JAB

@ जेएबी मैं सहमत हूं, मैं उस संकेतन का ऐसा प्रशंसक नहीं हूं, लेकिन इसके स्थान हैं। जो मन में आता है, Obj* x = doSomethingToObjAndReturnIt(new Obj(1, 2, 3)); मुझे लगता है कि यह लोकप्रियता भी हासिल की क्योंकि यह दर्पण है a = b = c = d, हालांकि मुझे यकीन नहीं है कि लोकप्रियता अच्छी तरह से स्थापित थी। मैंने आपके द्वारा उल्लेख किए गए, पिछले मूल्य को वापस लौटते हुए देखा है, कुछ परमाणु ऑपरेशन पुस्तकालयों में। कहानी का नैतिक? यह और भी भ्रामक है जितना मैंने इसे साउंड किया =)
Cort Ammon

मेरा मानना ​​है कि शिक्षाविदों को थोड़ा पांडित्य मिलता है: मुहावरे के साथ कुछ भी गलत नहीं है। कुछ मामलों में स्पष्टता जोड़ने में यह काफी उपयोगी है। उदाहरण के लिए निम्न पाठ प्रारूपण वर्ग को लें जो एक स्ट्रिंग की प्रत्येक पंक्ति को इंगित करता है और इसके चारों ओर एक आस्की-आर्ट बॉक्स खींचता है new BetterText(string).indent(4).box().print();। उस स्थिति में, मैंने gobbledygook के एक समूह को बायपास किया है और एक स्ट्रिंग ली है, इसे इंडेंट किया है, इसे बॉक्स किया है, और इसे आउटपुट करता है। तुम भी कैस्केड (जैसे, कहते हैं, .copy()) के भीतर एक दोहराव विधि चाहते हो सकता है सभी निम्नलिखित क्रियाओं को मूल को संशोधित करने की अनुमति नहीं है।
tgm1024

2

यह एक उत्तर की तुलना में अधिक टिप्पणी है, लेकिन मैं टिप्पणी नहीं कर सकता, इसलिए ...

केवल यह उल्लेख करना चाहता था कि इस प्रश्न ने मुझे आश्चर्यचकित किया क्योंकि मैं इसे बिल्कुल भी असामान्य नहीं देखता । दरअसल, मेरे काम के माहौल में (वेब ​​डेवलपर) बहुत आम है।

उत्पन्न: उदाहरण के लिए, यह कैसे Symfony के सिद्धांत है संस्थाओं को आदेश स्वत: उत्पन्न सभी setters , डिफ़ॉल्ट रूप से

jQuery थोना अपने अधिकांश तरीकों को बहुत ही समान तरीके से श्रृंखलाबद्ध करता है।


Js एक अपमानजनक है
बेन

@Benedictus मैं कहूंगा कि PHP बड़ी घृणा है। जावास्क्रिप्ट एक पूरी तरह से ठीक भाषा है और ES6 सुविधाओं को शामिल करने के साथ काफी अच्छा हो गया है (हालांकि मुझे यकीन है कि कुछ लोग अभी भी कॉफी या वेरिएंट को पसंद करते हैं। व्यक्तिगत रूप से, मैं इस बात का प्रशंसक नहीं हूं कि कॉफ़ीस्क्रिप्ट चर स्कोपिंग को कैसे संभालती है क्योंकि यह बाहरी गुंजाइश की जांच करता है। जब तक स्थानीय रूप से स्थानीय दायरे में सौंपे गए चर का इलाज करने के बजाय, जब तक कि स्पष्ट रूप से गैर-वैश्विक / वैश्विक रूप से संकेत नहीं दिया जाता है, जिस तरह से पायथन करता है)।
JAB

@ बेंडिक्टस मैं साथ में JAB। अपने कॉलेज के वर्षों में मैं जेएस को एक घृणित काम की भाषा के रूप में देखना चाहता था, लेकिन इसके साथ कुछ साल काम करने के बाद, और इसका उपयोग करने के सही तरीके को सीखने के बाद , मैं इसे करने के लिए आया हूँ ... वास्तव में इसे प्यार करता हूँ । और मुझे लगता है कि ईएस 6 के साथ यह वास्तव में परिपक्व भाषा बन जाएगी । लेकिन, जो मुझे अपना सिर घुमाता है वह है ... मेरे जवाब का जेएस के साथ पहली बार क्या करना है? ^ ^ U
xDaizu

मैंने वास्तव में js के साथ कुछ साल काम किया है और कह सकता हूं कि मैंने सीखा है कि यह तरीके हैं। फिर भी मैं इस भाषा को एक गलती के अलावा और कुछ नहीं देखता। लेकिन मैं मानता हूं, Php बहुत बुरा है।
बेन

@ बेनेडिक्टस मैं आपकी स्थिति को समझता हूं और मैं इसका सम्मान करता हूं। हालांकि अभी भी मुझे यही पसंद है। निश्चित रूप से, इसके पास अपने quirks और perks (जो भाषा नहीं है?) लेकिन यह लगातार सही दिशा में आगे बढ़ रहा है। लेकिन ... मुझे वास्तव में यह इतना पसंद नहीं है कि मुझे इसका बचाव करने की आवश्यकता है। मैं प्यार करने वाले या उससे नफरत करने वाले लोगों से कुछ हासिल नहीं करता ... हाहाहा इसके अलावा, यह उसके लिए कोई जगह नहीं है, मेरा जवाब भी जेएस के बारे में बिल्कुल नहीं था।
xDaizu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.