دوال

  • حل مشكلة الأقواس الزائدة في بيانات JSON

    المشكلة الرئيسية في الكود المُقدم هي أنه ينتج عنه تشكيلات زائدة من الأقواس المُجعّدة في بيانات JSON المُخرجة. عند فحص الكود، يظهر أن المشكلة تنشأ من استخدام دوال PHP بطريقة غير صحيحة مع بناء بيانات النتائج.

    أولاً وقبل كل شيء، يبدو أنك تستخدم ملف config.php، والذي قد يحتوي على اتصال بقاعدة بيانات MySQL. يُفضل استخدام اتصال مع PDO أو MySQLi بدلاً من توسيع دالة mysql_* التي تعتبر مهجورة وغير موصى بها.

    ثانيًا، في الجزء الداخلي من الحلقة for، يبدو أنك تقوم بحساب مجموع crime_mudered لكل عام من السنوات المحددة. لكن المشكلة تكمن في كيفية بناء البيانات. يجب أن يكون لديك مصفوفة داخلية تحتوي على البيانات لكل سنة، وبعد ذلك يتم إضافة هذه المصفوفة الداخلية إلى مصفوفة خارجية.

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

    إليك نسخة معدلة من الكود:

    php
    header('Content-Type: application/json'); include('config.php'); $data1 = array(); // تحريك المصفوفة خارج الحلقة for($i = 1990; $i <= 2016; $i++) { $sum = 0; $data3 = array(); // إعادة تهيئة المصفوفة في كل تكرار للحلقة $result = mysql_query("SELECT * FROM crimedetails WHERE crime_year = $i"); while($row = mysql_fetch_array($result)) { $sum += $row['crime_mudered']; } $data['crime_mudered'] = $sum; $data['crime_year'] = $i; $data3[] = $data; $data1[] = $data3; // إضافة المصفوفة الداخلية إلى المصفوفة الخارجية } print json_encode($data1); ?>

    بهذا التعديل، يجب أن يتم توليد بيانات JSON بالشكل الصحيح دون وجود تشكيلات زائدة من الأقواس المُجعّدة.

    المزيد من المعلومات

    بالطبع، هذا التعديل يحل مشكلة الأقواس المُجعّدة الزائدة في بيانات JSON الناتجة. ومع ذلك، هناك بعض النقاط الإضافية التي يجب النظر فيها لتحسين الكود وتجنب المشاكل المحتملة في المستقبل.

    أولاً، من الأفضل استخدام استعلامات معدلة لتحسين أداء استرجاع البيانات من قاعدة البيانات. يمكن استخدام استعلام واحد لاسترجاع المجموع المطلوب مباشرةً بدلاً من استرجاع جميع البيانات ثم حساب المجموع في PHP. على سبيل المثال:

    php
    SELECT crime_year, SUM(crime_mudered) AS total_murders FROM crimedetails GROUP BY crime_year;

    هذا الاستعلام سيُعيد مجموع جرائم القتل لكل عام بشكل فعّال.

    ثانياً، كما ذكرت سابقاً، استخدم دوال mysqli أو PDO بدلاً من الدوال المهجورة mysql_* لتفادي مشاكل الأمان وتحسين الأداء.

    وثالثاً، من الجيد أيضًا التأكد من وجود معالجة لأي أخطاء محتملة خلال استرجاع البيانات من قاعدة البيانات، مثل فشل الاستعلام أو عدم وجود نتائج.

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

    بتطبيق هذه التحسينات والإصلاحات، يمكن تحسين أداء وجودة الكود وضمان حصولك على نتائج دقيقة وموثوقة عند توليد بيانات JSON من قاعدة البيانات.

  • بديلات فعّالة لـ flatMap في جافا سكريبت

    في عالم البرمجة، خاصة في لغة جافا سكريبت، تكمن قوة الأدوات القياسية المتاحة للمطورين في مجموعة الدوال والخصائص التي تم تضمينها مسبقًا في اللغة. ومن بين هذه الأدوات، تبرز دوال تعامل مع الصفائف (Arrays)، ومن بينها map التي تُستخدم لتحويل كل عنصر في الصفيف وإنشاء صفيف جديد بناءً على القيم المسترجعة من كل عنصر.

    ومع ذلك، يُشعر الكثيرون بالحاجة إلى دالة تُشبه flatMap الموجودة في بعض اللغات الأخرى، والتي تقوم بتطبيق دالة تحويلية على كل عنصر في الصفيف، ثم تُسطر النتائج في صفيف واحد بدلاً من الحصول على صفيف متداخل من النتائج. وفي هذا السياق، يتساءل الكثيرون: لماذا لا تتوفر flatMap في جافا سكريبت كجزء من Array.prototype؟

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

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

    بالتالي، يمكن تلخيص أسباب عدم توفر flatMap في جافا سكريبت بأنها ترتبط بتوازن اللغة بين الفعالية والتوافق مع الإصدارات السابقة، وعلى الرغم من ذلك، يمكن للمطورين تحقيق تأثيرات flatMap بسهولة باستخدام الدوال المتاحة بالفعل في اللغة.

    المزيد من المعلومات

    بالإضافة إلى النهج المذكور أعلاه، هناك أيضًا بعض الطرق البديلة الأخرى لتحقيق تأثير flatMap في جافا سكريبت بطريقة أكثر كفاءة وسهولة. من بين هذه الطرق:

    استخدام الدوال الفرعية

    في الواقع، يمكن دمج map و flat معًا باستخدام الدوال الفرعية المتاحة في جافا سكريبت. على سبيل المثال، يمكن استخدام map لتحويل كل عنصر إلى صفيف من القيم، ثم استخدام flat لتسطير هذه الصفوف في صفيف واحد، وهذا يمثل بديلًا بسيطًا وفعالًا لـ flatMap.

    javascript
    const arr = [1, 2, 3]; const flatMapped = arr.map(x => [x * 2, x * 3]).flat(); console.log(flatMapped); // Output: [2, 3, 4, 6, 6, 9]

    استخدام العبارات اللافتة للانتباه (Arrow Functions)

    باستخدام العبارات اللافتة للانتباه (Arrow Functions)، يمكن تقليل كمية الكود المطلوبة لتحقيق تأثير flatMap. على سبيل المثال:

    javascript
    const arr = [1, 2, 3]; const flatMapped = arr.map(x => [x * 2, x * 3]).flat(); console.log(flatMapped); // Output: [2, 3, 4, 6, 6, 9]

    استخدام الدوال الجديدة

    مع تطور جافا سكريبت، قد تظهر دوال جديدة أو تتوفر دعم لتحقيق تأثيرات مماثلة لـ flatMap بشكل أكثر فعالية وسهولة. عندما يتم تقديم هذه الدوال، يمكن للمطورين الانتقال إليها لتحقيق تأثيرات flatMap بطريقة أكثر تحسينًا وكفاءة.

    باختصار، على الرغم من عدم توفر flatMap مباشرة في جافا سكريبت، يمكن للمطورين استخدام بدائل فعّالة مثل دمج map و flat أو استخدام العبارات اللافتة للانتباه لتحقيق نفس النتيجة بطريقة سلسة وبسيطة. ومع تطور اللغة، يمكن توقع ظهور حلول جديدة أو تحسينات لتحقيق هذه الوظيفة بشكل أكثر كفاءة في المستقبل.

  • كيفية استخدام الكلاسات في C++

    إذا كنت ترغب في استخدام الكلاس Triunghi في لغة البرمجة C++ وتواجه صعوبة في تمرير قيم لـ l1 و l2 و ba واستخدامها في الدالة Perimetru، فأنت بحاجة إلى بعض التغييرات في الطريقة التي تقوم بها بتعيين القيم واستخدام الكائنات من هذا النوع.

    في الكود الحالي، في دالة main، عندما تقوم بتعريف متغير tri من نوع Triunghi، فإنك بالفعل تنشئ كائنًا من الكلاس، ولكن عندما تقوم بكتابة Triunghi(1,2,3); فإنك في الواقع تقوم بإنشاء كائن آخر، ولكنه ليس مخزنًا في أي متغير، وبالتالي لا يمكنك استخدامه لاحقًا.

    لتصحيح هذا، يجب عليك تخزين الكائن الجديد في متغير، كما هو مبين في الشفرة التالية:

    cpp
    int main() { // Create an object of Triunghi class and pass values to the constructor Triunghi tri(1, 2, 3); // Call the Perimetru function on the object and store the result int perimeter = tri.Perimetru(); // Output the result cout << "Perimeter: " << perimeter << endl; return 0; }

    بهذه الطريقة، يتم إنشاء الكائن tri ويتم تمرير القيم 1، 2، 3 إلى البناء Triunghi(int a, int b, int c)، ومن ثم يتم استدعاء الدالة Perimetru() على هذا الكائن لحساب محيط المثلث، ونتيجة هذا الحساب يتم تخزينها في المتغير perimeter لاستخدامها لاحقًا.

    المزيد من المعلومات

    بالطبع، دعني أوضح لك المزيد عن كيفية استخدام الكلاسات في C++ وكيفية تحسين التعامل مع الكائنات من نوع Triunghi.

    عندما تنشئ كلاسًا في C++، فإنك في الواقع تعرف نوعًا جديدًا من البيانات يحتوي على بيانات (متغيرات العضو) وعلى وظائف (الدوال العضوية). البناء (Constructor) والهدم (Destructor) هي وظائف خاصة يتم استدعاؤها عند إنشاء وتدمير كائنات الكلاس.

    في الكود الذي قدمته، قمت بتعريف بناء (Constructor) لكلاس Triunghi الذي يأخذ متغيرات مختلفة كمعاملات. لاحظ أنه لا توجد دالة Constructor تأخذ قيم افتراضية لـ l1 و l2 و ba، لذا عندما تنشئ كائنًا جديدًا من الكلاس ولا تمرر قيمًا لهذه المتغيرات، فإنها ستكون صفر افتراضيًا.

    وبما أنك تريد تمرير قيم لـ l1 و l2 و ba واستخدامها في دالة Perimetru، يمكنك فعل ذلك عن طريق تمرير قيم عند إنشاء الكائن. على سبيل المثال، يمكنك فعل ذلك كما يلي:

    cpp
    int main() { // Create an object of Triunghi class and pass values to the constructor Triunghi tri(3, 4, 5); // Call the Perimetru function on the object and store the result int perimeter = tri.Perimetru(); // Output the result cout << "Perimeter: " << perimeter << endl; return 0; }

    في هذا المثال، تم تمرير قيم 3، 4، 5 إلى البناء المناسب Triunghi(int a, int b, int c)، وبالتالي يتم استخدام هذه القيم في حساب محيط المثلث.

    بهذه الطريقة، يمكنك الآن استخدام الكائنات من الكلاس Triunghi بشكل صحيح وتمرير القيم التي تحتاجها عند إنشائها لاستخدامها في دوال الكلاس المختلفة مثل Perimetru().

  • توالي الدوال في Elixir

    في Elixir، لا يوجد وظيفة تسمى forEach بالتحديد كما هو الحال في JavaScript. بدلاً من ذلك، يمكنك استخدام توالي الدوال المسمى Enum.each لتحقيق نفس الغرض. تقوم هذه الوظيفة بتطبيق دالة معينة على كل عنصر في القائمة، ولكنها لا تقوم بإرجاع قيمة.

    لنقم بإعادة السيناريو الذي ذكرته في JavaScript باستخدام Elixir. لنفترض أن لدينا قائمة من الأرقام تحتوي على [1, 2, 3]، ونريد طباعة كل عنصر في القائمة:

    elixir
    [1, 2, 3] |> Enum.each(fn(num) -> IO.puts(num) end)

    في هذا المثال، نستخدم Enum.each لتمرير كل عنصر من القائمة إلى الدالة المعينة، والتي تقوم بطباعة كل عنصر باستخدام IO.puts. الناتج سيكون مشابهًا لما تم ذكره في المثال الخاص بـ JavaScript:

    1 2 3

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

    elixir
    [1, 2, 3] |> Enum.each(&IO.puts/1)

    هذا الشكل يقوم بنفس العملية مثل الشكل السابق، حيث يتم طباعة كل عنصر في القائمة. يقوم الأمر &IO.puts/1 بإنشاء تفويض لدالة IO.puts التي تأخذ واحدًا من الوسائط، وهو السبب في ظهور الرقم 1 ثم 2 وأخيرًا 3 في الإخراج.

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

    المزيد من المعلومات

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

    استخدام Enum.each في Elixir

    وظيفة Enum.each تعتبر واحدة من الوظائف الأساسية في Elixir وتُستخدم بشكل شائع لتطبيق عمليات على العناصر في القوائم. إليك بعض النقاط الرئيسية حول استخدامها:

    1. تمرير الدالة كوسيط: يُمكن تمرير دالة معينة إلى Enum.each، وسيُقوم هذا الدالة بتطبيقها على كل عنصر في القائمة.
    2. تفويض الدالة: يُمكن استخدام تفويض الدالة & لإنشاء دالة مفوضة بسرعة لتمريرها إلى Enum.each.

    أمثلة إضافية

    دعونا نلقي نظرة على بعض الأمثلة الإضافية لاستخدام Enum.each في سياقات مختلفة:

    تحويل قيم القائمة

    يمكن استخدام Enum.each لتحويل قيم القائمة إلى قيم جديدة باستخدام دالة محددة. على سبيل المثال، دعونا نقوم بضرب كل عنصر في القائمة بعدد محدد:

    elixir
    list = [1, 2, 3, 4] Enum.each(list, fn(x) -> IO.puts(x * 2) end)

    مرشح العناصر

    يُمكن استخدام Enum.each لتطبيق مرشح على العناصر في القائمة واستبعاد العناصر التي لا تلبي الشرط. على سبيل المثال، دعونا نقوم بطباعة الأعداد الزوجية فقط من القائمة:

    elixir
    list = [1, 2, 3, 4] Enum.each(list, fn(x) -> if rem(x, 2) == 0, do: IO.puts(x) end)

    الاستنتاج

    في النهاية، استخدام Enum.each في Elixir يوفر وسيلة فعالة لتطبيق العمليات على كل عنصر في القائمة. من خلال تمرير الدالة المناسبة، يمكنك تحقيق مجموعة متنوعة من الوظائف بسهولة وفعالية. تعتبر هذه الوظيفة جزءًا أساسيًا من أدوات البرمجة في Elixir وتساعد في تبسيط الشفرات وجعلها أكثر قابلية للصيانة والفهم.

  • تعامل JQuery مع دوال داخلية

    تبدو لديك وظيفة في جيكويري تُدعى is_airport والتي تقوم بفحص ما إذا كانت الموقع هو مطار باستخدام JSON يحتوي على معلومات عن المطارات. وعلى الرغم من أن كل الأمور تبدو تعمل بشكل صحيح، إلا أنك تواجه مشكلة تتمثل في أن الدالة تعيد قيمة false بدلاً من true على الرغم من أنها تقوم بإصدار إنذار “OK” عند العثور على مطار مطابق.

    المشكلة هنا تكمن في كيفية تعامل جيكويري مع الدوال التي تستخدم داخل دوال أخرى مثل الدالة each التي تستخدمها في is_airport. عندما تقوم بإرجاع قيمة من داخل دالة تُدعى داخل each، فإن هذه القيمة لا تُرجع بشكل صحيح من الدالة الرئيسية is_airport بسبب طريقة عمل each وطبيعتها الحلقية.

    لحل هذه المشكلة، يمكنك استخدام $.each لكن بطريقة مختلفة باستخدام متغير مؤقت لتخزين نتيجة البحث وإعادتها بعد الانتهاء من الحلقة. إليك كيف يمكنك تعديل الكود:

    javascript
    function is_airport(destination_id){ var json_storage = $("#locations-json"); var airports = JSON.parse(json_storage.attr("data-airports")); var isAirport = false; // متغير لتخزين نتيجة البحث $.each(airports, function(id, name) { console.log(id, destination_id, name); if (id == destination_id) { alert('OK'); isAirport = true; // تغيير قيمة المتغير لتحديد أنه تم العثور على المطار return false; // توقف الحلقة بمجرد العثور على المطار } }); return isAirport; // إرجاع قيمة المتغير } $(document).ready(function() { console.log(is_airport(5)); });

    بهذه الطريقة، يتم تخزين نتيجة البحث في isAirport وإعادتها في نهاية الدالة بعد اكتمال الحلقة. هذا يسمح بالتحكم بشكل صحيح في القيمة التي تُعيد من الدالة is_airport.

    المزيد من المعلومات

    بالطبع، إليك المقال بالكامل:


    JQuery يُعيد القيمة “false” بعد العودة بقيمة “true”؟

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

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

    في الكود المقدم، لدينا وظيفة تُدعى is_airport تقوم بالقيام بالفحص المذكور أعلاه. لكن المشكلة هي أنه على الرغم من أن الدالة تبدو تعمل بشكل صحيح، إلا أنها تعيد قيمة “false” بدلاً من “true” حتى بعد عودتها بقيمة “true” من داخل الدالة.

    السبب وراء هذه المشكلة يعود إلى طريقة عمل JQuery في التعامل مع الدوال التي تُستدعى داخل دوال أخرى مثل الدالة each. عند استخدام each، فإن JQuery لا يعيد قيمة الدالة الرئيسية بشكل صحيح بسبب طبيعة الحلقة وتنفيذها.

    لحل هذه المشكلة، يمكن تعديل الكود لاستخدام متغير مؤقت لتخزين نتيجة البحث وإعادتها بعد اكتمال الحلقة. إليك كيف يمكن تعديل الكود لتحقيق ذلك:

    javascript
    function is_airport(destination_id){ var json_storage = $("#locations-json"); var airports = JSON.parse(json_storage.attr("data-airports")); var isAirport = false; // متغير لتخزين نتيجة البحث $.each(airports, function(id, name) { console.log(id, destination_id, name); if (id == destination_id) { alert('OK'); isAirport = true; // تغيير قيمة المتغير لتحديد أنه تم العثور على المطار return false; // توقف الحلقة بمجرد العثور على المطار } }); return isAirport; // إرجاع قيمة المتغير } $(document).ready(function() { console.log(is_airport(5)); });

    من خلال هذا التعديل، يتم تخزين نتيجة البحث في متغير مؤقت isAirport وإعادتها في نهاية الدالة بعد اكتمال الحلقة. بهذه الطريقة، يتم التحكم بشكل صحيح في القيمة التي تُعيد من الدالة is_airport.

    في الختام، يُظهر هذا المثال كيف يمكن أن تواجه تحديات في استخدام JQuery حتى في الحالات البسيطة. ومن خلال فهم الأدوات التي تستخدمها بعمق وبتقدير لتفاصيلها، يمكنك تجنب هذه المشاكل وتحقيق الأداء المطلوب في تطوير تطبيقات الويب الخاصة بك.

  • تحقق استدعاء دوال Setter في Kotlin

    التحقق من استدعاء الوظيفة المعينة في Kotlin باستخدام Mockito يمكن أن يكون تحديًا بعض الشيء، خاصة عندما ترغب في التحقق من استدعاء دالة الضبط (Setter) في Kotlin. في الشيفرة المعطاة، توجد واجهة LoginDisplay وتطبيق لها بعنوان LoginActivityLoginDisplay. يهدف الكود إلى تخزين اسم المستخدم وكلمة المرور. ومن المهم تحقق مما إذا كانت الوظيفة Setter تعمل بشكل صحيح أم لا.

    لحل هذا المشكلة باستخدام Mockito، يمكنك استخدام الميزة التي توفرها Mockito للتحقق من استدعاء الدوال. يمكننا أن نقوم بذلك عن طريق استخدام الميزة التالية في Mockito:

    kotlin
    verify(contract.loginDisplay).username = anyString()

    مع وجود هذا الاستدعاء، يمكننا التحقق من استدعاء Setter لـ username بنجاح. تحقق وظيفة verify هذه الاستدعاء وتأكد مما إذا كان تم استدعاؤها أم لا. وللتأكد من أن الدالة Setter قد تم استدعاؤها بقيمة معينة، يمكنك استخدام anyString() لتحقيق ذلك.

    باستخدام هذا الحل، يمكنك الآن التحقق من استدعاء Setter بنجاح والتأكد من أن السلوك المتوقع يتم بالفعل في التجربة الخاصة بك.

    المزيد من المعلومات

    بينما يمكن أن يكون التحقق من استدعاء دوال Setter في Kotlin بمساعدة Mockito مهمة متقدمة قليلاً، إلا أن هناك طرقًا يمكن استخدامها لتبسيط العملية وتحقيق الهدف بنجاح.

    أحد الطرق البديلة هو استخدام الواجهة المتطابقة مع ما تم تعريفها في كلاس LoginActivityLoginDisplay والتحقق من استدعاء الدوال في الواجهة بدلاً من الكلاس نفسه. هذا يمكن أن يجعل عملية التحقق أسهل وأكثر فعالية. لنقم بإنشاء واجهة جديدة تحتوي على دوال Setter لكل من username و password كما يلي:

    kotlin
    interface LoginDisplaySetter { fun setUsername(username: String) fun setPassword(password: String) }

    ثم، نقوم بتعديل كلاس LoginActivityLoginDisplay لينفذ هذه الواجهة بالإضافة إلى الواجهة LoginDisplay:

    kotlin
    class LoginActivityLoginDisplay : LoginDisplay, LoginDisplaySetter { override var username: String get() = usernameEditView.text.toString() set(value) { usernameEditView.setText(value) } override var password: String get() = passwordEditView.text.toString() set(value) { passwordEditView.setText(value) } override fun setUsername(username: String) { this.username = username } override fun setPassword(password: String) { this.password = password } }

    بهذه الطريقة، يمكننا استخدام Mockito للتحقق من استدعاء الدوال في الواجهة LoginDisplaySetter بسهولة. على سبيل المثال:

    kotlin
    verify(contract.loginDisplay).setUsername(anyString())

    مع هذا الاستدعاء، يمكننا التحقق الآن من استدعاء الدالة Setter لاسم المستخدم بنجاح، وذلك باستخدام Mockito بطريقة أكثر فعالية وسهولة.

    باستخدام هذه الاستراتيجية، يمكن للمطورين تسهيل عملية الاختبار وتقليل التعقيد، مما يساعدهم في كتابة اختبارات الوحدة الفعالة والموثوقة لتطبيقات Kotlin.

  • Pandas assign: تسمية أعمدة باستخدام الدوال والتعبيرات

    من الواضح أنك تسعى لفهم أكثر حول طريقة استخدام وتركيبة الأسلوب assign في مكتبة pandas لغة برمجة Python، والذي يتيح إضافة عمود جديد إلى إطار البيانات (DataFrame) بسهولة وبشكل أنيق. إلا أن القضية التي تواجهك هي صعوبة تسمية العمود الجديد باستخدام أسماء تحتوي على فراغات أو علامات ترقيم، وهو الأمر الذي يتعارض مع بنية اللغة والقواعد الخاصة بتعريف المتغيرات في Python.

    في مثالك المذكور، عند محاولة تسمية العمود الجديد بـ “ln(A)”، وجدت نفسك تواجه رسالة خطأ تفيد بأن الكلمة المفتاحية (keyword) لا يمكن أن تكون تعبيرًا (expression).

    الحقيقة هي أن الطريقة الأساسية لاستخدام assign تتطلب تمرير اسم العمود الجديد كوسم نقي (clean label)، أي يجب أن يكون اسم العمود خاليًا من أي أحرف غير صالحة لتعريف المتغيرات في Python، مثل الفراغات والعلامات الترقيمية. ولكن يمكنك تحقيق ما تريد بشكل آخر.

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

    ومن الجدير بالذكر أن الهدف من هذا الأسلوب هو تسهيل إجراءات التحويل والتعديل على بيانات DataFrame بشكل سلس وسهل الفهم، والقلق بشأن تسمية الأعمدة لا يجب أن يكون عائقًا أمام ذلك.

    بهذا الشكل، يمكنك أن تستمتع بقوة ومرونة أسلوب assign في تعديل بيانات DataFrame الخاصة بك بالطريقة التي تناسب احتياجاتك وتفضيلاتك بشكل دقيق ودون قيود.

    المزيد من المعلومات

    علاوة على ذلك، يمكنك النظر في استخدام دالة eval() لتمكينك من تحديد أسماء الأعمدة باستخدام تعبيرات. هذه الدالة تتيح لك تقييم تعبيرات Python من السلاسل (strings)، مما يعني أنه يمكنك استخدامها لإنشاء أعمدة باستخدام أسماء معقدة أو تحتوي على فراغات.

    لنلقِ نظرة على كيفية تنفيذ هذا:

    python
    import pandas as pd import numpy as np # إنشاء DataFrame الأصلي df = pd.DataFrame({'A': range(1, 11), 'B': np.random.randn(10)}) # استخدام eval() لتحديد اسم العمود باستخدام تعبير df = df.assign(**{'ln(A)': lambda x: np.log(x.A)}) # طباعة DataFrame بعد الإضافة print(df)

    هذا الكود يستخدم assign() مع eval() لإضافة عمود بالاسم “ln(A)” بناءً على التعبير lambda المعطى. بفضل هذا، يمكنك تحقيق ما تريد بسهولة، وبدون الحاجة إلى إعادة تسمية العمود بعد الإضافة.

    من الواضح أن مكتبة pandas توفر العديد من الطرق المرنة والقوية لإدارة وتعديل البيانات، مما يسمح لك بتحقيق أهدافك بسهولة وفعالية. باستخدام أساليب مثل assign() و eval()، يمكنك القيام بعمليات التحويل والتعديل بشكل دقيق ومنظم، مما يجعل تجربة العمل مع البيانات أكثر سلاسة وإنتاجية.

    بهذه الطريقة، يمكنك استكشاف ميزات pandas بشكل أكبر واستخدامها بأفضل الطرق لتلبية احتياجاتك وتحقيق أهدافك في تحليل ومعالجة البيانات.

  • إزالة الفواصل في PHP

    للقيام بإزالة الفواصل في الأمثلة المعطاة، يمكن استخدام بعض الدوال المتاحة في لغة البرمجة PHP لتنفيذ ذلك بسهولة. سنتعامل مع كل من الحالتين على حدة:

    1. لإزالة الفاصلة الأخيرة من السلسلة “aaa،bbb،ccc،ddd،”، يمكن استخدام دالة trim() لإزالة الفراغات والفواصل من بداية ونهاية السلسلة. ثم يمكن استخدام دالة rtrim() لإزالة الفاصلة الأخيرة.

    2. لإزالة جميع الفواصل قبل القيمة “bbb” في سلسلة “aaa،bbb،،،”، يمكن استخدام دالة strstr() للبحث عن القيمة المحددة ومن ثم استخدام دالة substr() لاستخراج الجزء الأول من السلسلة دون الفواصل.

    فيما يلي الشفرة التي تقوم بذلك:

    php
    // الحالة الأولى: إزالة الفاصلة الأخيرة $values1 = "aaa,bbb,ccc,ddd,"; $values1 = rtrim($values1, ','); // الحالة الثانية: إزالة الفواصل قبل "bbb" $values2 = "aaa,bbb,,,"; $values2 = strstr($values2, 'bbb'); $values2 = ltrim($values2, ','); // إذا كان هناك فواصل إضافية بعد "bbb" // اطبع النتائج للتحقق echo $values1 . "
    "
    ; echo $values2 . "
    "
    ; ?>

    سيقوم الكود بإرجاع القيمتين بدون الفواصل المطلوبة كما هو متوقع.

    المزيد من المعلومات

    بالتأكيد، سأكمل المقال لشرح الطرق المستخدمة في إزالة الفواصل من السلاسل في الأمثلة المعطاة.


    كيفية إزالة الفواصل في سلاسل PHP

    لإزالة الفواصل من السلاسل في لغة البرمجة PHP، يمكن استخدام الدوال المناسبة المتاحة في اللغة. سنناقش الآليتين المستخدمتين في الأمثلة المعطاة:

    ١. إزالة الفاصلة الأخيرة

    في هذه الحالة، نحتاج إلى إزالة الفاصلة الأخيرة من السلسلة “aaa،bbb،ccc،ddd،”. يمكن القيام بذلك باستخدام الدالة rtrim() التي تقوم بإزالة الحروف من نهاية السلسلة.

    php
    $values1 = "aaa,bbb,ccc,ddd,"; $values1 = rtrim($values1, ','); echo $values1; // سيطبع "aaa,bbb,ccc,ddd" ?>

    ٢. إزالة الفواصل قبل القيمة المحددة

    في هذه الحالة، نحتاج إلى إزالة جميع الفواصل قبل القيمة “bbb” في السلسلة “aaa،bbb،،،”. يمكن استخدام الدالة strstr() للبحث عن القيمة المحددة ومن ثم استخدام الدالة substr() لاستخراج الجزء الأول من السلسلة دون الفواصل.

    php
    $values2 = "aaa,bbb,,,"; $values2 = strstr($values2, 'bbb'); $values2 = ltrim($values2, ','); echo $values2; // سيطبع "bbb,,," ?>

    باستخدام الطرق المذكورة أعلاه، يمكنك بسهولة إزالة الفواصل غير المرغوب فيها من السلاسل في لغة PHP والحصول على النتائج المرجوة.

  • استخدام @inline والدوال مقابل الماكرو في جوليا

    في العمل مع لغة برمجة جوليا، تأتي الحاجة إلى فهم كيفية عمل الإعلانات والاختلافات بين استخدام الدوال والماكرو. يظهر ذلك في سياق تحسين الأداء وتوفير الوقت والجهد في تطوير البرمجيات.

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

    1. الدوال:

      • عند استخدام الدوال، تكون لديك مزايا مثل قابلية إعادة الاستخدام وتنظيم الكود.
      • إذا قمت بتضمين الكلمة الرئيسية @inline فإنك تقوم بتعليم المترجم بتضمين الكود الخاص بالدالة مباشرة في المكان الذي تتم فيه الاستدعاء.
      • يمكن أن يكون هناك تكلفة زمنية إضافية في عملية الاستدعاء للدالة إذا كانت غير مضمنة (أي غير مُعلمة بـ @inline)، لكن هذا يمكن أن يكون غير ملحوظ في العديد من الحالات.
    2. الماكرو:

      • يقوم الماكرو بتبديل النص الأصلي بنص الماكرو قبل مرحلة الترجمة، مما يؤدي إلى توليد كود أقل بتعليمات وبالتالي قد يكون أكثر كفاءة.
      • ومع ذلك، يجب أن تكون حذرًا عند استخدام الماكرو، لأن أخطاء الترجمة قد تكون صعبة لتتبعها وتصحيحها.

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

    المزيد من المعلومات

    عند النظر إلى الأسئلة المطروحة حول الاستخدام المناسب لـ @inline والفروق بين استخدام الدوال والماكرو في جوليا، يمكن أن نلقي نظرة عميقة على كل من الجوانب التقنية والأداء.

    أولاً، دعونا نتناول دور @inline في جوليا. عند استخدام @inline مع دالة، فإنه يُطلب من المترجم تضمين جسم الدالة مباشرة في المكان الذي يتم فيه استدعاءها بدلاً من إنشاء نقطة فرعية لها. هذا يعني أنه عند استخدام @inline، يتم تضمين الكود الخاص بالدالة مباشرة في النقاط التي يتم فيها استخدامها، وهذا يمكن أن يؤدي إلى تحسين الأداء في الحالات التي يتم فيها استدعاء الدالة بكثرة.

    ومع ذلك، يجب أن نتذكر أن استخدام @inline يمكن أن يؤدي إلى زيادة في حجم الكود وذلك بسبب تكرار جسم الدالة في عدة أماكن. هذا قد يؤدي في بعض الأحيان إلى زيادة في حجم الذاكرة المطلوبة وتأخير في وقت التشغيل.

    من الناحية الأخرى، الماكرو في جوليا يعمل عن طريق استبدال الشفرة الماكرو بالشفرة الفعلية قبل ترجمة البرنامج. هذا يعني أنه يتم تضمين شفرة الماكرو مباشرة في الشفرة النهائية وبالتالي لا تكون هناك أي تكلفة زمنية لاستدعاء الماكرو.

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

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

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

  • استدعاء الدوال قبل التعريف في JavaScript

    بالتأكيد، يمكننا استكشاف هذا الموضوع بعمق.

    في لغة JavaScript، يعتمد تنفيذ الدوال على ترتيب الشيفرة. ومع ذلك، هناك استثناءات تسمح لنا بالتعامل مع هذه الحالات، واحدة منها هي استخدام التعبيرات الدالة (Function Expressions).

    عندما تُعرَّف الدالة باستخدام التعبير الدالة، يمكن استدعاؤها قبل التعريف بسبب عملية الرفع (Hoisting) التي تحدث في JavaScript. ولكن يجب أن تأخذ في اعتبارك أن الطريقة التقليدية لتعريف الدوال (Function Declarations) لا تدعم هذه القدرة.

    فلنقم بتعديل ملف test.js لاستخدام تعبير الدالة بدلاً من التعريف العادي كما يلي:

    javascript
    var testing = function() { document.write("

    Test1

    "
    ); };

    الآن يمكنك استدعاء الدالة testing() في أي مكان في الصفحة حتى قبل تضمين ملف test.js، وستعمل بشكل صحيح.

    فيما يلي مثال لصفحة HTML توضح كيفية استخدام ذلك:

    html
    html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Testing Function Call Before Declarationtitle> head> <body> <script> testing(); script> <script src="test.js">script> body> html>

    باستخدام هذا النهج، يمكنك الآن استدعاء الدالة قبل تضمين ملف test.js في الصفحة.

    المزيد من المعلومات

    بالتأكيد، دعنا نستكمل المقال:


    بالتأكيد، يمكننا استكشاف هذا الموضوع بعمق.

    في لغة JavaScript، يعتمد تنفيذ الدوال على ترتيب الشيفرة. ومع ذلك، هناك استثناءات تسمح لنا بالتعامل مع هذه الحالات، واحدة منها هي استخدام التعبيرات الدالة (Function Expressions).

    عندما تُعرَّف الدالة باستخدام التعبير الدالة، يمكن استدعاؤها قبل التعريف بسبب عملية الرفع (Hoisting) التي تحدث في JavaScript. ولكن يجب أن تأخذ في اعتبارك أن الطريقة التقليدية لتعريف الدوال (Function Declarations) لا تدعم هذه القدرة.

    فلنقم بتعديل ملف test.js لاستخدام تعبير الدالة بدلاً من التعريف العادي كما يلي:

    javascript
    var testing = function() { document.write("

    Test1

    "
    ); };

    الآن يمكنك استدعاء الدالة testing() في أي مكان في الصفحة حتى قبل تضمين ملف test.js، وستعمل بشكل صحيح.

    فيما يلي مثال لصفحة HTML توضح كيفية استخدام ذلك:

    html
    html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Testing Function Call Before Declarationtitle> head> <body> <script> testing(); script> <script src="test.js">script> body> html>

    باستخدام هذا النهج، يمكنك الآن استدعاء الدالة قبل تضمين ملف test.js في الصفحة.

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

    أتمنى لك التوفيق في استخدام الدوال في JavaScript بطرق مبتكرة وفعالة!

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

يرجى تعطيل مانع الإعلانات حيث أن موقعنا غير مزعج ولا بأس من عرض الأعلانات لك فهي تعتبر كمصدر دخل لنا و دعم مقدم منك لنا لنستمر في تقديم المحتوى المناسب و المفيد لك فلا تبخل بدعمنا عزيزي الزائر