5 أمثلة على أفضل استخدامات روبي
هل تساءلت يومًا ما الذي يمكننا فعله مع روبي؟ حسناً، ربما تكون السماء هي الحد الأقصى، ولكن يسعدنا أن نتحدث عن بعض الحالات المعروفة بشكل أو بآخر...
قبل أن نبدأ في إنشاء طريقة الانفجار، دعنا نتعرف على ماهية هذا النوع من الطرق بالضبط وما هي خصائصها. لنبدأ بحقيقة أنه لا يوجد تعريف واضح لهذا النوع من الطرق. ببساطة، طريقة الانفجار هي طريقة بها علامة تعجب في النهاية.
قد نصادف في كثير من الأحيان عبارة مفادها أن طريقة الانفجار هي طريقة خطرة بمعنى من المعاني، وعلامة التعجب في نهاية تعريفها تخبرنا بأن نكون يقظين عند استخدام هذه الطريقة. دعونا نرى: ما هو هذا التهديد بالضبط عندما يتعلق الأمر بهذه الطرق وما هي خصائصها؟
من أشهر خصائص هذه الأنواع من الأساليب أنها عادة ما تغير جمهورها. لنلقِ نظرة على طريقة Map! كمثال. وفقًا للوثائق، تستدعي طريقة Map! تستدعي طريقة Map! الكتلة المُعطاة مرة واحدة لكل عنصر من عناصر الذات، وتستبدل العنصر بالقيمة التي تُعيدها الكتلة وإذا لم تُعطَ أي كتلة تُعاد قيمة مُعدِّد بدلًا من ذلك.
arry = [1، 2، 3، 4، 5]
arry.object_id => 280
arry.map { |num| num**num } => [1, 4, 27, 256, 3125]
arry.map! => # [1, 4, 27, 256, 3125]
arry.object_id => 280
كما نرى، يبقى الكائن_id دون تغيير. لذا، يبدو خطر استخدام مثل هذه الطريقة واضحًا. إذا كان في الكود استخدمنا المتغير arry في أي مكان آخر، فإن الخريطة! قد يؤدي ذلك إلى تشغيل برنامجنا بطريقة غير مرغوب فيها أو حتى تعطله.
توجد عناصر في روبي التي لا يمكن تغييرها، مثل مثيلات فئات الأعداد الصحيحة والفلوات والرموز. أثناء العمل على المشروع، يمكنك أيضًا أن تقابل ما يسمى بالتعليق السحري الذي يسير على هذا النحو:
متجمدسلسلةحرفية: صواب
ستؤدي محاولة تغيير مستلم السلسلة في الكود حيث تم استخدام مثل هذا التعليق إلى حدوث خطأ مثل هذا:
'abc'.upcase!
خطأ مجمد (لا يمكن تعديل سلسلة مجمدة)
ومن المثير للاهتمام أنه كانت هناك خطط لإدخال سلسلة غير قابلة للتغيير في روبي 3.0ولكن تقرر عدم إجراء هذا التغيير. ومع ذلك، يجب أن تتذكر أنه ليست كل طرق الانفجار تغير المستلم، لذلك يجب عليك دائمًا التحقق من الوثائق من نوع الخطر الذي يجب أن تتوقعه في حالة طريقة معينة.
ميزة أخرى مميزة لهذه الطرق هي أنه، بالنسبة للعديد منها، يتم رفع استثناء. مثال على هذه الطريقة هو ActiveRecord::FinderMethods#first! وفقًا للوثائق، الطريقة الأولى! هي نفس الطريقة الأولى ولكنها تثير ActiveRecord::RecordNotFound إذا لم يتم العثور على أي سجل. لاحظ أن الأول! لا يقبل أي وسيطات.
ملف activerecord/lib/activerecord/relation/findermethods.rb، السطر 128
تعريف أولاً!
أولاً || |رفع الاستثناء غير موجود!
نهاية
ومع ذلك، فإن طريقة ActiveRecord::FinderMethods#first المستخدمة أعلاه تبدو كالتالي:
ملف activerecord/lib/activerecord/relation/findermethods.rb، السطر 116
تعريف أولاً(الحد الأول (الحد = لا شيء)
تحقق من الإهمال ما لم يتم تحميله؟
إذا كان الحد
البحث عن الحد(0، الحد)
غير ذلك
العثور على 0
النهاية
النهاية
شكرًا لذلك الأمثلة أعلاه، نرى خطورة استخدام الأول. إذا استخدمنا ActiveRecord::FinderMethods#find! ولن يعثر على سجل مناسب في قاعدة البيانات، فسيُرجع ActiveRecord::RecordNotFound، مما قد يتسبب في توقف برنامجنا عن العمل.
ومع ذلك، يجب أن نتذكر أن هذا لا يعني أنه إذا لم يكن للطريقة علامة تعجب في النهاية، فهي آمنة ولن ترفع الاستثناء أو تغير المستلم.
تم تقديم زوج جديد من الطرق في Ruby on Rails 6.0: ActiveRecord::Persistence::ClassMethods#insert_all
و ActiveRecord::Persistence::ClassMethods#insert_all!
تظهر أول هذه الطرق بالفعل درجة معينة من الخطورة. حسنًا، وفقًا للوثائق، أدخلجميعها إدراج سجلات متعددة في قاعدة البيانات في بيان SQL INSERT واحد. فهي لا تقوم بإنشاء أي نماذج ولا تقوم بتشغيل عمليات استدعاء أو تحقق من صحة ActiveRecord. ومع ذلك، فإن الإدراجالكل! بالإضافة إلى ذلك يُثير ActiveRecord::RecordNotUnique إذا كانت أي صفوف تنتهك فهرسًا فريدًا على الجدول. في هذه الحالة، لا يتم إدراج أي صفوف. هذا يعني أن الطريقة الأولى ستحفظ جميع السجلات باستثناء تلك التي تنتهك الفهرس الفريد، بينما الطريقة الثانية (الأكثر خطورة) سترفع استثناءً ولن تحفظ أيًا من السجلات في قاعدة البيانات.
العديد من الطرق، على الرغم من عدم احتوائها على علامة تعجب في النهاية، إلا أنه من الخطر استخدامها. على سبيل المثال، ActiveRecord::FinderMethods#find. وفقًا للوثائق إذا تعذر العثور على سجل واحد أو أكثر للمعرّفات المطلوبة، فسيتم رفع ActiveRecord::RecordNotFound.
يمكننا أن نلاحظ أنه على الرغم من أن هذه الطريقة لها نفس درجة الخطورة التي تتمتع بها طريقة ActiveRecord::FinderMethods#first!
وينطبق الشيء نفسه عندما يتعلق الأمر بتعديل المستلم. على سبيل المثال، يحذف Array.delete (كما هو موثق) جميع العناصر من الذات التي تساوي كائنًا ويعيد آخر عنصر محذوف، أو لا شيء إذا لم يتم العثور على عناصر مطابقة.
أ = [1، 2، 3، 4، 5]
a.object_id #=> 320
أ.حذف(2) #=> 2
أ #=> [1، 3، 4، 5]
أ.حذف(6) #=> لا شيء
a.object_id #=> 320
يمكنك أن ترى بوضوح أن الكائن قد تم تعديله. القاسم المشترك بين الطريقتين هو عدم وجود علامة تعجب مكافئة لهما. ولذلك، إذا كانت الطريقة التي نرغب في إنشائها سيكون لها هذا النوع من المخاطر التي ذكرتها أعلاه، فلا داعي لأن يكون لها علامة تعجب في النهاية مباشرة. علاوة على ذلك، من المستحسن إنشاء طريقة ضجة إذا كان هناك بالفعل طريقة تحمل نفس الاسم أقل خطورة من الطريقة التي تريد إنشاءها.
يمكنك أن تتساءل لماذا نستخدم هذه الأساليب الخطرة أصلاً، خاصةً أن لدينا عادةً نظائر أقل خطورة. يمكن أن تكون إحدى المزايا، على سبيل المثال، تحسين أداء الشيفرة بفضل تقليل عدد الكائنات التي تم إنشاؤها. هنا يمكنك قراءة المزيد حول زيادة أداء القضبان.
عندما يتعلق الأمر برفع الاستثناءات، قد يؤدي استخدام طريقة الإنشاء بدلاً من طريقة الإنشاء! الخطرة إلى موقف يصعب فيه اكتشاف خطأ في تطبيقنا لأن السجلات لن تُكتب في قاعدة البيانات. لذا، إذا كنا متأكدين من أن المعلمات التي نمررها إلى هذه الطريقة صحيحة، يجب أن نستخدم طريقة إنشاء! التي سترفع استثناءً إذا لم يتم حفظ السجل في قاعدة البيانات لسبب ما.
الاستنتاج بسيط، وهو كالتالي: الاستخدام الحكيم لمثل هذه الأساليب يمكن أن يحسن أداء وجودة الشيفرة البرمجية الخاصة بنا. ومع ذلك، يجب أن نتذكر دائمًا أن استخدامها غير المناسب يمكن أن يوقف تشغيل الكود بشكل صحيح.
إذا كنت ترغب في إنشاء طريقتك الخطرة الخاصة بك، يجب أن تمر بعملية معينة لاتخاذ القرار. أولًا، السؤال هو ما إذا كان هناك بالفعل طريقة تحمل نفس اسم الطريقة التي تريد إنشاءها ولكن أقل خطورة. يمكنك أيضًا التفكير في إنشاء طريقتين تكون إحداهما مكافئة للأخرى، ولكن أكثر خطورة فقط.
لا فائدة من إنشاء طريقة ضجة إذا لم تكن نظيرتها بدون علامة تعجب موجودة. هناك طرق خطيرة لأنها تغير الكائن أو ترفع استثناءً، ومع ذلك لا تحتوي على علامة تعجب في نهاية الاسم. إنشاء طريقة ضجة دون وجود ما يعادلها من شأنه أن يربك المبرمج الذي يستخدم شفرتك. لن يتمكن هذا الشخص من تحديد خطورة هذه الطريقة ولماذا تستحق علامة تعجب في نهاية اسمها.
ثانيًا، يجب أن نفكر في نوع الأخطار التي نتحدث عنها. من الأمثلة أعلاه، يمكننا أن نستنتج أن أكثر أنواع الأخطار شيوعًا هو تغيير الكائن نفسه (بدلًا من إنشاء نسخة منه) أو رفع استثناء. بالطبع، هذه ليست قاعدة بل نتيجة تحليل الطرق التي تم تعريفها في روبي وRuby on Rails. على سبيل المثال، قد نأخذ بعين الاعتبار تنفيذ زوج من الطرائق التي تكون فيها الطريقة دون علامة تعجب سيحفظ السجل في قاعدة البيانات، في حين أن الطريقة التي تحمل علامة التعجب ستتخطى التحقق من صحة هذا السجل. في هذه الحالة، من الواضح أين يكمن الخطر المحتمل لاستخدام مثل هذه الأساليب.
يشير ملخص معرفة طرق الضرب إلى هذه الاستنتاجات: الطريقة الأولى التي تحمل علامة التعجب لها أقل تهديدًا
نظيرتها بدون علامة تعجب، ثانيًا، تقوم الطريقة التي تحتوي على علامة تعجب بتنفيذ إجراء خطير، على سبيل المثال، تعديل المستلم أو رفع استثناء.
في الختام، فإن فهم مفهوم طرق الضرب في روبي تطوير البرمجيات تحسين مهاراتك البرمجية بشكل كبير وإضفاء المزيد من الوضوح على قاعدة شفرتك البرمجية. طرق الانفجارالتي يُرمز لها بعلامة تعجب في نهاية أسمائها، تشير إلى نسخة مدمرة أو يحتمل أن تكون خطرة من الطريقة. حسب الاصطلاح، فإن النظير الضربة النظير للطريقة بحذر لأنه يمكن أن يعدل الكائنات مباشرة، دون إنشاء نسخة منفصلة. يمكن أن يكون هذا مفيدًا بشكل خاص عند التعامل مع كائنات قابلة للتغيير أو عندما يكون تحسين الأداء مصدر قلق. ومع ذلك، من المهم توخي الحذر عند استخدام طرائق الانفجار، حيث يمكن أن يكون لها عواقب غير مقصودة إذا لم يتم التعامل معها بشكل صحيح. تجدر الإشارة أيضًا إلى أنه لا تحتوي جميع الطرق على نسخة الانفجارويجب تقييم وجودها على أساس كل حالة على حدة. من خلال معرفة متى وكيف تنشئ أساليب الانفجار، يمكنك استخدام هذه الأداة القوية بفعالية وكتابة شيفرة نظيفة وفعالة تلبي متطلباتك الخاصة.