'Var ’और null coalescing operator को कितनी दूर होना चाहिए ??’ ’ पठनीयता में बाधा डाले बिना मनोरंजन किया जा सकता है?


23

मुझे पता है कि प्रश्न का शीर्षक बहुत व्यक्तिपरक है, लेकिन मुझे ??अपने साथियों द्वारा ऑपरेटर के उपयोग के साथ सामना किया गया था , जहां एक ही समय में मैं varनए अप-कमिंग कोड में आवेदन करने के साथ बहुत खुश / आरामदायक नहीं था ।

??ऑपरेटर का उपयोग करने के लिए दिया गया तर्क कोड में पठनीयता को दूर करता है।

मेरा सवाल यह है कि जब आप उपयोग करना शुरू करते हैं तो वही बात नहीं होती है var?


49
यदि "डेवलपर" को ??समझाए जाने के बाद अशक्त मोटे ऑपरेटर को समझा नहीं जा सकता है, तो उन्हें उत्पादन कोड के पास अनुमति नहीं दी जानी चाहिए।
कैफ़ीक्यू

12
मेरा सुझाव है कि हम ऑपरेटर को बदल देंगे ?? इफुल्ल्टेन को। ? IfSoChoose, हो सकता है: ElseChoose है। + जोड़ है। - घटाना है, जब तक कि यह एकात्मक नहीं है, तब तक यह नकारात्मक है। - DecrementBeforeUsing और DecrementAfterUsing के बीच विभाजित है। C ++ में आप मैक्रोज़ के साथ ऐसा कर सकते हैं।
ली लोविरे

7
@Xaade: यह विडंबना है कि नहीं है? ... सही? ... भगवान इसे विडंबना होने दें (और मैं नास्तिक हूँ)।
स्टीवन ज्यूरिस

10
@StevenJeuris यह व्यंग्य हो सकता है , लेकिन यह विडंबना नहीं है
कर्क ब्रॉडहर्स्ट

1
@KirkBroadhurst: मैं सही खड़ा हूं , हमेशा उन दोनों को भ्रमित करता रहा हूं ।
स्टीवन ज्यूरिस

जवाबों:


53

अशक्त सहवर्ती ऑपरेटर (??)

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

जादू के बिना:

bool isNameSet = false;
string name;
if ( isNameSet )
{
    Console.WriteLine( name );
}
else
{
    Console.WriteLine( "No name set." );
}

टर्नरी ऑपरेटर:

bool isNameSet = false;
string name;
Console.WriteLine( isNameSet ? name : "No name set." );

अशक्त सहवास:

string name = null;
Console.WriteLine( name ?? "No name set." );

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

var कीवर्ड

मेरे पास var keyword के बारे में कुछ अलग राय है। एक चर का प्रकार अक्सर आपके कोड के बारे में अतिरिक्त जानकारी देता है। मुझे लगता है कि कभी-कभी var कीवर्ड का उपयोग करके टाइप को छिपा दिया जाता है, जिससे कोड कम पठनीय हो जाता है। आप कम जानते हैं कि ऑटो पूरा करने का उपयोग किए बिना क्या उम्मीद है, या पहचानकर्ताओं को देखने के लिए कि वे वास्तव में क्या हैं। मेरी राय में, यह कोड में परिणाम है जो पढ़ने / लिखने के लिए धीमा है।

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

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

अंतिम कथन के लिए एक उदाहरण के रूप में:

ThisIsSomeSpecializedTypeRightHere duplication =
    new ThisIsSomeSpecializedTypeRightHere();
var justAsReadable =
    new ThisIsSomeSpecializedTypeRightHere();  // Less duplication.

// But I still prefer the following ...
int number = 9;
SomeCreatedType foo = Factory.CreateSomeType();

24
यह अंतिम उदाहरण बिल्कुल वैसा ही है जब var कीवर्ड एक्सेल हो सकता है। कल्पना कीजिए कि आपके पूरे कोड में कोड है। Factory.CreateSomeTypeलौटता है IEnumerable<SomeType>। एक दिन, जो भी कारण से, यह लौटने के लिए बदल जाता है SomeType[]। यदि आपने var का उपयोग किया है, तो यह सिर्फ एक recompile है।
पीडीआर

1
समझ गया कि उदाहरण गलत तरीके से आया और फिर भोजन खोजने चला गया। Numpty! एक बेहतर उदाहरण आपका उपयोग करना होगा। क्या होगा यदि Factory.CreateSomeType()परिवर्तन एक वापसी के लिए ISomeType?
pdr

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

2
मुझे लगता है कि यह बहुत अधिक संभावना है कि यदि कोई ठोस प्रकार वापस लौटता है, तो वह एक इंटरफेस को वापस कर देता है, जो कि एक ही इंटरफेस (फैक्ट्री पैटर्न के अनुरूप) के साथ अन्य ठोस प्रकारों के लिए अनुमति देता है। लेकिन अगर अनुबंध बदल जाता है तो आपका कोड टूट जाएगा - हालांकि आप पा सकते हैं कि यह केवल कुछ ही मामलों में टूटता है जहां यह हर जगह के बजाय मायने रखता है।
pdr

1
@ हॉमिन, हम सभी जानते हैं कि यह nullपूरी तरह से बचने के लिए अपरिहार्य है । इसके अलावा, जितना अधिक मैं इसके लिए विकल्प तलाशता nullहूं, उतना ही मुझे लगता है nullकि कभी-कभी सबसे साफ समाधान होता है। मेरा दिया गया उदाहरण IMHO है कि सभी बुरा नहीं है, और मुझे यह अशक्त प्रकारों का एक उपयुक्त उपयोग लगता है।
स्टीवन ज्यूरिस

16

var कम वर्बोज़ कोड की अनुमति देता है, जो पठनीयता को बढ़ाता है। मेरी राय में, पठनीयता को आपके द्वारा देखे गए कितने विवरणों से नहीं मापा जाना चाहिए, लेकिन पहली नज़र में कितने विवरण छिपे हुए हैं। Linq उदाहरणों के अलावा, var स्रोत कोड स्तर पर बतख टाइपिंग की अनुमति देता है, जो निम्न उदाहरण दिया गया है:

...
foreach (var message in messages) {
  var label = Factory.CreateLabel();
  label.Text = message;
  Controls.Add(label);
}
...

जब तक यह पाठ संपत्ति प्रदान करता है, तब तक किस प्रकार का लेबल होता है?


कोई यह समझने की कोशिश कर रहा है कि क्या यह वाइनफॉर्म लेबल या WPF लेबल है।
स्टीवन ज्यूरिस

14
@ सीनियर ज्यूरिस: यह आमतौर पर एक ज्ञात संदर्भ जानकारी है। यदि नहीं, तो आप कोड गलत तरीके से ले रहे हैं।
कोडिज्म

कोई है जो यह जानना चाहता है कि क्या यह एक डिफ़ॉल्ट WPF लेबल या कुछ कस्टम लेबल है? :)
स्टीवन ज्यूरिस

14
1. क्या उस व्यक्ति को वास्तव में परवाह करनी चाहिए, जब तक कि यह एक पाठ संपत्ति के साथ एक लेबल है? 2. अगर यह उन दुर्लभ मामलों में से एक है, जो वास्तव में उनके पास देखभाल करने का एक अच्छा कारण है, तो Intellisense से पूछें। 3. यदि वे Intellisense के बिना एक IDE में कोड का संपादन कर रहे हैं, तो उनके पास 'var' :) की तुलना में संभवतः बड़ी असुविधाएँ हैं :)
KutuluMike

4
अमूर्त की एक गरीब भावना के साथ किसी को।
जिम Balter

16

मेरे पास ??ऑपरेटर पर कोई गंभीर टिप्पणी नहीं है , क्योंकि मैंने कभी भी ऐसे ऑपरेटर के साथ भाषा का उपयोग नहीं किया है। के बारे में var, लोग रूबी, पायथन, पर्ल और पीएचपी जैसी भाषाओं में प्रोग्राम करते हैं जिनका हर समय पूरी तरह से टाइप करना होता है। इन भाषाओं के मूल निवासी महसूस करते हैं कि एक प्रकार का चर आमतौर पर अप्रासंगिक शोर है। आप अधिक रुचि रखते हैं कि चर क्या कर सकता है , अर्थात इसका संरचनात्मक / बतख इंटरफ़ेस।

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

इसके अलावा, varहर जगह संभव का उपयोग करते हुए IMHO DRY का एक अच्छा उदाहरण है। किसी चीज़ के प्रकार को एक और केवल एक ही स्थान पर निर्दिष्ट किया जाना चाहिए, और जब भी इसे प्रचारित करने की आवश्यकता होती है , तब स्वचालित रूप से प्रचारित किया जाना चाहिए। यदि आप उपयोग करते हैं varऔर औपचारिक प्रकार के चर को किसी बिंदु पर बदलने की आवश्यकता होती है, तो आवश्यक परिवर्तन स्वचालित रूप से संकलक द्वारा आवश्यक हर जगह प्रचारित किया जाएगा जब तक कि प्रोग्रामर अभी भी सही है, बजाय प्रोग्रामर मैन्युअल रूप से हर आवृत्ति को बदलने के लिए। । यह एक गुड थिंग (टीएम) है।


13

मुझे लगता है कि यह अंत में टीम के लिए एक सवाल है। यदि यह मेरी टीम पर किसी और के लिए पठनीय नहीं है, तो मैं इसका उपयोग नहीं करूंगा, हालांकि मैं उन्हें उदाहरण के साथ समझाने के लिए, या गुदा संक्षिप्त (जैसे + =) इंगित करके कई बार कोशिश कर सकता हूं, जो उन्हें अधिक पठनीय लगता है।

हालाँकि, अगर अकेले काम करते हैं तो मुझे लगता है ?? और var कोई सीमा नहीं के साथ पढ़ने योग्य है। यहाँ तक की

var a = b ?? c ?? d ?? e ?? "";

मेरे लिए बहुत असंदिग्ध है।

टर्नरी ऑपरेटर और dynamicनिश्चित रूप से एक अलग मामला है।


4
मैं यहाँ `String.Empty 'का उपयोग करूँगा।
जॉब

1
@Job, ईमानदारी से, तो क्या मैं उस तार में कुछ डालने जा रहा था, फिर कुछ भी नहीं सोच पाया :)
pdr

4
var a = b ?? c ?? d ?? e ?? String.Empty ?? "";
ली लौविएरे

2
@Xaade आप निश्चित रूप से पर्याप्त नहीं हो सकते। लेकिन वास्तव में, String.Empty या "" का उपयोग करना एक व्यक्तिगत प्राथमिकता है। मैं "" का उपयोग करता हूं क्योंकि यह छोटा है ...
Carra

12
@Xaade - अगर String.Emptyकभी लौटता है null, तो हम बहुत सारे टूटे हुए कोडों में से एक नरक में हैं।
जेसी सी। स्लाइसर

10

उपयोग करने के लिए दिया गया तर्क ?? ऑपरेटर था, यह कोड में पठनीयता को दूर ले जाता है।

इसके बारे में संक्षेप में सोचने पर, यह टिप्पणी मुझे टिप्पणी करने वाले व्यक्ति के बारे में बताती है, वह उसे / उसके साथ भी ऐसा नहीं समझता। यह कुछ स्थितियों में सबसे अधिक सच है, लेकिन कुल मिलाकर, मुझे कुछ छूट नहीं है कि सी # टीम ने स्पष्ट रूप से सोचा था कि "पठनीयता" के कारण इसे जोड़ना पर्याप्त है। मैंने इसे if(boolean_object)बनाम की एक ही श्रेणी में रखा if(boolean_object == true)। कुछ लोग तर्क देते हैं कि दूसरा अधिक पठनीय है, लेकिन वास्तव में यह किसी को पढ़ने / टाइप करने के लिए अतिरिक्त कोड जोड़ रहा है, और कुछ स्थितियों में अधिक भ्रमित हो सकता है (विचार करें if(boolean_object != false))

मेरा सवाल यह है कि जब आप var का उपयोग करना शुरू करते हैं तो क्या वही नहीं होता है?

C # टीम ने आपको किसी ऐसी चीज़ को परिभाषित नहीं करने की अनुमति दी है जिसे आप जानते हैं कि यह क्या होने जा रहा है। जब तक मुझे पूरी तरह से परिभाषित करने की आवश्यकता नहीं है कि एक चर क्या होने वाला है (या तो यह बिल्कुल महत्वपूर्ण है कि एक लौटने वाली वस्तु प्रकार x की है, या यह वास्तव में पठनीय नहीं है), मैं उपयोग करता हूं varvar x = "MY_STRING";मुझे पता है कि यह इसे देखने से एक स्ट्रिंग है। सच में, मुझे वास्तव में परवाह नहीं है कि यह एक स्ट्रिंग है जब तक यह करता है कि मुझे इसे करने की आवश्यकता है। परिवर्तनशील प्रकार को परिभाषित करना मेरे लाभ के लिए है, संकलक के लिए नहीं। यदि कुछ गलत है, तो संकलक मुझे बताएगा कि यह गलत चर प्रकार के होने पर चलता है।


0

varLINQ प्रश्नों - कीवर्ड, मेरी राय में, जिसके लिए वह मूल पेश किया गया था स्थितियों में इस्तेमाल किया पिछड़ने है। इन प्रश्नों में, लौटे हुए परिणाम के प्रकार में अक्सर कुछ बड़े जटिल नाम होते हैं जो समय से पहले निर्धारित करना मुश्किल होता है और पाठक की समझ को आपके कोड का क्या करता है, इसकी सहायता नहीं करता है।

हालाँकि, करना var text = "Some text " + variableName + "some more text."सिर्फ आलसी है।

संपादित करें: @Jorg आप एक उद्देश्यपूर्ण सरलीकृत उत्तर पर कूद गए लेकिन चर्चा में कुछ भी नहीं जोड़ा। ठीक है, एक बेहतर उदाहरण के लिए इसके बारे में कैसे: var items = doc.DocumentElement.FirstChild.ChildNodes;यदि आप उस प्रकार का पता लगा सकते हैं तो मैं आपको एक कुकी दूंगा।


18
यदि आप यह पता नहीं लगा सकते हैं कि "Some text "यह एक है string, तो आपको varअपने कोड में s की संख्या के बारे में चिंता करने के लिए बहुत बड़ी समस्याएं हैं ।
जोर्ज डब्ल्यू मित्तग

3
समस्या यह नहीं है var; समस्या भयावह चर नाम "आइटम" है। यदि आप एक अच्छा चर नाम का उपयोग करते हैं, तो इसमें कुछ भी गलत नहीं है var
क्युरेलसा

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

यदि आपको यह जानने की जरूरत है कि किस प्रकार के लिए var खड़ा है और तुरंत देखकर नहीं बता सकता है, तो बस उस पर माउस को घुमाएं। यह करने के लिए बहुत कुछ समझ में नहीं आता है।
स्क्रव टीपी

1
"बस आलसी है" - यह इसके खिलाफ एक तर्क नहीं है। वास्तव में, यह बिल्कुल भी बुद्धिमान नहीं है।
जिम बाल्टर

0

मेरे पास var का उपयोग करने के साथ एक मूलभूत मुद्दा है।

इस उदाहरण में सब कुछ अगल-बगल है, लेकिन मुद्दा वास्तव में साझा पुस्तकालयों या परियोजनाओं के साथ बड़े समाधानों का है।

इस पर विचार करो:

public MyFirstObject GetMeAnObject() {
    return new MyFirstObject();
}

public void MainProgram() {
    var theObject = GetMeAnObject();
    theObject.PerformOperation();
}

अगर GetMeAnObject को किसी और द्वारा, उनकी आवश्यकताओं के अनुरूप बदला जाए, तो क्या होगा?

public MySecondObject GetMeAnObject() {
    return new MySecondObject();
}

मेनप्रोग्राम विधि में .PerformOperation () पर एक बड़ी लाल त्रुटि होगी। क्या हुआ? PerformOperation पहले पूरी तरह से अच्छी तरह से काम किया। हम TheObject पर विधियों को देखते हैं और यह केवल एक ट्रेस के बिना गायब हो गया है। यह पिछली बार था, और हमें उस पद्धति की आवश्यकता थी। आप अपनी पूंछ का पीछा करते हुए लंबे समय तक खर्च कर सकते हैं और यह पता लगाने की कोशिश कर सकते हैं कि, अगर MyFirstObject के पास PerformOperation नामक एक विधि है, तो इसे अब नहीं देखा जा सकता है। हर कोई "जानता है" कि GetMeAnObject एक MyFirstObject लौटाता है, इसलिए कोई बिंदु जाँच नहीं है।

यदि आपने स्पष्ट रूप से TheObject टाइप किया है, तो आपके पास GetMeAnObject को कॉल करने वाली लाइन पर एक अमान्य कास्ट त्रुटि होगी, और यह स्पष्ट रूप से स्पष्ट होगा कि GetMeAnObject एक ऐसा प्रकार लौटा रहा है, जो आपसे अपेक्षा नहीं करता है।

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


10
एक सहकर्मी ने परीक्षणों द्वारा कवर नहीं किए गए कोड में एक ब्रेकिंग परिवर्तन किया, और आपको लगता है कि समस्या है var? भाषा से उस तरह के व्यवहार से बचाव की उम्मीद नहीं की जा सकती है - अगर वे सीधे MyFirstObject को संशोधित करते हैं तो क्या होगा? यह अभी भी टूट गया होगा, लेकिन कोई भी वाक्यविन्यास आपको इससे नहीं बचा सकता है। मैं इस की एक ताकत पर varभी विचार करूंगा : क्या होगा अगर MySecondObject को वापस करने के बजाय आप अब IMyFirstObject को वापस कर रहे थे?
फ़ॉसी

2
"हर कोई" जानता है "कि GetMeAnObject एक MyFirstObject लौटाता है, इसलिए कोई बिंदु जाँच नहीं है।" मैं वास्तव में प्रोग्रामिंग में एक परिदृश्य के बारे में नहीं सोच सकता हूं जहां मैं वास्तव में अपनी मेमोरी पर निर्भर करता हूं कि अगर मैं डीबगिंग कर रहा हूं तो GetMeAnObject क्या है। अगर मैंने जाँच लिया कि PerformOperation नहीं है, तो मुझे कोड दिखाई देगा और यह किसी अन्य वर्ग के लिए नहीं है। यदि एक आईडीई में कक्षा वस्तु के प्रकार को देखने वाले उदाहरण को पॉप अप करेगी। दरअसल, जब कंपाइलर मुझे त्रुटि बताता है, तो वह कहता है कि 'क्लास MySecondObject का कोई ऑपरेशन नहीं है।' सबको कैसे पता है?
मुहम्मद अल्करौरी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.