बाहरी कोड में मनमाने कार्यों / कक्षाओं के लिए मना किया जाता है


12

मैंने ऐसे मामलों का अनुभव किया है, जहां सिस्टम में नकारात्मक परिणामों को रोकने के लिए बाहरी पुस्तकालयों और रूपरेखाओं के एपीआई तक पहुंच को प्रतिबंधित करना मूल्यवान होगा।

उदाहरण के लिए, SharePoint एप्लिकेशन में spList.Items.GetItemByIdसूची आइटम प्राप्त करने के लिए कॉल करना स्वाभाविक हो सकता है , यहां तक ​​कि शायद एक लूप में, बिना यह महसूस किए कि इससे प्रदर्शन की बड़ी समस्याएं हो सकती हैं।

यह भी हो सकता है कि हमें ईमेल भेजने के लिए अपनी कक्षा का उपयोग करने के लिए सभी को बाध्य करने के लिए SmtpClient के उपयोग को रोकने की आवश्यकता है, यह सुनिश्चित करने के लिए कि हम परीक्षण के माहौल में सभी ईमेल को ठीक से प्रॉक्सी और मॉक कर सकते हैं।

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


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

3
क्या आप इन कॉल्स को रनटाइम या कंपाइल-टाइम को पकड़ने और ब्लॉक करने की उम्मीद कर रहे हैं ?
मेटाफ़ाइट

1
जब से आप C # का उपयोग कर रहे हैं, क्या आपने कभी StyleCop के बारे में सुना है ? आप जानते हैं कि आप कस्टम नियम बना सकते हैं जैसे आप कृपया, ठीक है?
मचाडो

10
" क्या हमारे अपने कोड में कुछ विशिष्ट स्थानों को छोड़कर, बाहरी कोड पर इन बाधाओं को प्राप्त करने के लिए कोई विश्वसनीय और उचित तरीके हैं? " हां: संकलन त्रुटि के रूप में कुछ एपीआई तक पहुंचने की रिपोर्ट करने के लिए अपना खुद का रोसलिन विश्लेषक लिखें ।
डेविड अरनो

3
@ मचाडो, स्टाइलकॉप प्रभावी रूप से एक मृत उत्पाद है। यह स्टाइलकॉपअनलीज़र्स के साथ प्रतिस्थापित किया जा रहा है, जो कि रोसलिन के शीर्ष पर बनाया गया है। निश्चित रूप से इन दिनों कस्टम स्टाइलकॉप नियमों को लिखने में समय का निवेश करना अच्छा नहीं होगा।
डेविड अर्नो

जवाबों:


8

क्या हमारे स्वयं के कोड में कुछ विशिष्ट स्थानों को छोड़कर बाहरी कोड पर इन बाधाओं को प्राप्त करने के लिए कोई विश्वसनीय और उचित तरीके हैं?

जैसा कि प्रश्न विशेष रूप से सी # के बारे में है, एक संकलक-आधारित समाधान है जो इस तरह के नियमों को लागू करने के लिए यहां इस्तेमाल किया जा सकता है: रोसलिन विश्लेषक । आप अपना खुद का विश्लेषक लिख सकते हैं जो कुछ एपीआई को संकलन त्रुटि या चेतावनी के रूप में एक्सेस करने की रिपोर्ट करता है।

एनालाइज़र का एक उदाहरण सेट, जो आपके स्वयं के लेखन पर बहुत सारे उदाहरण कोड प्रदान करता है, स्टाइलकॉप एनालाइज़र हैं , जो सी # के लिए पुराने स्टाइलकॉप सुविधा के लिए एक प्रतिस्थापन है।

यह कहते हुए कि, इस तरह के स्वचालित चेक हमेशा "नियमों को तोड़ने" के लिए निर्धारित लोक द्वारा काम किए जा सकते हैं। इसलिए यह दृष्टिकोण कोड समीक्षाओं के लिए एक विकल्प नहीं है जैसा कि कार्ल बेवफेल्ड के जवाब में चर्चा की गई थी। यह इस तरह की समीक्षाओं के साथ सहायता कर सकता है, लेकिन उन्हें प्रतिस्थापित नहीं करना चाहिए।


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

25

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

उदाहरण के लिए, हमारे पास स्काला में लिखी गई कई सेवाएं हैं, और कोड समीक्षा के समय हम जो कुछ भी पूछते हैं, वह अपरिवर्तनीयता के लिए है, लेकिन हम अक्सर संवाद करते हैं कि छुटकारा पा लिया जाए vars। दूसरे दिन किसी ने सूची में एकमात्र आइटम के रूप में एक एकल परिवर्तनशील चर धारण करने के लिए एक वैल x: ListBuffer [बूलियन] का उपयोग किया । आप दूसरे ListBufferको x नहीं दे सकते हैं, लेकिन आप सूची के आइटम को अपनी इच्छानुसार बदल सकते हैं। बस एक का उपयोग कर के रूप में बुरा है var, लेकिन स्नीकर।

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


लानत है कि डरपोक है!
व्हेन

@snb यह जावा के बराबर है जो एक हैक के रूप में करता है कि वह केवल एक वस्तु / मूल्य वापस करने में सक्षम हो और उचित संदर्भ तर्क न हो; इसके बजाय एक सरणी पास करना जिससे उसकी सामग्री अपडेट होगी। (कुछ उदाहरण: AtomicMarkableReference.getऔर AtomicStampedReference.get)।
JAB

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

1
@ सबसे सरल समाधान वहीं है: "कुछ भी नहीं प्रशिक्षण और कोड की समीक्षा धड़कता है"।
मि। मिंडोर

2
"कुछ भी नहीं करता है इसे मैन्युअल रूप से करना" सही है जब तक कि कोई इसे स्वचालित नहीं करता है।
इवान

0

कार्ल का जवाब 100% सही है। अनुरूपता की गारंटी देने का कोई तरीका नहीं है। हालांकि, प्रशिक्षण और कोड समीक्षाओं के अलावा, अनुपालन सुनिश्चित करने के लिए स्थैतिक विश्लेषण उपकरणों के उपयोग पर विचार करें। (नोट: मैंने कहा "के अलावा", जैसा कि उन लोगों को भी उसी तरह से बायपास कर सकता है जिस तरह कार्ल ने कहा था)।

स्थैतिक विश्लेषण उपकरण का उपयोग करने का लाभ थकाऊ मानव कोड विश्लेषण को हटाने में से एक है, जो "IEnumerable के कई उपयोग" के उदाहरणों की तलाश में है या आप जिस सप्ताह देख रहे हैं (या कम से कम, जो मुझे हमेशा लगता है कि मैं देख रहा हूं। देखना)। यह कोड की समीक्षाओं और प्रशिक्षण को अधिक "दिलचस्प" मुद्दों पर ध्यान केंद्रित करने की अनुमति देगा।

C # के लिए, विशेष रूप से, मैंने नीचे कुछ सुझाव शामिल किए हैं। अपने बिल्ड वातावरण में प्लग करें और आप जाने के लिए अच्छे हैं। लेकिन, आम तौर पर, कोई फर्क नहीं पड़ता कि आप किस भाषा का उपयोग कर रहे हैं, कहीं न कहीं एक स्थिर विश्लेषण उपकरण है।

विकिपीडिया पृष्ठ से सीधे कॉपी / पेस्ट करें, नवीनतम जानकारी और लिंक के लिए विकी पृष्ठ का उपयोग करें: https://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis#.NET

  • .NET कंपाइलर प्लेटफ़ॉर्म (कोडनेम रोसलिन) - Microsoft .NET द्वारा विकसित C # और विज़ुअल बेसिक .NET के लिए ओपन-सोर्स कंपाइलर फ्रेमवर्क। सिंटैक्स का विश्लेषण और हेरफेर करने के लिए एक एपीआई प्रदान करता है।
  • CodeIt.Right - सर्वोत्तम प्रथाओं के लिए स्थिर कोड विश्लेषण और स्वचालित रीफ़ैक्टरिंग को जोड़ती है जो कोड त्रुटियों और उल्लंघनों के स्वत: सुधार की अनुमति देता है; C # और VB.NET का समर्थन करता है।
  • CodeRush - विज़ुअल स्टूडियो के लिए एक प्लगइन जो उपयोगकर्ताओं को सर्वोत्तम प्रथाओं के उल्लंघन के लिए सचेत करता है।
  • FxCop - Microsoft .NET प्रोग्राम के लिए नि: शुल्क स्थैतिक विश्लेषण जो CIL के लिए संकलित है। स्टैंडअलोन और कुछ Microsoft Visual Studio संस्करणों में एकीकृत; Microsoft द्वारा।
  • ND निर्भर - डिजाइन नियमों को परिभाषित करके, प्रभाव विश्लेषण करके और कोड के विभिन्न संस्करणों की तुलना करके, कोड निर्भरता का विश्लेषण और कल्पना करके एक जटिल .NET कोड आधार का प्रबंधन सरल करता है। विजुअल स्टूडियो में एकीकृत करता है।
  • Parasoft dotTEST - विज़ुअल स्टूडियो के लिए एक स्थिर विश्लेषण, यूनिट परीक्षण और कोड समीक्षा प्लगइन; C #, VB.NET, ASP.NET और प्रबंधित C ++ सहित Microsoft .NET फ्रेमवर्क और .NET कॉम्पैक्ट फ्रेमवर्क के लिए भाषाओं के साथ काम करता है।
  • सोनग्राफ - सी #, जावा और सी / सी ++ का समर्थन निर्भरता विश्लेषण, स्वचालित वास्तुकला जांच, मैट्रिक्स और कस्टम मैट्रिक्स और कोड-चेकर्स को जोड़ने की क्षमता पर ध्यान देने के साथ करता है।
  • स्टाइलकॉप - शैली और स्थिरता नियमों के एक सेट को लागू करने के लिए सी # स्रोत कोड का विश्लेषण करता है। इसे Microsoft Visual Studio के अंदर से चलाया जा सकता है या MSBuild प्रोजेक्ट में एकीकृत किया जा सकता है।

-1

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

यह (और चाहिए) दोनों मैनुअल और स्वचालित समीक्षा चरणों में शामिल हैं:

  • ज्ञात मुद्दों की एक चेकलिस्ट तैयार करें और एक-एक करके अपने मैनुअल कोड समीक्षाओं में उन पर जाएं। चेकलिस्ट की समीक्षा और अद्यतन के लिए एक आवर्ती बैठक करें। जब भी एक बुरा बग पकड़ा और विश्लेषण किया जाता है, तो इसे चेकलिस्ट में जोड़ें।

  • ज्ञात पैटर्न देखने के लिए नियमों में जाँच जोड़ें। यह लिखने के लिए जटिल हो सकता है, लेकिन समय के साथ एक बड़ी परियोजना के लिए उपयोगी हो सकता है। टीएफएस आपको सी # में नियम लिखने की अनुमति देता है, और अन्य बिल्ड सिस्टम के अपने हुक हैं। पैटर्न से मेल खाने वाले चेक-इन को अस्वीकार करने के लिए gated बिल्ड का उपयोग करने पर विचार करें। हां, यह विकास को धीमा करता है, लेकिन एक निश्चित परियोजना के आकार और जटिलता के बाद, देवों को धीमा करना एक अच्छी बात हो सकती है।


-1

हो सकता है कि अनचाहे कॉल्स को पकड़ने में कंपाइलर आपकी मदद कर सकता है।

अपने स्वयं के लीब में वर्गों / कोड के तरीकों का नाम बदलें जिनका उपयोग बाहरी परिवादियों द्वारा नहीं किया जाना चाहिए। वैकल्पिक रूप से कक्षाओं / विधियों को आंतरिक बनाते हैं और उन कक्षाओं में दिखाई देने वाले इंटर्नल्स को जोड़ते हैं जो उन्हें उपयोग करने की अनुमति देते हैं।

बाहरी कामचलाऊ उपयोगकर्ताओं को एक कंपाइल एरर मेथड मिलेगा / क्लास नहीं मिलेगा।

सार्वजनिक पुस्तकालयों से निषिद्ध वर्ग / विधियाँ: अपने दायित्व में समान नामस्थान / वर्ग / विधि बनाएँ

डुप्लीकेट क्लास पाए जाने के कारण बाहरी कामगार उपयोगकर्ताओं को एक कंपाइल एरर मिलेगा

[अपडेट करें]

यह बिल्कुल जरूरी नहीं है कि हर परिस्थिति में इन तरीकों / कक्षाओं तक पहुंच को रोका जा सके, उदाहरण के लिए प्रतिबिंब या किसी प्रकार की अक्षमता, ...।

प्रोग्रामर (... लिबर का क्लाइंट ...) को मजबूर करने के लिए सक्रिय रूप से यदि संभव हो तो इन बाधाओं को पार करने के लिए उपाय करना चाहिए।


इसे डाउनवोट करते हुए, न केवल इसलिए कि यह एक बुरा हैक है, लेकिन यह आसानी से सी # के साथ काम किया जाता है (जिसे ओपी ने बाहरी एलियास का उपयोग करके प्रश्न के साथ टैग किया है) ।
डेविड अर्नो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.