**"هل يجب تجنب استخدام `global` في بايثون؟"**

“هل يجب تجنب استخدام global في بايثون؟” :face_with_monocle::fire:

مقدمة

في لغة بايثون، توجد الكلمة المفتاحية global التي تتيح لك الوصول إلى المتغيرات المعرفة خارج الدالة من داخلها. على الرغم من أنها تبدو أداة مفيدة، إلا أن استخدامها يثير الكثير من الجدل بين المبرمجين، حيث يعتقد البعض أنها ضرورية في بعض الحالات، بينما يراها آخرون خطأً يجب تجنبه دائمًا!

ما هي global وكيف تعمل؟

عندما تقوم بتعريف متغير داخل دالة، فإن بايثون يعتبره تلقائيًا متغيرًا محليًا (local) ولا يؤثر على المتغيرات الخارجية. ولكن باستخدام global، يمكنك تعديل المتغيرات الخارجية من داخل الدالة.

مثال على استخدام global

x = 10  # متغير عالمي

def update_x():
    global x  # الإشارة إلى أننا نريد تعديل المتغير العالمي x
    x += 5

update_x()
print(x)  # الناتج: 15

بدون global، سيعطي هذا الكود خطأ لأن x داخل الدالة سيُعتبر متغيرًا محليًا، وليس له علاقة بالمتغير العالمي.

لماذا يعتبر استخدام global مثيرًا للجدل؟

:white_check_mark: متى يكون global مفيدًا؟

  • عند الحاجة إلى مشاركة حالة (State) معينة بين الدوال دون استخدام كائنات أو تمرير المتغيرات كمعاملات.
  • في بعض البرامج الصغيرة أو السكريبتات السريعة حيث يكون تعريف كائنات إضافية معقدًا وغير ضروري.

:x: لماذا يعتبر البعض global ممارسة سيئة؟

  1. يجعل الكود غير متوقع :dizzy_face:
    عندما تقوم دالة بتغيير متغير عالمي، قد يصبح الكود غير واضح لأنه يمكن تعديل قيمة المتغير من أي مكان في البرنامج، مما يجعل تتبع الأخطاء أمرًا صعبًا.

  2. يؤدي إلى مشاكل عند العمل في فرق برمجية :office:
    إذا كنت تعمل مع فريق من المبرمجين، فقد يقوم أحدهم بتغيير متغير عالمي دون قصد، مما يؤدي إلى أخطاء غير متوقعة يصعب تصحيحها.

  3. يقتل مبدأ البرمجة الوظيفية (Functional Programming) :rocket:
    البرمجة الوظيفية تعتمد على أن الدوال تأخذ مدخلات وتُخرج نتائج دون التأثير على متغيرات خارجية، واستخدام global يخالف هذا المبدأ.

بدائل استخدام global

:white_check_mark: تمرير المتغير كمعامل إلى الدالة

بدلًا من استخدام global، يمكنك تمرير المتغير كمعامل ثم إرجاع القيمة الجديدة:

x = 10

def update_x(value):
    return value + 5

x = update_x(x)
print(x)  # الناتج: 15

:white_check_mark: استخدام كائنات (Classes) للحفاظ على الحالة

إذا كنت بحاجة إلى حالة قابلة للتعديل عبر عدة دوال، فمن الأفضل استخدام كائنات:

class Data:
    def __init__(self):
        self.x = 10

    def update_x(self):
        self.x += 5

data = Data()
data.update_x()
print(data.x)  # الناتج: 15

خاتمة: هل يجب تجنب global تمامًا؟

global ليست شريرة تمامًا، ولكن استخدامها يجب أن يكون محدودًا جدًا، ويفضل دائمًا البحث عن بدائل مثل تمرير القيم كمعاملات أو استخدام كائنات للحفاظ على الحالة. إذا كنت تبني برنامجًا صغيرًا أو سكريبتًا بسيطًا، فقد يكون استخدام global مقبولًا، ولكن في المشاريع الكبيرة، يجب تجنبها تمامًا للحفاظ على وضوح الكود وقابليته للصيانة.

:fire: السؤال لك الآن: هل تعتقد أن global أداة مفيدة أم أنها عادة برمجية سيئة؟ :thinking::speech_balloon:

7 إعجابات

جزاك الله خيرا علي هذه المعلومات المفيدة

إعجابَين (2)

دائماً مفيد
شكراً جزيلاً :rose:

4 إعجابات

انا استخدمتها في الالعاب اللي عملناها في الكورس لاني كنت محتاجة اعدل قيمة المتغير اللي يوقف الloop من داخل function و ملقتش طريقة تانية الحقيقة تخليني اعمل ده و اكيد طبعا فكرة انك تعدل قيمة متغير في أي مكان دي هتلخبط بالذات لو اكتر من مبرمج شغال علي الكود

3 إعجابات

كلامك صحيح ولا يتعارض مع المنشور بالتوفيق

3 إعجابات

شكرا علي المنشورات المفيده ربنا يزيد حضرتك من علمه

إعجابَين (2)