باعتبارنا مطورين لـ Flutter، فإننا نهدف إلى جودة الكود في تطبيقات Flutter الخاصة بنا من خلال كتابة كود نظيف وقابل للصيانة ويتبع أفضل الممارسات. إحدى الطرق لتحقيق ذلك هي استخدام أدوات تحلل الكود الخاص بنا وتساعدنا في تحديد المشكلات المحتملة. في حين أن Flutter لديه مجموعة قواعد خاصة به للتحقق من الكود الخاص بنا، فهناك حزم إضافية يمكن أن تساعدنا في تحسين جودة الكود بشكل أكبر.
تحليل كود مشروعك
عند بدء مشروع جديد، يتم تضمين حزمة Flutter Lints بالفعل في مشروعك. تتضمن حزمة Flutter Lints https://pub.dev/packages/flutter_lints مجموعة مقترحة من قواعد التدقيق لتطبيقات Flutter والحزم والمكونات الإضافية لتعزيز أفضل الممارسات.
التدقيق هو عملية تشغيل برنامج يعمل على تحليل الكود بحثًا عن أخطاء محتملة.
لتحليل مشروعك بحثًا عن أي أخطاء في التدقيق، يمكنك تنفيذ الأمر التالي:
flutter analyze
بعد تنفيذ الأمر، سيتم تحليل مشروعك وإرجاع جميع أخطاء التدقيق.
بالطبع، من الممكن أيضًا ألا يكون لديك أي أخطاء في التدقيق.
على الرغم من أن حزمة Flutter Lints القياسية تكتشف العديد من أخطاء التدقيق، إلا أنه يمكننا التبديل إلى حزمة Very Good Analysis لتحسين جودة الكود لدينا بشكل أكبر.
تحليل جيد جدًا
تتضمن حزمة https://verygood.ventures قواعد التدقيق اللغوي التي تستخدمها Very Good Ventures ، وهي شركة تتمتع بخبرة في تصميم وبناء وتوسيع تطبيقات Flutter الناجحة للعملاء الرئيسيين. لقد أنشأوا هذه الحزمة لضمان إنتاج فريق التطوير الخاص بهم لأكواد عالية الجودة وموثوقة. بدلاً من إعادة اختراع العجلة، يمكننا تبني ممارساتهم المثبتة من خلال تنفيذ هذه الحزمة في مشروعنا.
تثبيت الحزمة https://pub.dev/packages/very_good_analysis
لاستخدام حزمة Very Good Analysis ، نحتاج إلى إضافتها كاعتمادية تطوير في ملف مشروعنا pubspec.yaml. يمكننا القيام بذلك من خلال تنفيذ الأمر التالي:
flutter pub add very_good_analysis –dev
–devسيضمن العلم تثبيت الحزمة أسفل . dev_dependenciesالحزم المدرجة أدناه dev_dependenciesمتاحة فقط أثناء التطوير، وهو ما نحتاجه على وجه التحديد نظرًا لأن الحزمة ليست مطلوبة في الإنتاج.
بمجرد تنفيذ الأمر، تحقق من pubspec.yaml ملفك بحثًا عن التبعيات المضافة. يجب أن ترى حزمة Very Good Analysis المضمنة في القسم dev_dependencies ، مثل هذا:
dev_dependencies:
very_good_analysis: ^6.0.0
إزالة Lints من Flutter
نظرًا لأننا نستخدم الآن حزمة Very Good Analysis، فيمكننا إزالة حزمة Flutter Lints من خلال تنفيذ الأمر التالي:
flutter pub remove flutter_lints
يمكنك التأكد من إزالة حزمة Flutter Lints عندما لم تعد موجودة أسفل dev_dependenciesقسم ملفك pubspec.yaml.
تغيير خيارات التحليل
الآن بعد أن قمنا بتثبيت الحزمة، نحتاج إلى تغيير includeإدخال analysis_options.yamlالملف للإشارة إلى حزمة Very Good Analysis:
include: package:very_good_analysis/analysis_options.yaml
linter:
rules:
بعد تكوين analysis_options.yamlالملف، أصبحنا الآن جاهزين لاستخدام حزمة Very Good Analysis.
تحليل كود مشروعك باستخدام تحليل جيد جدًا
في قسم تحليل كود مشروعك من هذه المقالة، استخدمنا حزمة Flutter Lints لتحليل الكود. اكتشفت حزمة Flutter Lints 9 أخطاء في التدقيق. في القسم التالي، سنستخدم حزمة Very Good Analysis لتحليل نفس الكود.
تنفيذ أمر Flutter Analyze
تمت كتابة الكود التالي فقط لاستخدامه لتوضيح استخدام حزمة Very Good Analysis.
import ‘dart:math’;
void main() {
int myVariable= 10;
print(‘The value of myVariable is $myVariable’);
void complexMethod() {
for (int i = 0; i < 100; i++) {
if (i % 2 == 0) {
print(i);
}
}
}
void calculateTotalPrice(double price, int quantity) {
dynamic total = price * quantity;
print('Total price: $total');
}
}
class myClass {
late String first_name;
void displayMessage() {
print('Hello, World!');
}
}
بمجرد تشغيل البرنامج flutter analyzeنحصل على أخطاء التدقيق التالية:
كما ترى، حددت حزمة Very Good Analysis 18 خطأً في التدقيق. وذلك لأنها تحتوي على عدد أكبر من قواعد التدقيق مقارنة بحزمة Flutter Lints.
قد يبدو عدد أخطاء التدقيق أمرًا شاقًا في البداية، ولكن من السهل حلها. إذا كنت تستخدم بيئة تطوير متكاملة، فسوف تبرز أخطاء التدقيق لك. وكما ترى، فإن الرسائل واضحة بذاتها، بل إنها تعرض الملف ورقم السطر.
إصلاح أخطاء التنقيط التي تم العثور عليها بواسطة Dart Analyzer
الآن بعد أن عرفنا أخطاء التدقيق التي نواجهها، فلنبدأ في معالجتها. إليك الكود المحسن:
// ignore_for_file: avoid_print
void main() {
const myVariable = 10;
print(‘The value of myVariable is $myVariable’);
void complexMethod() {
for (var i = 0; i < 100; i++) {
if (i.isEven) {
print(i);
}
}
}
complexMethod();
void calculateTotalPrice(double price, int quantity) {
final total = price * quantity;
print(‘Total price: $total’);
}
calculateTotalPrice(5, 5);
}
/// My class
class MyClass {
/// firstname
late String firstName;
/// displayMessage
void displayMessage() {
print(‘Hello, World!’);
}
}
لإصلاح المشكلات، أجرينا التغييرات التالية:
الاستيراد غير المستخدم: لقد قمنا بإزالة عبارة الاستيراد غير المستخدمة ‘dart:math’لأنها لم تكن مستخدمة في الكود الخاص بنا.
تفضيل المحليات النهائية: لقد قمنا بتغيير إعلان myVariablefrom int myVariable = 10;إلى const myVariable = 10;. هذا التغيير يجعله متغيرًا ثابتًا، مما يشير إلى أن قيمته لن تتغير.
حذف أنواع المتغيرات المحلية:for (int i = 0; i < 100; i++) تم استبدال التعليق الصريح للنوع في بـ var، مما يسمح لاستنتاج نوع Dart بتحديد النوع.
تجنب الطباعة: اقترح المحلل تجنب استخدام printالكود في الإنتاج. نظرًا لأن printالعبارات الموجودة داخل mainالوظيفة كانت لأغراض العرض التوضيحي، فقد تجاهلنا تحذير الوبر باستخدام // ignore_for_file: avoid_print.
العنصر غير المستخدم: نقوم الآن باستدعاء الوظائف غير المستخدمة complexMethodلحل calculateTotalPriceالتحذير.
استخدم isEven بدلاً من % 2: أوصى المحلل باستخدام isEvenالخاصية بدلاً من عامل modulo % 2في ifالشرط. لقد قمنا بتحديث الشرط من if (i % 2 == 0)إلى if (i.isEven).
الوثائق المفقودة واتفاقيات التسمية: لقد عالجنا مشكلات الوثائق المفقودة واتفاقيات التسمية للفئة MyClass. لقد أضفنا تعليقات على الوثائق /// My classو /// firstnameو و /// displayMessage. كما قمنا بتغيير اسم المتغير first_nameإلى firstNameليتبع lowerCamelCaseاتفاقية التسمية.
انتهاء الصلاحية في نهاية الملف: أوصى المحلل بإضافة سطر جديد في نهاية الملف، لذا أضفنا سطرًا فارغًا لتلبية هذا المطلب.
تذكر، إذا كنت تستخدم IDE، فسوف يسلط الضوء على أخطاء التدقيق هذه، مما يجعل من السهل عليك التعرف عليها وحلها.
تعطيل قواعد معينة
هناك طرق متعددة لتعطيل قاعدة معينة، ويمكن تعطيل القواعد حسب السطر، أو حسب الملف (كما هو موضح في القسم السابق)، أو على مستوى المشروع.
1. تجاهل سطر واحد: استخدم // ignore:التعليق لتعطيل قاعدة معينة لسطر واحد من التعليمات البرمجية. يمكنك تحديد اسم القاعدة بعد // ignore:التعليق. على سبيل المثال:
// ignore: avoid_print
- تجاهل الملف بالكامل: استخدم // ignore_for_file:التعليق لتعطيل قاعدة معينة للملف بالكامل. يمكنك تحديد اسم القاعدة بعد التعليق // ignore_for_file:. على سبيل المثال:
// ignore_for_file: public_member_api_docs
3. تخصيص خيارات التحليل: في بعض الحالات، قد ترغب في تعطيل قاعدة على مستوى العالم لمشروعك. للقيام بذلك، يمكنك تخصيص الملف analysis_options.yamlوتكوين القاعدة المحددة ليتم تجاهلها. يتيح لك هذا تعطيل قاعدة على مستوى المشروع بالكامل. على سبيل المثال:
include: package:very_good_analysis/analysis_options.yaml
linter:
rules:
public_member_api_docs: false
من المهم استخدام هذه الطرق بحذر وتعطيل القواعد فقط عند الضرورة القصوى. تم وضع القواعد للمساعدة في الحفاظ على جودة التعليمات البرمجية واتباع أفضل الممارسات، لذا يجب إيقاف تشغيلها بعناية.