أفضل الممارسات عند البرمجة في ماتلاب

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


Babak. K. Shandiz, CC BY-SA 4.0, via Wikimedia Commons



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

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


أولاً: الممارسات التي ينصح بها


1) قم بكتابة الكود للأشخاص وليس للحواسيب

من أجل سهولة قراءة الكود من قبل الآخرين، وحتى من قبلك كمبرمج للكود، حاول تقسيم البرنامج إلى دالات سهلة الفهم تقوم كل منها بمهمة واضحة، وبحيث يكون لها أسماء دقيقة ومميزة وقابلة للقراءة والفهم.


2) قم بإضافات تراكمية

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


3) حافظ على الأسطر قصيرة

استخدم حرف الاستمرار (علامة الحذف) ... من أجل متابعة العبارات الطويلة

مثال:

يمكن استخدام

MyFunc( parameter1, ...

parameter2, ...

parameter3, ...

parameter4, ...

parameter5, ...

parameter6, ...

parameter7, ...

parameter8, ...

parameter9)

بدلاً من

4) استخدم المسافات البادئة بشكل صحيح

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

انظر مثلاً للكود التالي:


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



وهذا يبين بوضوح بداية ونهاية الحلقة وعبارات If.

يمكنك تطبيق مسافات بادئة ذكية عن طريق:

i.تحديد كامل الكود (Ctrl+A)

ii.ثم الضغط على Ctrl+I أو النقر على  من شريط التحرير.



5) استخدم التأكد (assert)

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



6) تجنب الحلقات

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

أمثلة

يمكن استخدام




بدلاً من

ويمكن استخدام




بدلاً من




يمكنك الذهاب إلى الرابط التالي https://sodocumentation.net/matlab/topic/750/vectorization من أجل تفاصيل أكثر عن التوجيه (vectorization).


7) أنشئ اسما وحيدا للملف المؤقت

قد تحتاج في بعض الحالات إلى ملف مؤقت واحد أو أكثر من أجل تخزين بعض البيانات عند كتابة الكود لدالة (function) أو برنامج نصي (script).

لكي تتجنب الكتابة فوق ملف موجود، يمكنك استخدام الدالة tempname لتوليد اسم وحيد من أجل الملف المؤقت في المجلد المؤقت للنظام.


يتم توليد اسم الملف بدون لاحقة، والتي يمكن إضافتها عن طريق وصل اللاحقة المطلوبة مع الاسم المولد بواسطة tempname


يمكن تحديد موقع المجلد المؤقت للنظام باستدعاء الدالة tempdir.

يمكن، في حال انتهاء الحاجة للملف المؤقت أثناء تنفيذ الدالة/البرنامج النصي، حذفه باستخدام الدالة delete.

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

يمكن القيام بهذا باستخدام الدالة recycle بهذه الطريقة:


تجد في المثال التالي استخداماً ممكناً للدالات tempname وdelete وrecycle



8) استخدم validateattributes

يمكن استخدام الدالة validateattributes للتحقق من مواصفات صفيف (array)، ولذلك يمكن استخدامها للتحقق من الإدخال الوارد إلى الدالة.

تحتاج الدالة test_validateattributes في المثال التالي إلى ثلاثة إدخالات




مواصفات الإدخال هي:

يمكن استدعاء الدالة من أجل التحقق من الإدخالات الثلاثة باستخدام بناء الجملة التالي:


validateattributes(A,classes,attributes,funcName,varName,argIndex)

حيث:

A هو الصفيف الذي سيتم التحقق منه

classes: هو نوع الصفيف (مثل single, double, logical)

attributes: هي السمات التي يجب أن يحققها صفيف الإدخال (مثل [3,2], size لتحديد حجم الصفيف، nonnan لتحديد أن الصفيف يجب أن لا يملك قيم NaN)

funcName: هو اسم الدالة التي سيجري فيها التحقق. سيتم استخدام هذا الوسيط في توليد رسالة الخطأ (إن وجدت)

varName: هو اسم الصفيف الذي يتم التحقق منه. يجري استخدام هذا الوسيط في توليد رسالة الخطأ (إن وجدت)

argIndex: هو موضع صفيف الإدخال في قائمة الإدخالات. سيتم استخدام هذا الوسيط في توليد رسالة الخطأ (إن وجدت).

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

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


9) استخدم عامل كتلة التعليقات

يعتبر استخدام التعليقات من الممارسات الجيدة التي تساعد على وصف الكود، وهي مفيدة للآخرين وحتى للمبرمج نفسه عندما يعود إلى الكود لاحقاً. يمكن كتابة سطر واحد من التعليقات بوضع الرمز % أو استخدام مفتاح الاختصار Ctrl+R، ويمكن إلغاء التعليق عن سطر ما بإزالة الرمز % أو استخدام مفتاح الاختصار Ctrl+T.

بينما يمكن إنشاء كتلة من التعليقات داخل الكود بإضافة الرمز % في بداية كل سطر، تسمح لك النسخ الأحدث من MATLAB (بعد 2015a) باستخدام عامل كتلة التعليقات %{ code }%. يزيد هذا العامل من قابلية القراءة للكود، ويمكن استخدامه من أجل كتل التعليقات وتوثيق تعليمات الدالة. يمكن طي وتوسيع الكتلة لتحسين قابلية القراءة للكود.



كما هو مبين، يجب أن تظهر العوامل %{ و }% وحيدة في السطر. لا تقم بوضع أي نص آخر في هذه الأسطر.


10) قم بتحسين البرنامج فقط بعد أن يعمل بشكل صحيح

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


ثانياً: الممارسات التي يفضل تجنبها

a)Eval

إن EVAL موجود مع المتغيرات العمومية. يقوم مستخدم MATLAB غالباً بوصل أوامر MATLAB معاً للحصول على أسماء متغيرات تسلسلية s1, s2, s3… ليقوم بعدها باستخدام عبارة EVAL أخرى للعمل مع أسماء المتغيرات التسلسلية! غالباً، سيعمل صفيف مفهرس مع s{1}, s{2}, s{3}… بشكل أفضل بكثير.

المكان الآخر الذي يتم فيه استخدام EVAL عندما لا تكون ضرورية هو عند محاولة تحميل ملف أو أي دالة أخرى مشابهة. يتم غالباً استخدام EVAL لحساب قيمة سلسلة مثل "load filename.mat" بينما هناك شكل وظيفي أفضل، حيث يمكن استخدام

fileNameString = ‘filename.mat’; load(fileNameString)


b) المتغيرات العمومية (Globals)

بشكل عام، لا تعتبر المتغيرات العمومية ضرورية في أي كود ضمن MATLAB، باستثناء الدالات TIC وTOC التي تعتمد عليهم. في أغلب الحالات التي يتم استخدام المتغيرات العمومية فيها، يكون المبرمج لا يملك تصوراً واضحاً عن نطاق رؤية المتغيرات، ولذلك يقوم باستخدام متغيرات عمومية (globals) بدلاً من تمرير المتغيرات من دالة إلى أخرى.

c) الملفات الطويلة جداً

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

d) تخزين البيانات داخل ملف كود MATLAB

يفضل البعض وضع المتغيرات مباشرة داخل كود MATLAB. بينما يعتبر هذا مقبولاً بالنسبة للمتغيرات الصغيرة، مثل مصفوفة 3*3 مثلاً، ولكنه لن يكون جيداً من أجل متغيرات أكبر مثل مصفوفة 10*10 أو 100*100.

e) أسماء المتغيرات السيئة

تكون أسماء المتغيرات أحياناً هي التعليقات الوحيدة الموجودة في الكود، لذلك تعتبر أسماء المتغيرات ذات المعنى الملائم فرصة جيدة لجعل الكود أكثر وضوحاً وذاتي التوثيق إلى حد ما. تجنب استخدام أسماء متغيرات مثل temp, aaa, r247899921، لأن هذا لن يعطي الشخص الذي يقرأ الكود معلومات كالتي سيحصل عليها فيما لو كانت أسماء المتغيرات مثلاً flagPassedInspection, centroidX, fidCureentFile.

f) عدم استخدام الفراغات بشكل جيد داخل الكود

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

g) استخدام ans أو أي دالة MATLAB أخرى كاسم متغير أو دالة

عندما تفعل ذلك، سيقوم MATLAB باستدعاء ما هو أعلى في المسار، الأمر الذي يمكن أن يؤدي إلى سلوك غريب عند تعريف دالة بهذا الشكل. تجنب استخدام المفردات الشائعة كأسماء للدالات مثل mean, filter…، وإذا لم تكن متأكداً يمكنك استخدام الأمر which للتأكد من وجود دالة باسم معين.

h) استخدام واجهة مستخدم رسومية (GUI) بألون مبهرة

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

i) رسم مقدار كبير من البيانات

تحتوي شاشات الحواسيب على ملايين النقاط، وإذا قمت بمحاولة رسم قدر كبير من البيانات عليها سيؤدي ذلك إلى بطء في أداء تلك الأجهزة. هناك غالباً عدة طرق أفضل لرسم البيانات، ويمكنك أن تجد مثالاُ عن طريقة عرض البيانات بشكل واضح بدون التحميل الزائد للذاكرة في الرابط التالي https://blogs.mathworks.com/videos/2010/01/22/advanced-making-a-2d-or-3d-histogram-to-visualize-data-density/.

j) عدم استخدام الأصفار على اليسار

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