الفصل الرابع :الدوال Functions
ماهى الدالة Function ؟ ومالفرق بينها وبين الطريقة Method ؟
الدالة هي مجموعة من التعبيرات ويمكن إستخدامها اكثر من مرة ..
الفرق بينها وبين الطريقة هو مجرد تسمية فقط لأن الطريقة هى هى ال الدالة لكن يطلق عليها ذلك لأنها تكون جزء من كائن

مثال .. نحن لسبب ما نريد أن نكتب:
This program is written by: ahmed youssef
فى بداية البرنامج مثلا وإذا فى إختيار لل help نضمنها فيه وهكذا .. يعنى سنستخدمها أكثر من مرة جميل ؟
فأفضل حل هو إننا نعمل دالة بتمثل السطر هذا ونقدر أن نستخدمها أكثر من مرة ، وسيبقى علينا التعديل سهل، فبدل أن نعدل فى كل جزء فى البرنامج .. نعدل فى الدالة فقط !
#The start
puts "This program is written by: ahmed youssef"
#The help block
puts "This program is written by: ahmed youssef"
#Another block
puts "This program is written by: ahmed youssef"
#The end
puts "This program is written by: ahmed youssef"
تخيل هذا، إنه ليس منطقي نهائيا بأن تكرر بهذا الشكل... و زد على ذلك إذا رغبت بأن تعدل جزئية معينة ستضطر بأن تعدل في أكثر من مكان ... أليس كذلك؟
فالحل المثالى هو أن تعمل دالة تعبر عن مجموعة من الأوامر التي تريد أن تنفذها، مثلا:
def about()
puts "This program is written by: ahmed youssef"
end
فتخيل الكود سيتحول للصورة التالية .. فإذا احتجت أن تعدل فى مجموعة الأوامر ، فإن ستعدل على مجموعة الأوامر الموجود فى الدالة:
#The start
about()
#The help block
about()
#Another block
about()
#The end
about()
نحن اتفقنا إن الدالة نجعلها تنفذ مجموعة من الأوامر في كل مرة نستدعيها ..
مثلا نريد أن نعمل دالة تطبع لنا كلمة Hi 3 مرات
def sayHi3Times()
3.times do
puts "Hi"
end
end
لاحظ 3.times سنتعرض لها لما نشرح ال times ، ولكن إفهمها مجموعة الأوامر التي تأتي بعدها نريدها أن تنفذ 3 مرات .. إذا استصعبتها، حاليا حول الكود للتالي:
def sayHi3Times()
puts "Hi"
puts "Hi"
puts "Hi"
end
إستدعينا الدالة ل 3 مرات مثلا
sayHi3Times
sayHi3Times
sayHi3Times
سينفذ الأوامر التي تحويها الدالة 3 مرات:
Output:
Hi
Hi
Hi
Hi
Hi
Hi
Hi
Hi
Hi
جميل .. لحد الآن كل الذي تعرفه عن الدوال خطأ 100%

الذي تعاملت معه يسمى إجراء Procedure – مبرمجين Pascal بكل تأكيد يفهمونني-
الإجراء هو مجموعة من الأوامر تنفذ ولكن ليس لها عائد return !
ولكن ماذا تعني return أو العائد :S ؟
def areaOfSquare
side=4
area=side*side
return area #The value returned from the function.
end
theArea=areaOfSquare #area
puts theArea
لاحظ إن مجموعة الأوامر الخاصة بالدالة areaOfSquare يرجع قيمة ، وهى قيمة ال area
لاحظ إننا استطعنا أن نسند الدالة لـ theArea .. لكن الذي حصل هو أننا أسندنا القيمة العائدة من الدالة - ال returned value – إلى theArea
على كل، لما تكلم الناس كلمهم بكلمة الدالة، ولا تقحم كلمة إجراء إلا إذا احتاجها فعلا
فى بعض اللغات التي لا تفرق بين الإجراء والدالة مثل ال C/Ruby .. إلخ فيعتبروا أن الإجراء ماهو إلا دالة ولكن ليس لها عائد.
لاحظ مشكلة بالكود أو قل شيء ليس جيد، وهو أننا فارضين أن طول side فى المربع ب 4، فنحن نريد أن نحدد قيمة ال Side لأنه ليس من المعقول أن نكتب مليون دالة فيها قيمة side مختلفة.أليس كذلك ؟
def areaOfSquare(side)
area=side*side
return area #The value returned from the function.
end
theArea=areaOfSquare(5) #area
puts theArea
اى حاجة تريد أن تتحكم في قيمتها وهى بتسند للدالة اجعلها Parameter وهنا ال parameter هو ال side
لاحظ في:
ال 5 هى قيمة ال side ولكن هنا إسمها argument !
ماذا Parameter و Argument ؟
بكل بساطة ال Parameter هى القيمة التي تحدد أنت وترسل إلى الدالة، لكن ال Argument هى القيمة اللى أرسلت إلى الدالة ، بمعنى أن ال parameter هو side
وال Argument هى 5
الدوال المبنية
وهى دوال تقدمها لك اللغة نفسها ، وفي حالتنا الآ هى Ruby
وهى عبارة عن أكواد جاهزة ، وتستطيع أن تستخدمها مباشرة:
print("Enter your name: ") #Builtin-Function to display an object (to_s)
name=gets #Builtin-function to read a string from the standard input.
puts "Hello, "+ name
print هى دالة مثل put تستخدم فى طباعة سلسلة نصية على الشاشة ولكن لا تضيف إليها سطر جديد ..
تلميح : جرب الكود السابق مع puts وستفهم قصدى

gets هى دالة ايضا تستخدم فى قراءة string من الstdin
تعطينا Hello مدمجة مع ال name .. سنتعرض لل Concatenation بالتفصيل إن شاء الله لاحقا