मुझे लगता है, विशेषता यहां केवल बेहतर लचीलेपन के लिए है (मैं इस सवाल का जवाब बेहतर पता करने के लिए टिप्पणी में सवाल का पुनर्गठन)। एक ढांचा डिजाइनर के रूप में, कोई भी अंतिम उपयोगकर्ता को यथासंभव कोडिंग बाधाओं को आराम करना चाहता है। सार्वजनिक गैर-कार्यवाही न होने की आवश्यकता सामान्य रूप से अच्छी लग सकती है लेकिन कुछ परियोजनाओं के लिए बहुत ही सीमित हो सकती है।[NonAction]
जोड़ना उनकी समस्या हल करता है (हालांकि उनके खराब डिजाइन द्वारा पेश किया गया है) - और जाहिर है कि आपको विशेषता का उपयोग करने के लिए मजबूर नहीं किया गया है, इसलिए यह एक फ्रेमवर्क डिजाइनर परिप्रेक्ष्य से जीत-जीत है।
एक अन्य कारण विरासत हो सकता है - पहले एमवीसी संस्करणों में केवल [Action]
के साथ चिह्नित विधियों को क्रियाओं के रूप में माना जाता है। इसलिए जब उन्होंने आवश्यकता को आराम दिया (और सभी सार्वजनिक तरीकों को क्रियाओं के रूप में माना गया) उन्होंने [NonAction]
रखा ताकि डेवलपर बहुत भ्रमित न हों।
सामान्य तौर पर, NonAction
का उपयोग कर एक बुरी बात है - वास्तव में कारणों से आप ने कहा के लिए। अगर कुछ कार्रवाई नहीं होनी चाहिए, तो यह पहले स्थान पर public
नहीं होना चाहिए।
public class MyController : IController
{
public ActionResult Foo(long orderId)
{
var order = new OrdersController().GetOrder(orderId); //GetOrder is public
...
}
}
की तुलना के साथ:
नियंत्रक पर सार्वजनिक गैर कार्रवाई के तरीकों के साथ समस्या यह है कि वे अपने नियंत्रक का दृष्टांत और विधि कॉल करने के लिए परीक्षा लोगों को, आम तर्क को अलग करने के बजाय है
public class MyController : IController
{
public ActionResult Foo(long orderId)
{
var order = _orderService.GetOrder(orderId);
...
}
}
पहला दृष्टिकोण क्रियाओं में नियंत्रकों और गैर-सीधा कोड के बीच युग्मन बढ़ाने की ओर जाता है। कोड का पालन करना और रिफैक्टर करना मुश्किल हो जाता है, और नकली/परीक्षण करने के लिए बोझिल हो जाता है।
बढ़ते युग्मन के अलावा, कोई भी सार्वजनिक गैर-क्रिया विधि एक सुरक्षा छेद है - यदि आप [NonAction]
(या बेहतर, जनता से दूर) के साथ इसे चिह्नित करना भूल जाते हैं - क्योंकि इसे सामान्य कार्रवाई के रूप में माना जाता है और इसे बाहरी रूप से बुलाया जा सकता है। मुझे मूल प्रश्न पता है कि आप निश्चित रूप से आवश्यक होने पर विशेषता को अटैच करना कभी नहीं भूलेंगे, लेकिन यह समझना भी महत्वपूर्ण है कि क्या होगा यदि आप क्या कर सकते हैं;) ओह ठीक है, और जैसा कि हम इस पर हैं, ऐसा लगता है कि "विशेषता को भूलना" अधिक सैद्धांतिक रूप से संभावित है, "विधि को निजी बनाने के लिए भूलना" की तुलना में।
कभी कभी लोगों का कहना है public
गैर कार्रवाई होने इकाई परीक्षण के लिए आवश्यक है, लेकिन फिर, जब कुछ एक कार्रवाई यह सबसे अधिक संभावना एक अलग वर्ग में अलग किया जा सकता है और अलग से जांच नहीं की है। इसके अलावा, यहां तक कि यदि किसी भी कारण से संभव नहीं है, तो public
परीक्षण उद्देश्यों के लिए केवल एक खराब आदत है - internal
और InternalsVisibleTo
का अनुशंसित तरीका है।
यह सुनिश्चित नहीं है कि आप क्या खोज रहे हैं - यदि आपके पास ऐसी कोई विधि है जो किसी कारण से सार्वजनिक होने की आवश्यकता है, लेकिन कोई कार्रवाई नहीं होनी चाहिए तो आप इसे इस तरह से चिह्नित करें ... या आपका प्रश्न यह है कि "लोग सार्वजनिक तरीकों का उपयोग क्यों करते हैं"? –
@AlexeiLevenkov: हाँ मेरा सवाल यह है कि लोग सार्वजनिक गैर-व्यवहार विधि का उपयोग क्यों करते हैं। वे निजी विधि का भी उपयोग कर सकते हैं। – ChandniShah