मेरे पास हमारी लाइब्रेरी में बिल्कुल मामला था। हमारे पास एक सामान्य स्ट्रिंग मैपिंग मॉड्यूल था जो इंडेक्स, 8, 16 या 32 बिट (ऐतिहासिक कारणों से) के लिए विभिन्न आकारों का उपयोग कर सकता था। तो कोड ऐसे ही कोड से भरा था:
if(map->idxSiz == 1)
return ((BYTE *)map->idx)[Pos] = ...whatever
else
if(map->idxSiz == 2)
return ((WORD *)map->idx)[Pos] = ...whatever
else
return ((LONG *)map->idx)[Pos] = ...whatever
वहाँ इस तरह लाइनों के 100 थे। पहले चरण में मैंने इसे एक संघ बदल दिया और मैंने पाया कि यह अधिक पठनीय था।
switch(map->idxSiz) {
case 1: return map->idx.u8[Pos] = ...whatever
case 2: return map->idx.u16[Pos] = ...whatever
case 3: return map->idx.u32[Pos] = ...whatever
}
यह मैं का विज्ञापन बेहतर क्या हो रहा था देखने के लिए और मैं तो दूर करने के लिए पूरी तरह से idxSiz केवल 32 बिट का उपयोग कर अनुक्रमित वेरिएंट तय कर सकता है। लेकिन कोड को और अधिक पठनीय होने के बाद ही यह संभव था। पीएस: यह हमारी परियोजना का केवल एक मामूली हिस्सा था जो कि अब मौजूद नहीं होने वाले लोगों द्वारा लिखे गए कोड की लगभग 100 हजार लाइन कोड है। इसलिए कोड में परिवर्तन धीरे-धीरे होते हैं ताकि अनुप्रयोगों को तोड़ न सके।
निष्कर्ष: यहां तक कि यदि लोगों को यूनियन संस्करण में कम उपयोग किया जाता है, तो भी मैं इसे पसंद करता हूं क्योंकि यह कोड को पढ़ने के लिए बहुत हल्का कर सकता है। बड़ी परियोजनाओं पर, कोड को और अधिक पठनीय बनाना बेहद जरूरी है, भले ही यह स्वयं है जो इसे बाद में पढ़ेगा।
संपादित: टिप्पणियाँ कोड फ़ॉर्मेट नहीं करते के रूप में, टिप्पणी की:
स्विच करने के लिए बदलने से पहले आया
switch(this->IdxSiz) {
case 2: ((uint16_t*)this->iSort)[Pos-1] = (uint16_t)this->header.nUz; break;
case 4: ((uint32_t*)this->iSort)[Pos-1] = this->header.nUz; break;
}
में बदल गया था (यह अब असली कोड के रूप में यह किया गया है)
switch(this->IdxSiz) {
case 2: this->iSort.u16[Pos-1] = this->header.nUz; break;
case 4: this->iSort.u32[Pos-1] = this->header.nUz; break;
}
मुझे कोड में किए गए सभी सौंदर्यीकरण को जोड़ना नहीं चाहिए था और केवल उस चरण को दिखाया जाना चाहिए था।लेकिन मैंने अपना उत्तर घर से पोस्ट किया जहां मुझे कोड
स्रोत
2009-11-30 20:10:27
क्लिच क्षमा करें, लेकिन आकार मायने रखता है :) –
@ टिंकर्टिम और बाधाएं हैं कि वे एक ही आकार के होंगे। 32 बिट इंटेल सिस्टम पर, दोनों 4 बाइट लेंगे। तकनीकी रूप से, शून्य * बड़ा हो सकता है, लेकिन यह लगभग कभी नहीं होगा (जब तक कि डबल * बड़ा न हो ...) – Mikeage
क्या सभी पॉइंटर्स समान आकार के डेटा के प्रकार के बावजूद समान आकार नहीं हैं? –