जावा में विकास के तहत एक वर्ग को कैसे ध्वजांकित किया जाए


12

मैं एक इंटर्नशिप परियोजना पर काम कर रहा हूं, लेकिन मुझे सब कुछ खत्म करने से पहले छोड़ना होगा।

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

कोड इस तरह आयोजित किया जाता है:

[Package] | company.foo.bar.myproject
          |-- Class1.java
          |-- Class2.java
          |-- Class3.java <--(not stable)

अगर वहाँ एक भी कारखाना वर्ग कि सार्वजनिक तरीकों में उन वर्गों कॉल था, मैं करने के लिए विधि सेट किया जा सकता था class3के रूप में private। हालाँकि API उस तरह से उजागर नहीं होता है। उपयोगकर्ता सीधे उन वर्ग का उपयोग करेंगे, उदाहरण के लिए new Class1();, लेकिन मैं एक शीर्ष-स्तरीय कक्षा को निजी नहीं बना सकता। इस स्थिति से निपटने के लिए सबसे अच्छा अभ्यास क्या है?


1
आपका क्या मतलब है "एपीआई तरीकों के माध्यम से उजागर नहीं है?" क्या इस वर्ग का उपयोग प्रतिबिंब एपीआई के माध्यम से किया जाना है?
टॉम जी

5
एक संकलक त्रुटि? सिर्फ कंस्ट्रक्टर में अपवाद क्यों नहीं?
Mchl

गलतफहमी के लिए खेद है। मैंने अपनी पोस्ट संपादित की है।
वीआई शी


1
आप कक्षा को निजी नहीं बना सकते, लेकिन आप इसके निर्माता को निजी बना सकते हैं।
पीटर टेलर

जवाबों:


15

सिर्फ अपने संस्करण नियंत्रण प्रणाली पर एक अलग शाखा में सभी अस्थिर वर्गों की जांच क्यों न करें?


2
मुझे लगता है कि यह कोड को 'छिपाएगा'। क्या होगा यदि कोड लगभग वही करता है जो दूसरों को कुछ मामूली चोटियों के साथ करने की आवश्यकता होती है। यदि आप इसे एक शाखा में रखते हैं तो वे इसे कभी नहीं देख सकते हैं और पूरी बात को फिर से लागू करेंगे।
c_maker

3
@c_maker: दूसरों को यह बताने दें कि शाखा मौजूद है और जब वह निकल जाता है तो उसे क्या होना चाहिए, इसका एक हिस्सा होना चाहिए।
ब्लरफ्ल

2
@ बिरल्फ यदि वह दूसरों के बारे में चिंतित है जो कोड के JavaDoc में स्पष्टीकरण को नहीं देख रहा है जो वे उपयोग कर रहे हैं, मुझे संदेह है कि वे दूसरे दस्तावेज की तलाश में जाएंगे जो वह पैदा करता है।
कीथबी

मेरी चिंता यह है कि यह सुविधा अभी भी विकसित हो रही है, लेकिन स्क्रैम मास्टर ने इसे किसी भी कारण से अलग करने के लिए चुना (स्थगन जो हमारे मामले में ई 2 ई परीक्षण को अवरुद्ध करता है)। यदि हम इसे मास्टर में शामिल नहीं करते हैं, तो सड़क के नीचे बहुत सारे मर्ज का काम हो सकता है। हमने अभी c`tor को निजी बनाया है, और वर्ग की व्याख्या की है @Experimental, जैसे स्पार्क में
जॉय बरूच

11

यदि आपने ठीक से टिप्पणी की है, तो आप अपूर्ण कार्यक्षमता के बिट्स को "पदावनत" के रूप में चिह्नित कर सकते हैं, या विधि की हिम्मत की टिप्पणी कर सकते हैं और एक डाल सकते हैं throw new UnsupportedOperationException();

देखें कि क्या जावा में .NET के NotImplementedException जैसी कोई चीज़ है? ब्योरा हेतु।



4

मैं इस तरह के संकलक चेतावनी नहीं जानता।

आपकी स्थिति में मैं शायद @Deprecatedएनोटेशन का उपयोग करूंगा । यह विधि कॉल को पार कर लेगा, इसलिए यह दूसरों के लिए स्पष्ट हो जाएगा कि कुछ ऊपर है। जब वे व्हाट्स अप को देखते हैं, तो वे 'प्रोडक्शन रेडी नहीं' के बारे में आपकी टिप्पणी देखेंगे और एएचए जाएंगे।


2
यदि IDE इसका समर्थन करता है तो विधि कॉल केवल पार हो जाती हैं।
FrustratedWithFormsDesigner

5
सच है, लेकिन ज्यादातर लोग शायद उन आईडीई में से एक का उपयोग करेंगे जो इसका समर्थन करते हैं।
c_maker

3

मुझे नहीं लगता कि वहाँ के रूप में कोड अंकन की एक मानक तरीका है WIP, Incomplete, या ऐसा ही कुछ।

आप नाम का एक नया अपवाद बना सकते हैं ClassUnstableExceptionऔर फिर इसे Class3एक संदेश के साथ निर्माता में बढ़ा सकते हैं जो बताता है कि वे इसका उपयोग कैसे नहीं करें। यह हालांकि बुरा है, क्योंकि यह केवल उन्हें रन टाइम पर चेतावनी देता है।

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

आप नाम का एक एनोटेशन बना सकते हैं WIP(निकटतम मैं जो सोच सकता हूं, Deprecatedलेकिन यह वास्तव में एक ही बात का मतलब नहीं है) और इसका उपयोग वर्ग को एनोटेट करने के लिए करता है। यह शायद थोड़ा और काम होगा, और एनोटेशन का क्या समर्थन करेगा?

अंत में, आप इसे केवल टिप्पणियों में डाल सकते हैं, लेकिन यह केवल तभी काम करेगा जब लोग वास्तव में उन्हें पढ़ेंगे

संपादित करें:

यह प्रासंगिक हो सकता है: जानबूझकर एक कस्टम जावा कंपाइलर चेतावनी संदेश कैसे हो सकता है ?


फेंक अपवाद ग्रहण करने योग्य कोड के बारे में शिकायत करता है। कोई वर्कअराउंड?
वी शी

@Usavich: सुनिश्चित नहीं है कि मैंने कोड नहीं देखा है, लेकिन शायद यह भी भविष्य के डेवलपर्स को कोड का उपयोग करने से रोकने में मदद कर सकता है ?
FrustratedWithFormsDesigner

@Usavich: मैंने अपनी पोस्ट में EDIT में जो लिंक जोड़ा है, उस पर एक नज़र है, यह एक ऐसा ही सवाल है जहाँ ओपी एक कस्टम कंपाइलर चेतावनी जोड़ना चाहता था। आपको एक कस्टम "अनस्टेबलकोड" एनोटेशन जोड़ने में मदद मिल सकती है।
FrustratedWithFormsDesigner 20

3

यह पहले स्थान पर क्यों है?

आपने मुख्य कोड में अस्थिर कोड की जाँच की है? क्यों?

अस्थिर कोड को ट्रंक / मुख्य / मास्टर या जो भी मुख्य ट्रंक नाम है, में नहीं जांचा जाना चाहिए। इसे उच्च जोखिम विकास माना जाता है और इसके बजाय अपनी शाखा में अनुक्रमित किया जाना चाहिए जिसे आपने मुख्य रूप से जांचने के बजाय काम किया है।

मैं उन्नत SCM शाखा रणनीतियों को पढ़ने के लिए आपको (और आपकी टीम लीड) को दृढ़ता से प्रोत्साहित करूंगा । विशेष रूप से, विकास भूमिका पर ध्यान दें और उच्च जोखिम वाले विकास को क्या माना जाता है, इसके बारे में क्या कहते हैं:

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

लोगों को अस्थिर (या अप्रयुक्त) कोड को मेनलाइन में जाँचने देने का अर्थ है कि आप इस कोड को बनाए रखने के प्रयास के बारे में भविष्य के विकास के प्रयासों को भ्रमित करेंगे। रेप की हर शाखा और क्लोन अब से लेकर अंत तक इसमें समाहित रहेगा जब तक कि कोई "इसका डेड कोड" नहीं कहता और इसे हटा नहीं देता।

कुछ ऐसे हैं जो कहते हैं "ठीक है, अगर इसकी शाखा में यह भूल जाता है" और जबकि यह सच हो सकता है, मेनलाइन में मृत (और अस्थिर) कोड को भूल जाना कई बार बदतर होता है क्योंकि यह भविष्य के सभी विकास को हटाए जाने तक भ्रमित करता है - और तो यह और भी अधिक भूल है। "/ FooProject / शाखाओं / WeisBigIdea" (या समतुल्य) की एक अच्छी तरह से नामित शाखा भविष्य में काम करने के लिए दृश्यमान और आसान है - खासकर अगर यह काम करता है।

@Deprecated

पहली बात @Deprecatedएनोटेशन है। यह जावदॉक से आगे निकल जाता है और संकलक की चेतावनियों से बाहर निकलता है। javacएक -deprecationध्वज प्रदान करता है जिसे निम्न रूप में वर्णित किया गया है:

प्रत्येक उपयोग या एक अपदस्थ सदस्य या वर्ग के ओवरराइड का विवरण दिखाएं। बिना -deprecation, javacस्रोत फ़ाइलों का एक सारांश दिखाता है जो उपयोग किए गए सदस्यों या वर्गों को ओवरराइड या ओवरराइड करता है। -डिप्रेशन के लिए आशुलिपि है -Xlint:deprecation

जैसा कि कहा गया है, यह मानक संकलक चेतावनी से ऊपर और परे जाता है।

कई आईडीई में, पदावनत विधियों और मूल्यों को एक स्ट्राइकथ्रू के साथ दिखाया गया है:

foo.bar();

और जैसे उत्पादन का उत्पादन होगा:

$ javac -Xlint:all Foo.java Bar.java
Bar.java:2: warning: [deprecation] Foo in unnamed package has been deprecated
interface Bar extends Foo { }
                      ^

आपकी बिल्ड संरचना के आधार पर, आपको बिल्ड को तोड़ने की चेतावनी हो सकती है। यह केवल तब निर्माण को तोड़ देगा जब आपकी एक कक्षा का उपयोग किया गया था (न कि यदि यह केवल बस संकलित है)।

@CustomAnnotation

इसके लिए कई दृष्टिकोण हैं। उदाहरण के लिए, लाइटवेट javac @Warning एनोटेशन जो एक एनोटेशन प्रोसेसर प्रदान करता है जो संकलन समय पर चेतावनी देता है जब उस एनोटेशन के साथ कुछ प्रयोग किया जाता है ( कस्टम एनोटेशन प्रोसेसर पर एक नेटबीन्स ट्यूटोरियल ताकि आप इस बात का अंदाजा लगा सकें कि पीछे क्या चल रहा है दृश्य)।

जावा के मेटाडाटा, भाग 2: कस्टम एनोटेशन बनाने@Unfinished में एनोटेशन के लिए कस्टम एनोटेशन का उपयोग करने का एक उदाहरण ओरेकल भी बताता है ।

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

ध्यान दें कि यह सब वास्तव में एनोटेशन प्रोसेसर का उपयोग करने के लिए बिल्डरों को बदलने का अर्थ है।


2

आप संकलन समय एनोटेशन प्रसंस्करण शुरू कर सकते हैं, लेकिन यह टीम के सभी सदस्यों को उनकी संकलन प्रक्रिया को समायोजित करने के लिए लागू करेगा।

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

इसलिए मेरी सिफारिश है: यदि आप अलग-अलग शाखाओं में डालकर कोड आधार को अलग नहीं कर सकते हैं तो लोगों से बात करें और उन्हें समझाएं कि उन्हें एपीआई का उपयोग क्यों नहीं करना चाहिए।


0

क्या आप सभी अपूर्ण वर्गों को "NOTCOMPLETE" जैसे कुछ स्पष्ट नाम के एक उप-पैकेज में स्थानांतरित कर सकते हैं? यह थोड़ा हैक है लेकिन पर्याप्त दिखाई दे सकता है।

(यदि वे सभी एक ही पैकेज में नहीं हैं, तो आप पैकेज संरचना को फिर से बना सकते हैं।)


0

मुझे नहीं पता है कि कोड में ऐसा करने का एक अच्छा तरीका है। एक कदम पीछे लेना:

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

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


0

मैं कक्षा को सारगर्भित बनाने के लिए चुनता हूँ, और उचित रूप से टिप्पणी करता हूँ - इस तरह, कोड अभी भी संदर्भ के लिए है, लेकिन जो भी इसे तुरंत करने की कोशिश करता है, उसे शुभकामनाएँ :)


-1

एक निर्भरता बनाने के बारे में क्या जो संकलक हल नहीं कर सकता है? बस जोड़ दो:

इस आयात करें .is.not.done.yet.do.not.use.it;

सबसे ऊपर। उपयोगकर्ता इसके साथ संकलन करने में सक्षम नहीं होंगे।

यदि आप कक्षा का परीक्षण करना चाहते हैं, तो बस उस नाम के साथ एक पैकेज / वर्ग बनाएं (या "प्रयोग करने वाले" जैसे सरल प्रयोग करें) और आप नए कोड का परीक्षण कर सकते हैं।


1
यह संकलन विफल हो जाएगा, भले ही मैं इसका उपयोग न करूं ... बुरा विचार ...
सिल्विया बुरसा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.