c++ - Is there a concise opposite of "is empty"? -


स्ट्रिंग वर्गों के इंटरफेस को आमतौर पर IsEmpty () या empty () यह बिल्कुल उचित है क्योंकि यह एक विशेष मामला है, लेकिन जो कोड इन विधियों का इस्तेमाल करता है, उन्हें अक्सर इस विधेय को नकारना पड़ता है, जो "ऑप्टिकल (और भी मनोवैज्ञानिक) overhead" (विस्मयादिबोधक चिह्न बहुत स्पष्ट नहीं है, खासकर एक उद्घाटन कोष्ठक के बाद)। उदाहरण के लिए देखें (सरलीकृत) कोड: <पूर्व> /// आउटपुट के लिए एक वैकल्पिक समय विनिर्देशन प्रारूप std :: string fmtTime (const std :: string और start, const std :: string और end ) {Std :: स्ट्रिंग समय; अगर (! Start.empty () ||! End.empty ()) {if (! Start.empty () और amp; end! कमी ()) {समय = "" + + + "से" + अंत तक " ; } Else {if (end.empty ()) {time = "since" + start; } और {समय = "जब तक" + अंत; } } } लौटने का समय; }

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

हो सकता है कि मैं केवल अंधापन से ही प्रभावित हूं: आप ऊपर की समस्या को कैसे हल करेंगे?


संपादित करें: कुछ टिप्पणियों को पढ़ने के बाद, मुझे लगता है यह कहना है कि मूल कोड वीसीएल के वर्ग System :: AnsiString का उपयोग करता है यह वर्ग एक ISEmpty विधि प्रदान करता है, जो बहुत पठनीय है:

  यदि (text.IsEmpty ()) {/ * ... * /} // read: अगर पाठ खाली है ...  

अगर नकार नहीं किया गया है:

  यदि (! Text.IsEmpty ()) {/ * ... * /} // पढ़ें: यदि नहीं पाठ खाली है ...  

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

ज्यादातर मामलों में आप < कोड> अगर और else को कोड को साफ करने के लिए:

  const std :: string fmtTime (const std :: स्ट्रिंग और शुरू, const std :: स्ट्रिंग एंड एंड) {std :: स्ट्रिंग टाइम; यदि (start.empty () & amp; amp; end.empty ()) {वापसी समय; } अगर (start.empty ()) end.empty ()) {if (end.empty ()) {time = "since" + start; } और {समय = "जब तक" + अंत; }} और {समय = "" + प्रारंभ + "से" + अंत तक; }     लौटने का समय; }  

या कुछ और रिफैक्टरिंग के बाद भी क्लीनर:

  std :: string fmtTime (const std :: string & amp; start, const std :: string & amp;; अंत) {if (start.empty ()) और एंड। एंडमी ()) {return std :: string (); } अगर (start.empty ()) {वापसी "तक" + अंत; } If (end.empty ()) {वापसी "के बाद से" + शुरू; } "वापसी" से "+ प्रारंभ +" से "+ अंत तक"; }  

और अंतिम कॉम्पैक्चरि के लिए (हालांकि मैं पिछली संस्करण को इसकी पठनीयता के लिए पसंद करता हूं):

  std :: string fmtTime (const std :: स्ट्रिंग एंड amp; स्टार्ट, कॉन्स्ट स्ट्रोड :: स्ट्रिंग एंड एंड) {return start.empty () और amp; amp; End.empty ()? Std :: string (): start.empty ()? "जब तक" + अंत: end.empty ()? "चूंकि" + प्रारंभ: "" + प्रारंभ + "से" + अंत तक; }  

एक सहायक संभावना बनाने के लिए एक सहायक कार्य है:

  inline bool non_empty (const std :: string & str) {वापसी! str.empty (); } अगर (गैर-स्वीकार्य (प्रारंभ) || गैर-छूट (अंत)) {...}  

Comments