यदि वर्ग गुण एक वर्ग का नया उदाहरण बनाता है और रिटर्न करता है तो क्या यह एक विरोधी स्वरूप है?


24

मेरे पास एक वर्ग है जिसे Headingकुछ चीजें मिलती हैं, लेकिन यह वर्तमान शीर्षक मूल्य के विपरीत लौटने में भी सक्षम होना चाहिए, जिसे अंततः Headingकक्षा का एक नया उदाहरण बनाने के माध्यम से उपयोग किया जाना है।

मेरे पास एक साधारण संपत्ति हो सकती है जिसे reciprocalवर्तमान मूल्य के विपरीत शीर्षक को वापस करने के लिए कहा जाता है और फिर हेडिंग क्लास का एक नया उदाहरण मैन्युअल रूप से बनाया जाता है, या मैं एक विधि बना सकता हूं जैसे createReciprocalHeading()हेडिंग क्लास का एक नया उदाहरण स्वचालित रूप से बनाना और उसे दूसरे पर लौटना उपयोगकर्ता।

हालाँकि, मेरे एक सहकर्मी ने मुझे एक क्लास प्रॉपर्टी बनाने के लिए सिफारिश की, जिसे कहा जाता है reciprocalकि क्लास का एक नया उदाहरण अपने गेट्टर मेथड के माध्यम से ही मिलता है।

मेरा सवाल है: क्या यह वर्ग की संपत्ति के लिए उस तरह का व्यवहार करने के लिए एक विरोधी पैटर्न नहीं है?

मुझे विशेष रूप से यह कम सहज लगता है क्योंकि:

  1. मेरे दिमाग में, एक वर्ग की संपत्ति को एक वर्ग का नया उदाहरण नहीं लौटाना चाहिए, और
  2. संपत्ति का नाम, जो है reciprocal, डेवलपर को उसके व्यवहार को पूरी तरह से समझने में मदद नहीं करता है, बिना आईडीई की सहायता प्राप्त किए या गेटर हस्ताक्षर की जांच के।

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


6
जैसा कि @ इवान अपने जवाब के अंतिम पैराग्राफ में कहते हैं, एक विरोधी पैटर्न से दूर, Headingएक अपरिवर्तनीय प्रकार के रूप में और reciprocalएक नया रिटर्न "सफलता का पिटारा Heading" अच्छा अभ्यास है। (दो कॉल पर कैवेट के साथ reciprocal"एक ही बात" लौटना चाहिए, अर्थात उन्हें समानता परीक्षण पास करना चाहिए।)
डेविड अरनो

20
"मेरी कक्षा अपरिवर्तनीय नहीं है"। वहीं आपका असली एंटी-पैटर्न है। ;)
डेविड अरनो

3
@DavidArno खैर, कभी-कभी कुछ चीजों को अपरिवर्तनीय बनाने के लिए बहुत बड़ा प्रदर्शन जुर्माना होता है, खासकर यदि भाषा इसे मूल रूप से समर्थन नहीं करती है, लेकिन अन्यथा मैं मानता हूं कि बहुत सारे मामलों में अपरिवर्तनीयता एक अच्छा अभ्यास है।
53777A

2
@dcorking कक्षा को C # और टाइपस्क्रिप्ट दोनों में लागू किया गया है, लेकिन मैं इस भाषा-अज्ञेय को रखता हूं।
53777A

2
@Kaiserludi एक जवाब (एक महान जवाब) की तरह लगता है - टिप्पणियां स्पष्टता का अनुरोध करने के लिए हैं
15

जवाबों:


22

इसकी कॉपी () या क्लोन () जैसी चीजों के लिए अज्ञात नहीं है, लेकिन हां मुझे लगता है कि आप इस बारे में चिंतित होने के लिए सही हैं।

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

h2 = h1.reciprocal
h2.Name = "hello world"
h1.reciprocal.Name = ?

कुछ चेतावनी देना अच्छा होगा कि संपत्ति हर बार एक नई वस्तु थी।

आप यह भी मान सकते हैं कि:

h2.reciprocal == h1

तथापि। यदि आपका शीर्षक वर्ग एक अपरिवर्तनीय मूल्य प्रकार है तो आप इन रिश्तों को लागू करने में सक्षम होंगे और पारस्परिक संचालन के लिए एक अच्छा नाम हो सकता है


1
बस ध्यान दें कि Copy()और Clone()तरीके हैं, गुण नहीं। मेरा मानना ​​है कि ओपी नए उदाहरणों को लौटाने वाले संपत्ति पाने वालों का जिक्र कर रहा है।
लिन

6
मुझे पता है। लेकिन गुण (प्रकार) भी c #
Ewan

4
उस मामले में, सी # पेशकश करने के लिए भी बहुत कुछ है: String.Substring(), Array.Reverse(), Int32.GetHashCode(), आदि
लिन

If your heading class was an immutable value type- मुझे लगता है कि आपको यह जोड़ना चाहिए कि अपरिवर्तनीय वस्तुओं पर संपत्ति बसने वालों को नए उदाहरण हमेशा (या कम से कम यदि नया मूल्य पुराने मूल्य के समान नहीं है) वापस करना चाहिए, क्योंकि यह अपरिवर्तनीय वस्तुओं की परिभाषा है। :)
इवान कोलेमिचेक

17

एक वर्ग का एक इंटरफ़ेस कक्षा के उपयोगकर्ता को इस बारे में धारणा बनाने के लिए प्रेरित करता है कि यह कैसे काम करता है।

यदि इनमें से कई धारणाएं सही हैं और कुछ गलत हैं, तो इंटरफ़ेस अच्छा है।

यदि इनमें से कई धारणाएं गलत हैं और कुछ सही हैं, तो इंटरफ़ेस बकवास है।

प्रॉपर्टीज के बारे में एक आम धारणा यह है कि कॉलिंग फंक्शन सस्ता है। गुणों के बारे में एक और आम धारणा यह है कि एक पंक्ति में दो बार फ़ंक्शन को कॉल करने से एक ही चीज़ वापस आ जाएगी।


उम्मीदों को बदलने के लिए, आप निरंतरता का उपयोग करके इसके आसपास काम कर सकते हैं। उदाहरण के लिए, एक छोटे से 3 डी लाइब्रेरी के लिए जहाँ आपको ज़रूरत है Vector, Ray Matrixआदि, आप इसे ऐसे बना सकते हैं जैसे कि गेटर्स जैसे Vector.normalऔर Matrix.inverseहमेशा बहुत महंगे हैं। दुर्भाग्य से यहां तक ​​कि अगर आपके इंटरफेस लगातार महंगे गुणों का उपयोग करते हैं, तो इंटरफेस सबसे अच्छा रूप में एक के रूप में सहज ज्ञान युक्त होगा जो उपयोग करता है Vector.create_normal()और Matrix.create_inverse()- फिर भी मुझे कोई मजबूत तर्क नहीं पता है कि यह बनाया जा सकता है कि गुणों का उपयोग अपेक्षाओं को बदलने के बाद भी अधिक सहज इंटरफ़ेस बनाता है।


10

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

आपका अंतर्ज्ञान मोटे तौर पर सही है। एक फ़ैक्टरी विधि बार-बार कॉल के साथ समान मान नहीं लौटाती है। यह हर बार एक नया उदाहरण देता है। यह बहुत अधिक संपत्ति के रूप में अयोग्य घोषित करता है। यह तेजी से नहीं है अगर बाद में विकास उदाहरण के निर्माण के लिए वजन जोड़ता है, उदाहरण के लिए नेटवर्क निर्भरता।

गुण आम तौर पर बहुत सरल ऑपरेशन होने चाहिए जो वर्ग की वर्तमान स्थिति का एक हिस्सा प्राप्त / निर्धारित करते हैं। फैक्ट्री जैसे ऑपरेशन इस मापदंड को पूरा नहीं करते हैं।


1
DateTime.Nowसंपत्ति आमतौर पर इस्तेमाल किया जाता है और एक नई वस्तु को दर्शाता है। मुझे लगता है कि किसी संपत्ति का नाम अस्पष्टता को दूर करने में मदद कर सकता है या नहीं, चाहे एक ही वस्तु को हर बार लौटाया जाए। यह सब नाम में है और इसका उपयोग कैसे किया जाता है।
ग्रेग बरगार्ड

3
DateTime.Now एक गलती के रूप में माना जाता है। देखें stackoverflow.com/questions/5437972/...
ब्रैड थॉमस

@GregBurghardt एक नई वस्तु का साइड इफेक्ट स्वयं में एक मुद्दा नहीं हो सकता है, क्योंकि DateTimeयह एक मूल्य प्रकार है, और इसमें वस्तु पहचान की कोई अवधारणा नहीं है। अगर मैं सही तरीके से समझूं, तो मुद्दा यह है कि यह गैर-नियतात्मक है और हर बार एक नया मूल्य लौटाता है।
ज़ेव स्पिट्ज़

1
@GregBurghardt DateTime.Newस्थिर है, और इसलिए आप किसी वस्तु की स्थिति का प्रतिनिधित्व करने की उम्मीद नहीं कर सकते।
त्सही अशेर

5

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

C # में, गुण विशिष्ट हैं कि वे (पारंपरिक रूप से) पूंजीकृत हैं (विधियों की तरह) लेकिन उनमें कोष्ठक (सार्वजनिक उदाहरण चर की तरह) की कमी है। यदि आप निम्नलिखित कोड, अनुपस्थित प्रलेखन देखते हैं, तो आप क्या उम्मीद करते हैं?

var reciprocalHeading = myHeading.Reciprocal;

एक रिश्तेदार सी # नौसिखिए के रूप में, लेकिन जो Microsoft की संपत्ति उपयोग दिशानिर्देशों को पढ़ता है , मैं Reciprocalअन्य चीजों के बीच की अपेक्षा करूंगा:

  1. Headingकक्षा का तार्किक डेटा सदस्य हो
  2. कॉल करने के लिए सस्ती हो, जैसे कि मेरे लिए मूल्य को कैश करने की कोई आवश्यकता नहीं है
  3. कमी देखने योग्य दुष्प्रभाव
  4. एक ही परिणाम का उत्पादन अगर दो बार उत्तराधिकार में कहा जाता है
  5. (शायद) एक ReciprocalChangedघटना की पेशकश करते हैं

इन मान्यताओं में से, (3) और (4) शायद सही हैं (मान Headingलेना एक अपरिवर्तनीय मूल्य प्रकार है, जैसा कि इवान के उत्तर में है ), (1) बहस योग्य है, (2) अज्ञात है, लेकिन यह भी बहस योग्य है, और (5) संभावना नहीं है अर्थ समझ बनाने (हालांकि जो कुछ भी है एक शीर्षक शायद एक होना चाहिए HeadingChangedघटना)। इससे मुझे पता चलता है कि C # API में, "प्राप्त करें या पारस्परिक गणना करें" को एक संपत्ति के रूप में लागू नहीं किया जाना चाहिए , लेकिन विशेष रूप से यदि गणना सस्ती है और Headingअपरिवर्तनीय है, तो यह एक सीमावर्ती मामला है।

(ध्यान दें, हालांकि, इन चिंताओं में से कोई भी कुछ नहीं है कि संपत्ति को कॉल करने से एक नया उदाहरण बनता है , यहां तक ​​कि (2) भी नहीं। सीएलआर में वस्तुओं का निर्माण करना, और अपने आप में बहुत सस्ता है।)

जावा में, गुण एक विधि नामकरण सम्मेलन हैं। अगर मैं देखूँ

Heading reciprocalHeading = myHeading.getReciprocal();

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

वे विधियाँ जो किसी गैर- booleanफ़ंक्शन या उस ऑब्जेक्ट की विशेषता को लौटाती हैं, जिस पर उनका उपयोग किया जाता है, आमतौर पर एक संज्ञा, संज्ञा वाक्यांश या क्रिया के साथ शुरू होने वाली क्रिया वाक्यांश के साथ नामित किया जाता है get। एक मुखर आकस्मिकता है जो दावा करती है कि केवल तीसरा रूप (शुरुआत get) स्वीकार्य है, लेकिन इस दावे का बहुत कम आधार है। पहले दो रूपों में आमतौर पर अधिक पठनीय कोड होता है ... (पृष्ठ 239)

समकालीन, अधिक धाराप्रवाह एपीआई में, फिर, मैं देखने की उम्मीद करूंगा

Heading reciprocalHeading = myHeading.reciprocal();

- जो फिर से सुझाव देगा कि कॉल सस्ता है, बेरोजगार है, और साइड इफेक्ट्स का अभाव है, लेकिन इस बारे में कुछ नहीं कहेंगे कि एक नई गणना की जाती है या एक नई वस्तु बनाई जाती है। यह ठीक है; एक अच्छे एपीआई में, मुझे परवाह नहीं करनी चाहिए।

रूबी में, संपत्ति जैसी कोई चीज नहीं है। "विशेषताएँ" हैं, लेकिन अगर मैं देखूं

reciprocalHeading = my_heading.reciprocal

मेरे पास यह जानने का कोई तात्कालिक तरीका नहीं है कि मैं एक इंस्टेंस वेरिएबल @reciprocalको एक्सेस कर रहा हूं attr_readerया सिंपल एक्सेसर मेथड के माध्यम से , या क्या मैं एक ऐसा तरीका कह रहा हूं जो एक महंगी गणना करता है। तथ्य यह है कि विधि का नाम एक सरल संज्ञा है, हालांकि, कहने के बजाय calcReciprocal, फिर से, सुझाव देता है कि कॉल कम से कम सस्ती है और शायद इसके दुष्प्रभाव नहीं हैं।

स्काला में, नामकरण सम्मेलन है कि साइड इफेक्ट्स वाले तरीके कोष्ठक लेते हैं और उनके बिना तरीके नहीं हैं, लेकिन

val reciprocal = heading.reciprocal

इनमें से कोई भी हो सकता है:

// immutable public value initialized at creation time
val reciprocal: Heading = … 

// immutable public value initialized on first use
lazy val reciprocal: Heading = … 

// public method, probably recalculating on each invocation
def reciprocal: Heading = …

// as above, with parentheses that, by convention, the caller
// should only omit if they know the method has no side effects
def reciprocal(): Heading = …

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

कोष्ठक की कमी मुझे बताती है कि कॉल के दुष्प्रभाव नहीं हैं; नाम, फिर से, सुझाव है कि कॉल अपेक्षाकृत सस्ता होना चाहिए। इसके अलावा, मुझे परवाह नहीं है कि यह मुझे कैसे मूल्य देता है।

संक्षेप में: उस भाषा को जानें, जिसका आप उपयोग कर रहे हैं, और यह जान लें कि अन्य प्रोग्रामर आपके एपीआई पर क्या उम्मीदें लगाएंगे। बाकी सब कुछ एक कार्यान्वयन विवरण है।


1
मेरे पसंदीदा जवाबों में से एक, इसे लिखने के लिए अपना समय निकालने के लिए धन्यवाद।
53777A

2

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

नामकरण को भाषा के नामकरण सम्मेलनों के साथ हाथ से जाना चाहिए।

उदाहरण के लिए, जावा में मैं शायद यह कहूंगा कि इसे बुलाया जाएगा getReciprocal();

यह कहा जा रहा है, मैं उत्परिवर्तनीय बनाम अपरिवर्तनीय वस्तुओं पर विचार करूंगा ।

अपरिवर्तनीय लोगों के साथ , चीजें बहुत आसान हैं, और यदि आप उसी वस्तु को वापस करते हैं या नहीं तो यह चोट नहीं पहुंचेगी।

उत्परिवर्ती लोगों के साथ , यह बहुत डरावना हो सकता है।

b = a.reciprocal
a += 1
b = what?

अब b किसका जिक्र कर रहा है? के मूल मूल्य का पारस्परिक? या बदले हुए का पारस्परिक? यह एक उदाहरण से बहुत छोटा हो सकता है, लेकिन आप इस बिंदु को प्राप्त करते हैं।

उन मामलों में एक बेहतर नामकरण की तलाश होती है जो यह बताता है कि क्या होता है, उदाहरण के लिए createReciprocal()एक बेहतर विकल्प हो सकता है।

लेकिन यह वास्तव में संदर्भ पर भी निर्भर करता है।


क्या आपका मतलब परस्पर था ?
कार्स्टन एस

@CarstenS हाँ, निश्चित रूप से, धन्यवाद। पता नहीं मेरा सिर कहां था। :)
ईको

कुछ हद तक असहमत हैं getReciprocal(), क्योंकि यह "सामान्य" जावाबिन स्टाइल गटर की तरह लगता है। "CreateXXX ()" या संभवतः "कैल्क्युएनएक्सएक्स ()" को इंगित करें जो अन्य प्रोग्रामर को संकेत या संकेत देता है कि कुछ अलग हो रहा है
user949300

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

1

सिंगल-रिस्पॉन्सिबिलिटी और स्पष्टता के हितों में मेरे पास ReverseHeadingFactory होगा जिसने ऑब्जेक्ट लिया और उसका रिवर्स लौटाया। इससे यह स्पष्ट हो जाएगा कि एक नई वस्तु वापस की जा रही है और इसका मतलब होगा कि कोड का उल्टा उत्पादन दूसरे कोड से दूर हो गया था।


1
नाम स्पष्टता के लिए +1, लेकिन अन्य समाधानों में SRP के साथ क्या गलत है?
53777A

3
आप फैक्टरी विधि से अधिक कारखाना वर्ग की सिफारिश क्यों करते हैं? (मेरी राय में, किसी वस्तु की एक उपयोगी जिम्मेदारी अक्सर ऐसी वस्तुओं का उत्सर्जन करना है जो स्वयं जैसे हैं, जैसे itter.next। क्या SRP के इस हल्के उल्लंघन से अन्य सॉफ्टवेयर इंजीनियरिंग समस्याएं पैदा होती हैं?)
dcorking

2
@dcorking एक कारखाने वर्ग बनाम विधि (मेरी राय में) आमतौर पर एक ही प्रकार का प्रश्न है "क्या वस्तु तुलनीय है, या मुझे एक तुलनित्र बनाना चाहिए?" यह हमेशा एक तुलनित्र बनाने के लिए ठीक है, लेकिन केवल उनकी तुलना करने के लिए ठीक है अगर यह उनकी तुलना करने का एक सुंदर सार्वभौमिक तरीका है। (जैसे, बड़ी संख्या छोटे लोगों की तुलना में अधिक है, यह तुलनीय के लिए अच्छा है, लेकिन आप कह सकते हैं कि सभी बुराई सभी बाधाओं से अधिक हैं, मैं इसे एक तुलनित्र में बनाऊंगा) - इसलिए इसके लिए, मुझे लगता है कि केवल एक ही है हेडर को उल्टा करने का तरीका, इसलिए मैं एक अतिरिक्त कक्षा से बचने के लिए एक विधि बनाने की दिशा में झुकूंगा।
कप्तान मैन

0

निर्भर करता है। मैं आमतौर पर संपत्तियों से उन चीजों की वापसी की उम्मीद करता हूं जो एक उदाहरण का हिस्सा हैं, इसलिए एक ही वर्ग के एक अलग उदाहरण को वापस करना थोड़ा असामान्य होगा।

लेकिन उदाहरण के लिए एक स्ट्रिंग क्लास में "फर्स्टवॉर्ड", "लास्टवॉर्ड", या अगर यह यूनिकोड "फर्स्टलीटर", "लास्टलीटर" हो सकता है, जो पूर्ण स्ट्रिंग ऑब्जेक्ट होगा - बस आमतौर पर छोटे वाले होते हैं।


0

चूंकि अन्य उत्तर संपत्ति भाग को कवर करते हैं, मैं आपके # 2 पते के बारे में बताऊंगा reciprocal:

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


0

तार्किक रूप से, नहीं, यह शीर्षासन की संपत्ति नहीं है। यदि ऐसा होता है, तो आप यह भी कह सकते हैं कि किसी संख्या का ऋणात्मक उस संख्या की संपत्ति है, और स्पष्ट रूप से जो "संपत्ति" को सभी अर्थ खो देगा, लगभग सब कुछ एक संपत्ति होगी।

पारस्परिक एक शीर्ष का एक शुद्ध कार्य है, उसी प्रकार किसी संख्या का ऋणात्मक उस संख्या का शुद्ध कार्य है।

अंगूठे के एक नियम के रूप में, यदि इसे स्थापित करने का कोई मतलब नहीं है, तो यह संभवतः एक संपत्ति नहीं होनी चाहिए। इसे स्थापित करना अभी भी निश्चित रूप से अस्वीकृत हो सकता है, लेकिन एक सेटर को जोड़ना सैद्धांतिक रूप से संभव और सार्थक होना चाहिए।

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


संपादित करें: विशेष रूप से C # के लिए, मैं मौजूदा कक्षाओं को देखूंगा, विशेष रूप से स्टैंडर्ड लाइब्रेरी के।

  • वहाँ BigIntegerऔर Complexसंरचनाएँ हैं। लेकिन वे संरचनाएं हैं, और केवल स्थिर कार्य हैं, और सभी गुण अलग-अलग प्रकार के हैं। इतना डिजाइन नहीं है कि आप वहाँ Headingक्लास के लिए मदद करें ।
  • Math.NET न्यूमेरिक्स में Vectorक्लास है , जिसमें बहुत कम गुण हैं, और लगता है कि यह आपके बहुत करीब है Heading। यदि आप इसके द्वारा जाते हैं, तो आपके पास एक संपत्ति नहीं बल्कि पारस्परिक के लिए एक समारोह होगा।

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


-1

बहुत दिलचस्प सवाल वास्तव में। मैं क्या आप कर रहे हैं प्रस्ताव में कोई ठोस + सूखी + KISS उल्लंघन देखते हैं, लेकिन, फिर भी, यह बदबू आती है।

एक विधि उस वर्ग का एक उदाहरण देता है एक कहा जाता है निर्माता , है ना? इसलिए आप एक गैर-निर्माता विधि से एक नया उदाहरण बना रहे हैं। यह दुनिया का अंत नहीं है, लेकिन एक ग्राहक के रूप में, मैं यह उम्मीद नहीं करूंगा । यह आमतौर पर विशिष्ट परिस्थितियों में किया जाता है: एक कारखाना या, कभी-कभी, एक ही वर्ग का एक स्थिर तरीका (एकल के लिए उपयोगी है और ... नहीं-तो-वस्तु-उन्मुख प्रोग्रामर?)

प्लस: यदि आप getReciprocal()लौटे ऑब्जेक्ट पर आह्वान करते हैं तो क्या होता है ? आप कक्षा का एक और उदाहरण प्राप्त करते हैं, जो पहले वाले की एक सटीक प्रति हो सकती है! और यदि आप getReciprocal()एक पर आह्वान करते हैं? वस्तुओं किसी को भी?

फिर से: क्या होगा यदि आक्रमणकारी को पारस्परिक मूल्य (स्केलर के रूप में, मेरा मतलब है) की आवश्यकता है? getReciprocal()->getValue()? हम थोड़े से लाभ के लिए कानून के कानून का उल्लंघन कर रहे हैं ।


मैं ख़ुशी-ख़ुशी काउंटर-तर्क स्वीकार करना चाहता हूँ, जो थरथराता है, धन्यवाद!
डॉ। जियानलुइगी ज़ेन ज़नैटिनी

1
मैं नीचे नहीं गया, लेकिन मुझे संदेह है कि कारण यह हो सकता है कि यह वास्तव में बाकी उत्तरों में बहुत कुछ नहीं जोड़ता है, लेकिन मैं गलत हो सकता हूं।
53777A

2
ठोस और KISS अक्सर एक दूसरे के विपरीत हैं।
whatsisname 18
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.