म्यूटेटर विधि: Difference between revisions
From Vigyanwiki
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
[[कंप्यूटर विज्ञान]] में, एक म्यूटेटर विधि एक चर में परिवर्तन को नियंत्रित करने के लिए उपयोग की जाने वाली [[विधि (कंप्यूटर विज्ञान)|विधि]] है। उन्हें व्यापक रूप से सेटर विधियों के रूप में भी जाना जाता है। अक्सर एक सेटर के साथ एक गेट्टर (एक साथ एक्सेसर्स के रूप में भी जाना जाता है) होता है, जो निजी [[सदस्य चर]] का मान लौटाता है। | [[कंप्यूटर विज्ञान]] में, एक '''म्यूटेटर विधि''' एक चर में परिवर्तन को नियंत्रित करने के लिए उपयोग की जाने वाली [[विधि (कंप्यूटर विज्ञान)|विधि]] है। उन्हें व्यापक रूप से सेटर विधियों के रूप में भी जाना जाता है। अक्सर एक सेटर के साथ एक गेट्टर (एक साथ एक्सेसर्स के रूप में भी जाना जाता है) होता है, जो निजी [[सदस्य चर]] का मान लौटाता है। | ||
एनकैप्सुलेशन के सिद्धांत को ध्यान में रखते हुए, म्यूटेटर विधि का उपयोग अक्सर [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में किया जाता है। इस सिद्धांत के अनुसार, एक वर्ग के सदस्य [[चर (प्रोग्रामिंग)]] को छिपाने और उन्हें अन्य कोड से बचाने के लिए निजी बनाया जाता है, और इसे केवल एक सार्वजनिक सदस्य फ़ंक्शन (म्यूटेटर विधि) द्वारा संशोधित किया जा सकता है, जो पैरामीटर के रूप में वांछित नया मान लेता है, वैकल्पिक रूप से मान्य करता है यह, और निजी सदस्य चर को संशोधित करता है। म्यूटेटर विधियों की तुलना असाइनमेंट [[ऑपरेटर ओवरलोडिंग]] से की जा सकती है लेकिन वे आम तौर पर ऑब्जेक्ट पदानुक्रम के विभिन्न स्तरों पर दिखाई देते हैं। | एनकैप्सुलेशन के सिद्धांत को ध्यान में रखते हुए, म्यूटेटर विधि का उपयोग अक्सर [[ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग]] में किया जाता है। इस सिद्धांत के अनुसार, एक वर्ग के सदस्य [[चर (प्रोग्रामिंग)]] को छिपाने और उन्हें अन्य कोड से बचाने के लिए निजी बनाया जाता है, और इसे केवल एक सार्वजनिक सदस्य फ़ंक्शन (म्यूटेटर विधि) द्वारा संशोधित किया जा सकता है, जो पैरामीटर के रूप में वांछित नया मान लेता है, वैकल्पिक रूप से मान्य करता है यह, और निजी सदस्य चर को संशोधित करता है। म्यूटेटर विधियों की तुलना असाइनमेंट [[ऑपरेटर ओवरलोडिंग]] से की जा सकती है लेकिन वे आम तौर पर ऑब्जेक्ट पदानुक्रम के विभिन्न स्तरों पर दिखाई देते हैं। | ||
| Line 25: | Line 25: | ||
}}</ref> | }}</ref> | ||
कक्षा के अंदर से म्यूटेटर और एक्सेसर्स वाले पैरामीटर का हेरफेर जहां उन्हें परिभाषित किया जाता है, उन्हें अक्सर कुछ अतिरिक्त विचार की आवश्यकता होती है। कार्यान्वयन के शुरुआती दिनों में, जब इन ब्लॉकों में बहुत कम या कोई अतिरिक्त कोड नहीं होता है, तो इससे कोई फर्क नहीं पड़ता कि निजी इंस्टेंस चर को सीधे एक्सेस किया गया है या नहीं। सत्यापन, क्रॉस-वैलिडेशन, डेटा इंटीग्रिटी चेक, प्रीप्रोसेसिंग या अन्य परिष्कार के रूप में जोड़ा जाता है, सूक्ष्म बग दिखाई दे सकते हैं जहां कुछ आंतरिक पहुंच नए कोड का उपयोग करती है जबकि अन्य स्थानों पर इसे बायपास किया जाता है। | |||
इसमें शामिल अतिरिक्त चरणों के कारण डेटा फ़ील्ड को सीधे लाने या संग्रहीत करने की तुलना में एक्सेसर फ़ंक्शन कम कुशल हो सकते हैं,<ref>{{cite web | इसमें शामिल अतिरिक्त चरणों के कारण डेटा फ़ील्ड को सीधे लाने या संग्रहीत करने की तुलना में एक्सेसर फ़ंक्शन कम कुशल हो सकते हैं,<ref>{{cite web | ||
| Line 37: | Line 37: | ||
=== सभा === | === सभा === | ||
student struct | |||
age dd ? | |||
student end .code | |||
student_get_age proc object:DWORD | |||
mov ebx, object | |||
mov eax, student.age[ebx] | |||
ret | |||
student_get_age endp | |||
student_set_age proc object:DWORD, age:DWORD | |||
mov ebx, object | |||
mov eax, age | |||
mov student.age[ebx], eax | |||
ret | |||
student_set_age endp | |||
=== सी === | === सी === | ||
#ifndef _STUDENT_H | |||
#define _STUDENT_H | |||
struct student; /* opaque structure */ | |||
typedef struct student student; | |||
student *student_new(int age, char *name); | |||
void student_delete(student *s); | |||
void student_set_age(student *s, int age); | |||
int student_get_age(student *s); | |||
char *student_get_name(student *s); | |||
#endif | |||
#include <stdlib.h> | |||
#include <string.h> | |||
# | #include "student.h" | ||
struct student { | |||
int age; | |||
char *name; | |||
}; | |||
student *student_new(int age, char *name) { | |||
student *s = malloc(sizeof(student)); | |||
s->name = strdup(name); | |||
s->age = age; | |||
return s; | |||
} | |||
void student_delete(student *s) { | |||
free(s->name); | |||
free(s); | |||
} | |||
# | void student_set_age(student *s, int age) { | ||
# | s->age = age; | ||
} | |||
int student_get_age(student *s) { | |||
return s->age; | |||
}; | } | ||
char *student_get_name(student *s) { | |||
return s->name; | |||
} | |||
#include <stdio.h> | |||
#include "student.h" | |||
} | |||
int main(void) { | |||
student *s = student_new(19, "Maurice"); | |||
char *name = student_get_name(s); | |||
int old_age = student_get_age(s); | |||
} | printf("%s's old age = %i\n", name, old_age); | ||
student_set_age(s, 21); | |||
int new_age = student_get_age(s); | |||
printf("%s's new age = %i\n", name, new_age); | |||
} | student_delete(s); | ||
return 0; | |||
} | |||
} | |||
} | |||
< | |||
all: out.txt; cat $< | |||
out.txt: main; ./$< > $@ | |||
main: main.o student.o | |||
main.o student.o: student.h | |||
clean: ;$(RM) *.o out.txt main | |||
out.txt: | |||
main.o | |||
=== सी ++ === | === सी ++ === | ||
#ifndef STUDENT_H | |||
#define STUDENT_H | |||
#ifndef STUDENT_H | |||
# | #include <string> | ||
# | class Student { | ||
public: | |||
Student(const std::string& name); | |||
const std::string& name() const; | |||
void name(const std::string& name); | |||
private: | |||
std::string name_; | |||
}; | |||
}; | #endif | ||
In file Student.cpp: | |||
# | #include "Student.h" | ||
Student::Student(const std::string& name) : name_(name) { | |||
} | |||
# | |||
const std::string& Student::name() const { | |||
return name_; | |||
} | } | ||
void Student::name(const std::string& name) { | |||
name_ = name; | |||
} | } | ||
} | |||
===सी#=== | ===सी#=== | ||
यह उदाहरण | यह उदाहरण गुणों के सी # विचार को दिखाता है, जो एक विशेष प्रकार के वर्ग सदस्य हैं। जावा के विपरीत, कोई स्पष्ट तरीके परिभाषित नहीं हैं; एक सार्वजनिक 'संपत्ति' में क्रियाओं को संभालने के लिए तर्क होता है। बिल्ट-इन (अघोषित) वेरिएबल <code>value</code> के उपयोग पर ध्यान दें। | ||
public class Student | |||
{ | |||
private string name; | |||
/// <summary> | |||
/// Gets or sets student's name | |||
/// </summary> | |||
public string Name | |||
{ | |||
get { return name; } | |||
set { name = value; } | |||
} | |||
} | |||
बाद के C# संस्करणों (.NET फ्रेमवर्क 3.5 और ऊपर) में, निजी चर घोषित किए बिना, इस उदाहरण को संक्षिप्त रूप में निम्नानुसार किया जा सकता है <code>name</code>. | |||
< | बाद के C# संस्करणों (.NET फ्रेमवर्क 3.5 और ऊपर) में, निजी चर <code>name</code> घोषित किए बिना, इस उदाहरण को निम्नानुसार संक्षिप्त किया जा सकता है। | ||
public class Student | |||
{ | |||
public string Name { get; set; } | |||
} | |||
संक्षिप्त सिंटैक्स का उपयोग करने का अर्थ है कि अंतर्निहित चर अब कक्षा के अंदर से उपलब्ध नहीं है। नतीजतन, संपत्ति का <code>set</code> हिस्सा असाइनमेंट के लिए मौजूद होना चाहिए। एक्सेस को <code>set</code>-विशिष्ट एक्सेस संशोधक के साथ प्रतिबंधित किया जा सकता है। | |||
} | |||
</ | |||
public class Student | |||
{ | |||
public string Name { get; private set; } | |||
} | |||
{ | |||
} | |||
=== सामान्य लिस्प === | === सामान्य लिस्प === | ||
| Line 218: | Line 188: | ||
सीएलओएस के पास गुणों की कोई धारणा नहीं है, हालांकि कॉमन लिस्प ऑब्जेक्ट सिस्टम#मेटाओब्जेक्ट प्रोटोकॉल एक्सटेंशन निर्दिष्ट करता है कि स्लॉट के रीडर और लेखक फ़ंक्शन नामों तक पहुंचने के लिए, जिसमें से उत्पन्न होते हैं <code>:accessor</code> विकल्प।<ref name="mop-slot-definitions">{{cite web |url=http://www.lisp.org/mop/concepts.html#slot-definitions |title=MOP: Slot Definitions |accessdate=2011-03-29}}</ref> | सीएलओएस के पास गुणों की कोई धारणा नहीं है, हालांकि कॉमन लिस्प ऑब्जेक्ट सिस्टम#मेटाओब्जेक्ट प्रोटोकॉल एक्सटेंशन निर्दिष्ट करता है कि स्लॉट के रीडर और लेखक फ़ंक्शन नामों तक पहुंचने के लिए, जिसमें से उत्पन्न होते हैं <code>:accessor</code> विकल्प।<ref name="mop-slot-definitions">{{cite web |url=http://www.lisp.org/mop/concepts.html#slot-definitions |title=MOP: Slot Definitions |accessdate=2011-03-29}}</ref> | ||
निम्न उदाहरण इन स्लॉट विकल्पों और डायरेक्ट स्लॉट एक्सेस का उपयोग करके छात्र वर्ग की परिभाषा दिखाता है: | निम्न उदाहरण इन स्लॉट विकल्पों और डायरेक्ट स्लॉट एक्सेस का उपयोग करके छात्र वर्ग की परिभाषा दिखाता है: | ||
(defclass student () | |||
( | ((name :initarg :name :initform "" :accessor student-name) ; student-name is setf'able | ||
(birthdate :initarg :birthdate :initform 0 :reader student-birthdate) | |||
(number :initarg :number :initform 0 :reader student-number :writer set-student-number))) | |||
;; Example of a calculated property getter (this is simply a method) | |||
;; | (defmethod student-age ((self student)) | ||
(defmethod | (- (get-universal-time) (student-birthdate self))) | ||