क्या यूनीली लाइफसाइकल विधियों को एन्टिमिप्लिकली विशेषता के साथ एनोटेट किया जाना चाहिए?


9

क्या UsedImplicitlyविशेषता के साथ एकता जीवनचक्र विधियों की व्याख्या करने से आपके कोड की पठनीयता में सुधार होता है?

उदाहरण के लिए:

public class Example : MonoBehaviour
{
    [UsedImplicitly]
    private void Awake()
    {
        DoSomething();
    }

    private void DoSomething()
    {
        // ...
    }
}

"स्ट्रक्चरिंग योर यूनिटी मोनोबेहॉवर्स" पर यह ब्लॉग पोस्ट एक उपयोगी सम्मेलन के रूप में इस दृष्टिकोण का सुझाव देता है।

  1. किसी भी एकता जीवन चक्र विधियों (प्रारंभ, जाग, अद्यतन, OnDestroy आदि), घटना तरीकों, और अन्य कार्यों है कि निहित हैं (या स्वचालित रूप से) आपके कोड में [UsedImplicitly] विशेषता के साथ संलग्न करें। यह विशेषता, हालांकि UnityEngine.dll में शामिल है, का उपयोग ReSharper द्वारा कोड क्लीनअप सुझावों को उन तरीकों के लिए अक्षम करने के लिए किया जाता है जो प्रतीत नहीं होते हैं। यह उन लोगों के लिए कोड को पढ़ने में आसान बनाने में मदद करता है जो एकता और आपके कोडबेस के लिए नए हैं, खासकर उन घटनाओं के लिए जो निरीक्षक के माध्यम से संदर्भित हैं।

(ध्यान दें: मुझे नहीं लगता है कि ReSharper प्रतीत होता है कि एकतरफा जीवन चक्र विधियों के लिए कोड-सफाई सुझाव दिखाता है, ताकि पुरानी सलाह हो सके।)

मैं उपरोक्त पोस्ट से सहमत हूं कि यह उन लोगों के लिए एकता के लिए मददगार हो सकता है। मैं भी लगता है कि यह उन लेबल करने के लिए उपयोगी हो सकता है एकता जीवन चक्र कार्यों कि अक्सर के रूप में के रूप में इस्तेमाल नहीं कर रहे हैं Awake, Startऔर Update। लेकिन मैं सोच रहा हूं कि क्या यह वास्तव में "स्वच्छ कोड" के लिए एक अच्छा सम्मेलन है, या यदि यह सिर्फ शोर है जो पठनीयता को कम करता है।


1
मैं एकता में 2 खेल प्रकाशित किया है और यह अस्तित्व में नहीं पता था। अगर मैंने किया तो शायद मैंने स्पष्टता के लिए इसका इस्तेमाल किया है और इसे शोर नहीं माना जाएगा।
मैकडॉन

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

जवाबों:


10

यह लक्ष्य जनसांख्यिकीय पर निर्भर करता है।

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

जो भी कभी एक बुनियादी एकता ट्यूटोरियल किया, वह बहुत अच्छी तरह से जानता है Startऔर Updateइसका उपयोग एकता इंजन द्वारा किया जाता है, इसलिए यह उन्हें नई जानकारी नहीं देगा। यदि आप इसे एक बार भूल जाते हैं, तो यह वास्तव में उन में से भ्रमित कर सकता है। आप उसके साथ क्या कहना चाहते हैं? क्या यह वास्तव में एक मोनोबेवियर नहीं है? या फिर कुछ अस्पष्ट कारण है कि आप इसे स्पष्ट रूप से क्यों कहें, जिसके बारे में मुझे जानकारी नहीं है?

हालांकि, अगर आप अनुभवहीन डेवलपर्स के साथ काम कर रहे हैं, तो यह मदद कर सकता है, जो अधिक गूढ़ एकता की घटनाओं से परिचित नहीं हो सकता है Reset( जैसे खतरनाक, क्योंकि इसे कॉल करना स्पष्ट रूप से वह नहीं कर सकता जो आप सोचते हैं कि यह करता है)। [UsedImplicitly]विशेषता तो उन्हें बता सकता है कि वे कक्षा जो कि प्रणाली को बुलाती है क्योंकि इंजन करता है देखने के लिए की जरूरत नहीं है। लेकिन फिर, यह केवल मूल्य है यदि आपके पास लगातार ऐसा करने का अनुशासन है। और यदि आपके पास आत्म-अनुशासन की मात्रा है, तो आप टिप्पणी जोड़ने पर सहमत हो सकते हैं।


1
मैं "99% जनसांख्यिकीय के लिए कोई लाभ नहीं प्रदान करता" जोड़ना होगा। यहां तक ​​कि शुरुआती कुछ घंटों के बाद जीवन चक्र के तरीकों को पहचानना शुरू हो जाएगा (वे वीएस में अलग-अलग रंग के होते हैं!)। और resharper है: एक महंगा लाइसेंस, फिर से जोड़ा जा सकता है, और ओपी ने कहा कि यह शायद पहले से ही वैसे भी पैच है। मुझे लगता है कि हर व्यक्ति अपने दूसरे तरीके को तर्कपूर्ण मूल्य के गुणों के साथ सजाने की तुलना में अधिक प्रभावी ढंग से व्यतीत कर सकता है ।
वंद्रा

@wondra यह इंगित करने के लिए धन्यवाद कि वे विज़ुअल स्टूडियो में अलग-अलग रंग के हैं। मैं यह पता लगाने की कोशिश करूंगा कि यह दृश्य स्टूडियो 2017 के साथ मेरे लिए ऐसा क्यों नहीं करता, भले ही Tools -> Options -> Tools for Unity -> General -> Unity Messages syntax highlightingयह सच है।
सन्नी

1
मैंने इस बात पर ध्यान नहीं दिया कि विज़ुअल स्टूडियो मेरे यूनिटी तरीकों को क्यों नहीं रंग रहा है, लेकिन एक अन्य उत्तर ने बताया कि ReSharper में एकता के लिए एक प्लगइन है जो स्वचालित रूप से एकता ईवेंट फ़ंक्शन को भी पहचानता है। वहाँ भी इस संबंधित सेटिंग है: ReSharper -> Options -> Code Inspection -> Settings -> Enable code analysis -> Color identifiers
सन्नी

6

मेरा तर्क है कि नहीं, आपको इसका उपयोग नहीं करना चाहिए।

UsedImplicitly विशेषता Jetbrains.Annotations नामस्थान से है, इसलिए केवल यही मामला जहां यह लागू हो सकता है, अगर कोड का उपयोग करने वाला हर कोई ReSharper का उपयोग कर रहा होगा।

ReSharper में Unity के लिए एक प्लगइन है जो पहले से ही आपके लिए इसे संभालता है, न केवल उन चेतावनियों को हटाने के लिए सुनिश्चित करता है, जिनका उपयोग नहीं किया गया है, बल्कि उन्हें थोड़ा Unity सिंबल के साथ चिन्हित किया जा रहा है ताकि कोड पढ़ने वाला कोई भी व्यक्ति यह देख सके कि उन्हें Unity द्वारा ही बुलाया गया है।

मैं एक उदाहरण जोड़ना चाहूंगा जब उनका उपयोग गलत हो सकता है। मान लें कि आपके पास मोनोबेहेवॉर से विरासत में मिला वर्ग है, लेकिन एक रिफ्लेक्टर के बाद अब यह विरासत में नहीं है। यदि आपने निजी विधियों को [UsedImplicitly] के साथ चिह्नित किया है, तो आपको सही चेतावनी नहीं मिलेगी। यदि आप पुनरावृत्ति के लिए यूनिटी प्लगइन का उपयोग करते हैं, तो यह नोटिस करेगा कि अब आपको मोनोबीहेयर से विरासत में नहीं मिला है और चेतावनी को फेंक देगा क्योंकि विधियों को वास्तव में अब नहीं कहा जाता है।


1
मुझे नहीं पता था कि ReSharper प्लगइन मौजूद था, इसे इंगित करने के लिए धन्यवाद!
सन्नी

1
ध्यान दें कि यूनिटी में ReSharper विशेषताओं के साथ एकता शुरू हो गई है। एकता 5 के रूप में - इस मंच पोस्ट को देखें
सन्नी

5

मैं तर्क देता हूँ कि यह वास्तव में चोट नहीं पहुँचा सकता है।

एकता के कामकाज से बहुत परिचित लोगों के लिए, यह शायद कुछ भी नहीं जोड़ता है। वे लोग पहले से ही बहुत परिचित होने जा रहे हैं जो यूनिटी के रनटाइम को आपकी ओर से कॉल करते हैं।

लेकिन जो मेरे जैसा नहीं है, उसके लिए यह मददगार हो सकता है। यहां तक ​​कि अगर मुझे नहीं पता था कि इसका क्या मतलब है, तो मैं इसे देखूंगा, और शायद यह मुझे कोड में क्या चल रहा है इसकी बेहतर समझ देने के लिए पर्याप्त होगा।

इसके अलावा, यदि कोई स्थिर विश्लेषण उपकरण का उपयोग करता है जो गलत तरीके से तरीकों के बारे में चेतावनी दे रहा है, तो आप उन चेतावनियों को किसी भी तरह से शांत करना चाहेंगे, क्योंकि "आग्नेय" चेतावनी शोर इस तरह के किसी भी आउटपुट में वास्तविक चेतावनियों को देखना कठिन बना देता है । आमतौर पर सर्जिकल, स्थानीयकृत फैशन में इस तरह की चेतावनियों को अनदेखा करना बेहतर होता है (इस मामले में विशेषताओं के साथ अपमानजनक तरीकों को सजाने से) उस विशिष्ट चेतावनी परियोजना को अक्षम करने जैसे व्यापक उपायों की तुलना में।


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

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

2

इस दृष्टिकोण के साथ समस्या यह है कि यह अविश्वसनीय रूप से त्रुटि प्रवण है।

यदि यह विश्वसनीय नहीं है, तो टैग उपयोगी जानकारी देने में विफल होंगे, और उनकी उपस्थिति या अनुपस्थिति कभी-कभी गलत जानकारी देने में सफल होगी, जो हानिकारक है।

यदि आप इसके साथ जाने का निर्णय लेते हैं, तो आपको मानवीय त्रुटि को दूर करना होगा , जो करना मुश्किल नहीं है, लेकिन यदि आपने पहले ऐसा कुछ नहीं किया है तो 2 घंटे का अच्छा काम करता है। 2 दृष्टिकोण हैं - प्रत्येक अपने फायदे के साथ - आप दोनों में से किसी एक का उपयोग कर सकते हैं:

  1. चेक या स्वचालित निर्माण में गैर-अनुपालन कोड को सत्यापित और अस्वीकार करें।
  2. चेक इन या स्वचालित बिल्ड पर टैग को ठीक करने के लिए कोड का स्वचालित संपादन।

क्या यह इसके लायक है? हाँ। क्या यह आपके समय के 2 घंटे के लायक है? तुम्हारा कॉल।


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