المعلمة (برمجة الكمبيوتر)
في برمجة الكمبيوتر ، المعلمة أو الوسيطة الرسمية هي نوع خاص من المتغيرات المستخدمة في برنامج فرعي للإشارة إلى إحدى قطع البيانات المقدمة كمدخلات للبرنامج الفرعي. [أ] [1] هذه القطع من البيانات هي قيم [2] [3] [4] من الحجج (غالبًا ما تسمى الحجج الفعلية أو المعلمات الفعلية ) التي سيتم استدعاء البرنامج الفرعي بها. عادةً ما يتم تضمين قائمة مرتبة من المعلمات في تعريف البرنامج الفرعي ، بحيث يتم تقييم حججه لتلك المكالمة في كل مرة يتم فيها استدعاء البرنامج الفرعي، ويمكن تعيين القيم الناتجة للمعلمات المقابلة.
على عكس الحجة في الاستخدام الرياضي المعتاد، الحجة في علوم الكمبيوتر هي تعبير الإدخال الفعلي الذي يتم تمريره/تزويده إلى دالة أو إجراء أو روتين في بيان الاستدعاء/الاستدعاء، في حين أن المعلمة هي المتغير داخل تنفيذ البرنامج الفرعي. على سبيل المثال، إذا تم تعريف البرنامج addالفرعي على أنه def add(x, y): return x + y، فإن x, yالمعلمات، بينما إذا تم استدعاء هذا على أنه add(2, 3)، فإن المعلمات2, 3 هي الحجج. يمكن أن تكون المتغيرات (والتعبيرات عنها) من سياق الاستدعاء حججًا: إذا تم استدعاء البرنامج الفرعي على أنه، فإن a = 2; b = 3; add(a, b)المتغيرات هي الحجج، وليس القيم . راجع قسم المعلمات والحجج لمزيد من المعلومات.
a, b 2, 3
يتم تحديد الدلالات الخاصة بكيفية إعلان المعلمات وكيفية تمرير (قيمة) الحجج إلى معلمات البرامج الفرعية من خلال استراتيجية التقييم الخاصة باللغة، وتعتمد تفاصيل كيفية تمثيل ذلك في أي نظام كمبيوتر معين على اتفاقية الاستدعاء الخاصة بهذا النظام. في الحالة الأكثر شيوعًا، الاستدعاء بالقيمة ، تعمل المعلمة داخل البرنامج الفرعي كمتغير محلي جديد تم تهيئته بقيمة الحجة ( نسخة محلية (معزولة) من الحجة إذا كانت الحجة متغيرًا)، ولكن في حالات أخرى، على سبيل المثال الاستدعاء بالإشارة ، يمكن أن يتأثر متغير الحجة الذي يوفره المتصل بالإجراءات داخل البرنامج الفرعي المستدعى.
مثال
يحدد البرنامج التالي بلغة البرمجة C دالة تسمى "SalesTax" ولها معلمة واحدة تسمى "price". نوع السعر هو "double" (أي رقم فاصلة عائمة بدقة مزدوجة ). نوع إرجاع الدالة هو أيضًا double.
ضريبة المبيعات المزدوجة ( سعر مضاعف ) { إرجاع 0.05 * السعر ؛ }
بعد تعريف الوظيفة، يمكن استدعاؤها على النحو التالي:
ضريبة المبيعات ( 10.00 )؛
في هذا المثال، تم استدعاء الدالة باستخدام الوسيطة 10.00. وعندما يحدث هذا، سيتم تعيين 10.00 إلى السعر، وتبدأ الدالة في حساب نتيجتها. الخطوات اللازمة لإنتاج النتيجة محددة أدناه، محاطة بعلامة {}. 0.05 * priceيشير إلى أن أول شيء يجب القيام به هو ضرب 0.05 في قيمة السعر، مما يعطي 0.50. returnيعني أن الدالة ستنتج نتيجة 0.05 * price. وبالتالي، فإن النتيجة النهائية (مع تجاهل أخطاء التقريب المحتملة التي يواجهها المرء عند تمثيل الكسور العشرية ككسور ثنائية) هي 0.50.
المعاملات والحجج
قد يكون لمصطلحي المعلمة والحجة معاني مختلفة في لغات البرمجة المختلفة. في بعض الأحيان يتم استخدامهما بالتبادل، ويُستخدم السياق للتمييز بين المعنى. غالبًا ما يستخدم مصطلح المعلمة ( يُطلق عليه أحيانًا المعلمة الرسمية ) للإشارة إلى المتغير كما هو موجود في إعلان الوظيفة ، بينما يشير الوسيطة (يُطلق عليها أحيانًا المعلمة الفعلية ) إلى المدخلات الفعلية المقدمة في بيان استدعاء الوظيفة. على سبيل المثال، إذا عرّف أحدهم دالة على أنها ، فإن المعلمة تكون، وإذا تم استدعاؤها بواسطة فإن المعلمة تكون الحجة. المعلمة هي متغير (غير مقيد)، بينما يمكن أن تكون الحجة حرفيًا أو متغيرًا أو تعبيرًا أكثر تعقيدًا يتضمن أحرفًا ومتغيرات. في حالة الاستدعاء بالقيمة، فإن ما يتم تمريره إلى الوظيفة هو قيمة الحجة - على سبيل المثال، و هي مكالمات متكافئة - بينما في الاستدعاء بالإشارة، مع متغير كحجة، فإن ما يتم تمريره هو مرجع إلى هذا المتغير - على الرغم من أن بناء جملة استدعاء الوظيفة يمكن أن يظل كما هو. [5] سيتم وضع
مواصفات التمرير بالإشارة أو التمرير بالقيمة في إعلان الوظيفة و/أو التعريف.def f(x): ...xa = ...; f(a)af(2)a = 2; f(a)
تظهر المعلمات في تعريفات الإجراءات؛ وتظهر الوسائط في استدعاءات الإجراءات. في تعريف الدالة، يكون f(x) = x*xالمتغير x معلمة؛ وفي استدعاء الدالة، f(2)تكون القيمة 2 هي وسيطة الدالة. بشكل عام، تكون المعلمة نوعًا، وتكون الوسيطة مثيلًا.
المعلمة هي خاصية جوهرية للإجراء، متضمنة في تعريفه. على سبيل المثال، في العديد من اللغات، يتطلب إجراء لإضافة عددين صحيحين مُزودين معًا وحساب المجموع معلمتين، واحدة لكل عدد صحيح. بشكل عام، يمكن تعريف الإجراء بأي عدد من المعلمات، أو بدون معلمات على الإطلاق. إذا كان الإجراء يحتوي على معلمات، فإن الجزء من تعريفه الذي يحدد المعلمات يسمى قائمة المعلمات الخاصة به .
على النقيض من ذلك، فإن الوسائط هي التعبيرات [6] المقدمة للإجراء عند استدعائه، وعادة ما يكون هناك تعبير واحد يطابق أحد المعلمات. وعلى عكس المعلمات، التي تشكل جزءًا لا يتغير من تعريف الإجراء، قد تختلف الوسائط من استدعاء إلى استدعاء. في كل مرة يتم فيها استدعاء إجراء، يُطلق على جزء استدعاء الإجراء الذي يحدد الوسائط قائمة الوسائط .
على الرغم من أن المعلمات يشار إليها أيضًا عادةً باسم الوسائط، إلا أنه يُنظر إلى الوسائط أحيانًا على أنها القيم الفعلية أو المراجع المعينة لمتغيرات المعلمات عند استدعاء البرنامج الفرعي في وقت التشغيل . عند مناقشة التعليمات البرمجية التي تستدعي برنامجًا فرعيًا، فإن أي قيم أو مراجع يتم تمريرها إلى البرنامج الفرعي هي الوسائط، والمكان في التعليمات البرمجية حيث يتم إعطاء هذه القيم أو المراجع هو قائمة المعلمات . عند مناقشة التعليمات البرمجية داخل تعريف البرنامج الفرعي، فإن المتغيرات في قائمة معلمات البرنامج الفرعي هي المعلمات، بينما قيم المعلمات في وقت التشغيل هي الوسائط. على سبيل المثال، في لغة C، عند التعامل مع الخيوط، من الشائع تمرير وسيطة من النوع void* وتحويلها إلى نوع متوقع:
void ThreadFunction ( void * pThreadArgument ) { // تسمية المعلمة الأولى بـ 'pThreadArgument' صحيحة، وليس // 'pThreadParameter'. في وقت التشغيل، تكون القيمة التي نستخدمها عبارة عن وسيطة. كما هو مذكور أعلاه، احتفظ بمصطلح المعلمة عند مناقشة تعريفات البرامج الفرعية. }
لفهم الفرق بشكل أفضل، ضع في اعتبارك الوظيفة التالية المكتوبة بلغة C :
int Sum ( int addend1 ، int addend2 ) { إرجاع addend1 + addend2 ؛ }
تحتوي الدالة Sum على معاملين، هما addend1 و addend2 . وهي تضيف القيم التي تم تمريرها إلى المعاملات، وتعيد النتيجة إلى المتصل بالبرنامج الفرعي (باستخدام تقنية يوفرها تلقائيًا مُجمِّع C).
قد يبدو الكود الذي يستدعي دالة المجموع مثل هذا:
int value1 = 40 ؛ int value2 = 2 ؛ int sum_value = Sum ( value1 ، value2 )؛
يتم تهيئة المتغيرين value1 و value2 بالقيم. كل من value1 و value2 عبارة عن وسيطات لدالة المجموع في هذا السياق.
في وقت التشغيل، يتم تمرير القيم المعينة لهذه المتغيرات إلى الدالة Sum كحجج. في الدالة Sum ، يتم تقييم المعلمات addend1 و addend2 ، مما ينتج عنه الحجج 40 و2 على التوالي. تتم إضافة قيم الحجج، ويتم إرجاع النتيجة إلى المتصل، حيث يتم تعيينها إلى المتغير sum_value .
بسبب الاختلاف بين المعلمات والحجج، من الممكن توفير حجج غير مناسبة لإجراء ما. قد توفر المكالمة عددًا كبيرًا جدًا أو قليلًا جدًا من الحجج؛ أو قد تكون إحدى الحجج أو أكثر من نوع خاطئ؛ أو قد يتم توفير الحجج بالترتيب الخاطئ. يتسبب أي من هذه المواقف في عدم تطابق بين قوائم المعلمات والحجج، وغالبًا ما يعيد الإجراء إجابة غير مقصودة أو يولد خطأ وقت التشغيل .
اتفاقية بديلة في إيفل
في إطار طريقة تطوير البرمجيات ولغة إيفل ، فإن مصطلحي الحجة والمعلمة لهما استخدامات مميزة تم تحديدها بموجب الاتفاقية. يُستخدم مصطلح الحجة حصريًا في الإشارة إلى مدخلات الروتين، [7] ويُستخدم مصطلح المعلمة حصريًا في معلمة النوع للفئات العامة . [8]
خذ بعين الاعتبار التعريف الروتيني التالي:
المجموع ( addend1 : INTEGER ؛ addend2 : INTEGER ): INTEGER النتيجة : = addend1 + addend2 النهاية
يأخذ الروتين sumوسيطتين addend1و ، والتي تسمى الوسيطات الرسميةaddend2 للروتين . تحدد المكالمة إلى الوسيطات الفعلية ، كما هو موضح أدناه مع و .
sumvalue1value2
sum_value : عدد صحيح value1 : عدد صحيح = 40 value2 : عدد صحيح = 2 … sum_value := sum ( value1 , value2 )
تعتبر المعلمات أيضًا إما رسمية أو فعلية . تُستخدم المعلمات العامة الرسمية في تعريف الفئات العامة. في المثال أدناه، HASH_TABLE يتم إعلان الفئة كفئة عامة تحتوي على معلمتين عامتين رسميتين، Gتمثلان البيانات ذات الأهمية وتمثلان Kمفتاح التجزئة للبيانات:
الفئة HASH_TABLE [ G , K -> HASHABLE ] …
عندما تصبح الفئة عميلاً لـ HASH_TABLE، يتم استبدال المعلمات العامة الرسمية بمعلمات عامة فعلية في اشتقاق عام . في إعلان السمة التالي، my_dictionaryسيتم استخدامه كقاموس قائم على سلسلة أحرف . وبالتالي، يتم استبدال كل من المعلمات العامة الرسمية للبيانات والمفتاح بمعلمات عامة فعلية من النوع STRING.
قاموسي : جدول التجزئة [ سلسلة ، سلسلة ]
أنواع البيانات
في لغات البرمجة ذات النوع القوي ، يجب تحديد نوع كل معلمة في إعلان الإجراء. تحاول اللغات التي تستخدم استدلال النوع اكتشاف الأنواع تلقائيًا من نص الوظيفة واستخدامها. تؤجل لغات البرمجة ذات النوع الديناميكي حل النوع حتى وقت التشغيل. لا تقوم اللغات ذات النوع الضعيف بحل النوع أو القليل منه، وتعتمد بدلاً من ذلك على المبرمج للحصول على الدقة.
تستخدم بعض اللغات كلمة رئيسية خاصة (على سبيل المثال void ) للإشارة إلى أن البرنامج الفرعي ليس له أي معلمات؛ في نظرية النوع الرسمية ، تأخذ مثل هذه الوظائف قائمة معلمات فارغة (نوعها ليس void ، بل unit ).
تمرير الحجة
تعتمد الآلية الدقيقة لتعيين الوسائط للمعلمات، والتي تسمى تمرير الوسائط ، على استراتيجية التقييم المستخدمة لتلك المعلمة (عادةً الاستدعاء بالقيمة )، والتي يمكن تحديدها باستخدام الكلمات الأساسية.
الحجج الافتراضية
تسمح بعض لغات البرمجة مثل Ada و C++ و Clojure و Common Lisp و [9] Fortran 90 و [ 10] Python و Ruby و Tcl و Windows PowerShell بإعطاء وسيطة افتراضية صراحةً أو ضمنيًا في إعلان البرنامج الفرعي . يسمح هذا للمتصل بحذف تلك الوسيطة عند استدعاء البرنامج الفرعي. إذا تم إعطاء الوسيطة الافتراضية صراحةً، فسيتم استخدام تلك القيمة إذا لم يقدمها المتصل. إذا كانت الوسيطة الافتراضية ضمنية (أحيانًا باستخدام كلمة رئيسية مثل Optional )، فإن اللغة توفر قيمة معروفة (مثل null و Empty وzero وسلسلة فارغة وما إلى ذلك) إذا لم يقدم المتصل قيمة.
مثال PowerShell:
دالة doc ( $g = 1.21 ) { "$g جيجاوات؟ $g جيجاوات؟ رائع سكوت ! " }
PS > 1.21 جيجاوات
؟ 1.21 جيجاوات؟ رائع يا سكوت!
PS > doc 88
88 جيجاوات؟ 88 جيجاوات؟ رائع يا سكوت!
يمكن اعتبار الوسائط الافتراضية بمثابة حالة خاصة لقائمة الوسائط ذات الطول المتغير.
قوائم المعلمات ذات الطول المتغير
تسمح بعض اللغات بتعريف البرامج الفرعية لقبول عدد متغير من الوسائط . بالنسبة لهذه اللغات، يجب أن تتكرر البرامج الفرعية خلال قائمة الوسائط.
مثال PowerShell:
دالة marty {
$args | foreach { "العودة إلى العام $_" }
}
PS > marty 1985
العودة إلى عام 1985
PS > marty 2015 1985 1955
العودة إلى عام 2015
العودة إلى عام 1985
العودة إلى عام 1955
المعلمات المسماة
تسمح بعض لغات البرمجة — مثل Ada و Windows PowerShell — للبرامج الفرعية بأن يكون لها معلمات مسماة . وهذا يسمح لكود الاستدعاء بأن يكون أكثر توثيقًا ذاتيًا . كما يوفر مرونة أكبر للمتصل، وغالبًا ما يسمح بتغيير ترتيب الوسائط، أو حذف الوسائط حسب الحاجة.
مثال PowerShell:
دالة jennifer ( $adjectiveYoung , $adjectiveOld ) {
"جينيفر الشابة: أنا $adjectiveYoung!"
"جينيفر العجوز: أنا $adjectiveOld!"
}
PS > جينيفر "جديدة" "ذات خبرة"
جينيفر الشابة: أنا جديدة!
جينيفر العجوز: أنا ذات خبرة!
PS > jennifer - صفة Old 'experienced' - صفة Young 'fresh'
جينيفر الشابة: أنا جديدة!
جينيفر العجوز: أنا ذات خبرة!
المعلمات المتعددة في اللغات الوظيفية
في حساب لامدا ، تحتوي كل دالة على معلمة واحدة فقط. ما يُعتقد أنه دوال ذات معلمات متعددة يتم تمثيله عادةً في حساب لامدا كدالة تأخذ الوسيطة الأولى، وتعيد دالة تأخذ بقية الحجج؛ هذا تحويل يُعرف باسم currying . تتبع بعض لغات البرمجة، مثل ML و Haskell ، هذا المخطط. في هذه اللغات، تحتوي كل دالة على معلمة واحدة فقط، وما قد يبدو وكأنه تعريف لدالة ذات معلمات متعددة، هو في الواقع سكر نحوي لتعريف دالة تعيد دالة، إلخ. يكون تطبيق الدالة ارتباطيًا يساريًا في هذه اللغات وكذلك في حساب لامدا، لذا فإن ما يبدو وكأنه تطبيق لدالة على حجج متعددة يتم تقييمه بشكل صحيح على أنه الدالة المطبقة على الوسيطة الأولى، ثم الدالة الناتجة المطبقة على الوسيطة الثانية، إلخ.
معلمات الإخراج
معلمة الإخراج ، والمعروفة أيضًا باسم معلمة الإخراج أو معلمة الإرجاع ، هي معلمة تستخدم للإخراج، بدلاً من الاستخدام الأكثر شيوعًا للإدخال. يعد استخدام معلمات الاستدعاء بالمرجع ، أو معلمات الاستدعاء بالقيمة حيث تكون القيمة مرجعًا، كمعلمات إخراج عبارة اصطلاحية في بعض اللغات، ولا سيما C وC++، [b] بينما تحتوي لغات أخرى على دعم مدمج لمعلمات الإخراج. تشمل اللغات التي تحتوي على دعم مدمج لمعلمات الإخراج Ada [11] (انظر برامج Ada الفرعية)، وFortran (منذ Fortran 90 ؛ انظر "نية" Fortran)، وملحقات إجرائية مختلفة لـ SQL ، مثل PL/SQL (انظر وظائف PL/SQL ) [12] و Transact-SQL ، و C# [13] و. NET Framework ، [14] وSwift ، [15] ولغة البرمجة النصية TScript (انظر إعلانات وظائف TScript ).
وبصورة أكثر دقة، يمكننا التمييز بين ثلاثة أنواع من المعلمات أو أوضاع المعلمات :معلمة الإدخال s،ومعلمات الإخراج،ومعلمات الإدخال/الإخراج s؛وغالبًا ما يشار إليها بـin,out, وin outأوinout. يجب أن تكون وسيطة الإدخال (الوسيطة لمعلمة الإدخال) قيمة، مثل متغير مبدئي أو حرفي، ويجب ألا يتم إعادة تعريفها أو تعيينها إليها؛ يجب أن تكون وسيطة الإخراج متغيرًا قابلًا للتعيين، ولكن لا يلزم تهيئته، ولا يمكن الوصول إلى أي قيمة موجودة، ويجب تعيين قيمة لها؛ ويجب أن تكون وسيطة الإدخال/الإخراج متغيرًا مبدئيًا وقابلًا للتعيين، ويمكن تعيين قيمة لها اختياريًا. تختلف المتطلبات الدقيقة والتنفيذ بين اللغات - على سبيل المثال، فيAda 83لا يمكن تعيين معلمات الإخراج إلا، وليس قراءتها، حتى بعد التعيين (تمت إزالة هذا فيAda 95لإزالة الحاجة إلى متغير تراكمي مساعد). هذه مماثلة لمفهوم القيمةفيتعبير ما كونها قيمة r (لها قيمة)، أو قيمة l (يمكن تخصيصها)، أو قيمة r/قيمة l (لها قيمة ويمكن تخصيصها)، على التوالي، على الرغم من أن هذه المصطلحات لها معاني متخصصة في لغة C.
في بعض الحالات، يتم التمييز بين الإدخال والإدخال/الإخراج فقط، مع اعتبار الإخراج استخدامًا محددًا للإدخال/الإخراج، وفي حالات أخرى يتم دعم الإدخال والإخراج فقط (ولكن ليس الإدخال/الإخراج). يختلف الوضع الافتراضي بين اللغات: في Fortran 90 يكون الإدخال/الإخراج افتراضيًا، بينما في C# وامتدادات SQL يكون الإدخال افتراضيًا، وفي TScript يتم تحديد كل معلمة صراحةً كمدخل أو مخرج.
من الناحية النحوية، يتم الإشارة إلى وضع المعلمة عادةً باستخدام كلمة أساسية في إعلان الوظيفة، كما هو الحال void f(out int x)في C#. عادةً ما يتم وضع معلمات الإخراج في نهاية قائمة المعلمات لتمييزها بوضوح، على الرغم من عدم اتباع هذا دائمًا. يستخدم TScript نهجًا مختلفًا، حيث يتم سرد معلمات الإدخال في إعلان الوظيفة، ثم معلمات الإخراج، مفصولة بعلامة النقطتين (:) ولا يوجد نوع إرجاع للوظيفة نفسها، كما هو الحال في هذه الوظيفة، التي تحسب حجم جزء نصي:
TextExtent ( WString text ، Font font : Integer width ، Integer height )
أوضاع المعلمات هي شكل من أشكال الدلالات الإشارية ، حيث توضح نية المبرمج وتسمح للمترجمين باكتشاف الأخطاء وتطبيق التحسينات - فهي لا تعني بالضرورة الدلالات التشغيلية (كيف يحدث تمرير المعلمات بالفعل). والجدير بالذكر أنه في حين يمكن تنفيذ معلمات الإدخال عن طريق الاستدعاء بالقيمة، ومعلمات الإخراج والإدخال/الإخراج عن طريق الاستدعاء بالإشارة - وهذه طريقة مباشرة لتنفيذ هذه الأوضاع في اللغات التي لا تحتوي على دعم مدمج - إلا أن هذه ليست الطريقة التي يتم بها تنفيذها دائمًا. تمت مناقشة هذا التمييز بالتفصيل في Ada '83 Rationale، والذي يؤكد أن وضع المعلمات يتم تجريده من آلية تمرير المعلمات (عن طريق الإشارة أو النسخ) التي يتم تنفيذها بالفعل. [11] على سبيل المثال، بينما في C# يتم تمرير معلمات الإدخال (افتراضيًا، بدون كلمة أساسية) بالقيمة، ويتم تمرير معلمات الإخراج والإدخال/الإخراج ( outو ref) بالإشارة، في PL/SQL INيتم تمرير معلمات الإدخال ( ) بالإشارة، ويتم تمرير معلمات الإخراج والإدخال/الإخراج ( OUTو IN OUT) افتراضيًا بالقيمة ويتم نسخ النتيجة مرة أخرى، ولكن يمكن تمريرها بالإشارة باستخدام NOCOPYتلميح المترجم. [16]
إن البنية النحوية المشابهة لمعلمات الإخراج هي تعيين قيمة الإرجاع إلى متغير يحمل نفس اسم الدالة. وهذا موجود في Pascal و Fortran 66 و Fortran 77 ، كما هو الحال في مثال Pascal هذا:
الدالة f ( x , y : عدد صحيح ) : عدد صحيح ؛ البداية f := x + y ؛ النهاية ؛
يختلف هذا دلاليًا حيث أنه عند استدعائه، يتم تقييم الوظيفة ببساطة - لا يتم تمرير متغير من نطاق الاستدعاء لتخزين الإخراج فيه.
يستخدم
الاستخدام الأساسي لمعلمات الإخراج هو إرجاع قيم متعددة من دالة، في حين أن استخدام معلمات الإدخال/الإخراج هو تعديل الحالة باستخدام تمرير المعلمات (بدلاً من البيئة المشتركة، كما هو الحال في المتغيرات العالمية). أحد الاستخدامات المهمة لإرجاع قيم متعددة هو حل مشكلة شبه المسند لإرجاع كل من القيمة وحالة الخطأ - راجع مشكلة شبه المسند: الإرجاع متعدد القيم .
على سبيل المثال، لإرجاع متغيرين من دالة في لغة C، يمكننا أن نكتب:
عرض int ارتفاع int ؛
F ( x ، & العرض ، & الارتفاع )؛
حيث xأن معامل الإدخال و widthو heightهما معاملا الإخراج.
من حالات الاستخدام الشائعة في لغة C واللغات ذات الصلة معالجة الاستثناءات ، حيث تضع الدالة قيمة الإرجاع في متغير إخراج، وتعيد قيمة منطقية تتوافق مع نجاح الدالة أو فشلها. ومن الأمثلة النموذجية على ذلك TryParseالطريقة في .NET، وخاصةً C#، والتي تحلل سلسلة إلى عدد صحيح، وترجع trueفي حالة النجاح وفي falseحالة الفشل. وهذا له التوقيع التالي: [17]
public static bool TryParse ( سلسلة s ، نتيجة out int )
ويمكن استخدامها على النحو التالي:
int النتيجة ؛ إذا لم يكن ( Int32.TryParse ( s , result )) { // معالجة الاستثناءات }
تنطبق اعتبارات مماثلة على إرجاع قيمة من أحد الأنواع العديدة المحتملة، حيث يمكن لقيمة الإرجاع تحديد النوع ثم يتم تخزين القيمة في أحد متغيرات الإخراج العديدة.
العيوب
غالبًا ما يتم تثبيط معلمات الإخراج في البرمجة الحديثة، وذلك لأنها في الأساس محرجة ومربكة ومنخفضة المستوى للغاية - حيث تكون قيم الإرجاع الشائعة أسهل بكثير في الفهم والعمل بها. [18] والجدير بالذكر أن معلمات الإخراج تنطوي على وظائف ذات آثار جانبية (تعديل معلمة الإخراج) وهي متشابهة دلاليًا مع المراجع، والتي تكون أكثر إرباكًا من الوظائف والقيم البحتة، ويمكن أن يكون التمييز بين معلمات الإخراج ومعلمات الإدخال / الإخراج دقيقًا. علاوة على ذلك، نظرًا لأن معظم المعلمات في أنماط البرمجة الشائعة هي ببساطة معلمات إدخال، فإن معلمات الإخراج ومعلمات الإدخال / الإخراج غير عادية وبالتالي فهي عرضة لسوء الفهم.
تمنع معلمات الإخراج والإدخال/الإخراج تكوين الوظيفة ، حيث يتم تخزين الإخراج في متغيرات، وليس في قيمة تعبير. وبالتالي، يجب في البداية إعلان متغير، ثم يجب أن تكون كل خطوة من سلسلة الوظائف عبارة منفصلة. على سبيل المثال، في C++ تكوين الوظيفة التالي:
الكائن obj = G ( y , F ( x ));
عند كتابتها مع معلمات الإخراج والإدخال/الإخراج تصبح بدلاً من ذلك (لأنها Fمعلمة إخراج، لمعلمة Gإدخال/إخراج):
الكائن obj ؛ F ( x ، & obj )؛ G ( y ، & obj )؛
في الحالة الخاصة للوظيفة ذات معلمة إخراج أو إدخال/إخراج واحدة ولا توجد قيمة إرجاع، يكون تكوين الوظيفة ممكنًا إذا تم أيضًا إرجاع معلمة الإخراج أو الإدخال/الإخراج (أو في C/C++، عنوانها) بواسطة الوظيفة، وفي هذه الحالة يصبح ما سبق:
كائن obj ؛ G ( y ، F ( x ، & obj ));
البدائل
هناك بدائل مختلفة لحالات استخدام معلمات الإخراج.
لإرجاع قيم متعددة من دالة، هناك بديل وهو إرجاع مجموعة . من الناحية النحوية، يكون هذا الأمر أكثر وضوحًا إذا كان من الممكن استخدام فك تسلسل تلقائي وتعيين موازٍ ، كما هو الحال في Go أو Python، مثل:
def f ():
إرجاع 1 ، 2
أ ، ب = f ()
لإرجاع قيمة من أحد الأنواع العديدة، يمكن استخدام اتحاد مُوسوم بدلاً من ذلك؛ الحالات الأكثر شيوعًا هي الأنواع القابلة للعدم ( أنواع الخيار )، حيث يمكن أن تكون قيمة الإرجاع فارغة للإشارة إلى الفشل. لمعالجة الاستثناءات، يمكن للمرء إرجاع نوع قابل للعدم، أو إثارة استثناء. على سبيل المثال، في بايثون قد يكون لديك إما:
النتيجة = تحليل ( s )
إذا كانت النتيجة لا شيء : # معالجة الاستثناءات
أو بشكل أكثر اصطلاحا:
حاول :
النتيجة = تحليل ( s )
باستثناء ParseError :
# معالجة الاستثناءات
يمكن أيضًا تطبيق التحسين الدقيق المتمثل في عدم الحاجة إلى متغير محلي ونسخ العائد عند استخدام متغيرات الإخراج على الوظائف التقليدية وقيم الإرجاع بواسطة مُجمِّعين متطورين بدرجة كافية.
البديل المعتاد لمعلمات الإخراج في لغة C واللغات ذات الصلة هو إرجاع بنية بيانات واحدة تحتوي على جميع قيم الإرجاع. [13] على سبيل المثال، نظرًا لبنية تغلف العرض والارتفاع، يمكن للمرء أن يكتب:
العرض والارتفاع width_and_height = F ( x );
في اللغات الموجهة للكائنات، بدلاً من استخدام معلمات الإدخال/الإخراج، يمكن للمرء غالبًا استخدام استدعاء بالمشاركة ، وتمرير مرجع إلى كائن ثم تحوير الكائن، رغم عدم تغيير الكائن الذي يشير إليه المتغير. [18]
انظر أيضا
ملحوظات
- ^ في هذه المقالة، يشير مصطلح "البرنامج الفرعي" إلى أي بنية تشبه البرنامج الفرعي، والتي لها أسماء مختلفة ومعاني مختلفة قليلاً اعتمادًا على لغة البرمجة التي تتم مناقشتها.
- ^ يتم استدعاء كل من C وC++ بالقيمة، ولكن إذا كان النوع عبارة عن مرجع (مؤشر C/C++ أو مرجع C++)، فيمكن استخدام تعيين قيمة المرجع لإنتاج سلوك نمط الاستدعاء بالمرجع.
مراجع
- ^ "تمرير المعلومات إلى طريقة أو منشئ (تعلم لغة Java > الفئات والكائنات)". دروس Java™ . تم الاسترجاع في 2021-09-09 .
تشير المعلمات إلى قائمة المتغيرات في إعلان الطريقة. الوسائط هي القيم الفعلية التي يتم تمريرها عند استدعاء الطريقة. عند استدعاء طريقة، يجب أن تتطابق الوسائط المستخدمة مع معلمات الإعلان من حيث النوع والترتيب.
- ^ براتا ، ستيفن (2004). C التمهيدي زائد (الطبعة الخامسة). سامز. ص 276-277. رقم ISBN 978-0-672-32696-7.
- ^ "مسودة عمل، معيار لغة البرمجة C++" (PDF) . المعايير المفتوحة . 2005-10-19. مؤرشف من الأصل (PDF) في 14 ديسمبر 2005. تم الاسترجاع 1 يناير 2018 .
- ^ جوردون، آرون. "البرامج الفرعية وتمرير المعاملات". rowdysites.msudenver.edu/~gordona . مؤرشف من الأصل في 1 يناير 2018 . تم الاسترجاع في 1 يناير 2018 .[ رابط معطل ]
- ^ دولارد، كاثلين. "تمرير الحجج حسب القيمة والمرجع (Visual Basic)". Microsoft Learn . تم الاسترجاع في 2018-10-27 .
- ^ "دليل برمجة GNU C". crasseux.com . تم الاسترجاع في 2018-10-27 .
- ^ ماير، برتراند. بناء البرمجيات الموجهة للكائنات ، الطبعة الثانية، برنتيس هول، 1997، ص 444.
- ^ ماير، ص 96.
- ^ "الوظائف". gigamonkeys.com . تم الاسترجاع في 2021-06-02 .
- ^ "الحجج الاختيارية". www.netlib.org . تم الاسترجاع في 2021-06-02 .
- ^ ab 8.2 أوضاع المعلمات، "الأساس المنطقي لتصميم لغة برمجة Ada®"
- ^ 8. البرامج الفرعية PL/SQL: تحديد أوضاع معلمات البرامج الفرعية
- ^ من تأليف بيتر هالام. "لماذا تحتوي لغة C# على كل من 'ref' و'out'؟". مؤرشف من الأصل في 2011-09-26.
- ^ تعداد اتجاه المعلمة
- ^ الوظائف — لغة البرمجة سويفت (سويفت 4.2)
- ^ 8. برامج فرعية PL/SQL: تمرير هياكل البيانات الكبيرة باستخدام تلميح المترجم NOCOPY
- ^ طريقة Int32.TryParse (سلسلة، Int32)
- ^ ab CA1021: تجنب المعلمات الخارجية
