دليل اختيار المكتبة المناسبة لمشروعك

mosaedbمنذ 7 سنوات

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

ملحوظة جانبية: هذه المقالة تتكون من جزئين: نظري وعملي.

الجزء النظري:

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

  • هل هذه الميزة موجودة في تطبيقات أخرى؟
  • هل تقوم بنسخ ولصق كود هذه الميزة بشكل متكرر في تطبيقاتك؟
  • هل تظن باحتمالية برمجة هذه الميزة من قبل مبرمج آخر؟

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

أما طريقة البحث فيمكن من خلال المراجع التالية لاستكشاف المكتبات المناسبة:

لكن كيف أتأكد أن المكتبة التي اخترتها هي المكتبة المناسبة لمشروعي؟ هناك مواصفات ونصائح للمكتبة المناسبة يمكن إجمالها في النقاط التالية:

  1. الصيانة Maintenance
    • أندرويد نظام يتطور باستمرار وكذا ينبغي لمكتباتها، فبعض المكتبات تتوقف عن التطور عند إصدار نسخة جديدة من أندرويد، بالتالي تتوقف صيانتها وتُهجر [deprecated]، فإذا كنت تستخدم واحدة من هذه المكتبات المهجورة فسيتعطل تطوير تطبيقك بلا شك.
    • من الذي يقوم بصيانة المكتبة؟ هل هو شخص واحد؟ أو مجموعة أفراد؟ أو شركة مثل: Google أو Square؟ المعنى أنه كلما كان مجتمع المكتبة أكبر كلما كانت صيانة المكتبة مستمرة.

    • هل صيانة المكتبة مستمرة؟ ومتى كان آخر تحديث لها؟ بإمكانك معرفة ذلك من صفحة المكتبة على GitHub والبحث عن آخر الإصدارات [releases] وعن آخر إيداع [Latest commit]، وأيضاً من التبويب insights ثم Graphs.

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

    • توثيق المكتبة ستجده في أحد أو كل ما يلي:

      • صفحة المكتبة على GitHup (ملف README.md)

      • صفحة المكتبة على GitHup تحت التبويب: Wiki

      • صفحة أو موقع خاص بالمكتبة.

  2. القضايا المعروفة Known issues

    • يمكن الاطلاع عليها من خلال صفحة المكتبة على GitHub من خلال التبويب Issues.

    • تأكد أنه لا توجد مشاكل مفتوحة بإمكانها التأثير على تطبيقك.

  3. الميزات Features

    • ابحث عن المكتبة في Google متبوعة بـ vs، مثل: picasso library vs.

    • قارن المكتبات التي تؤدي نفس الغرض ثم اختر المكتبة الأنسب لمشروعك والتي لا تحتوي على ميزات إضافية لا تحتاجها، لأن ميزاتٍ أكثر تعني حجم تطبيق (apk) أكبر.

  4. الرخصة License

    • أغلب الرخص تطالب بإدراج نسخة من حقوق النشر [copyright] إلى تطبيقك.

    • بعضها يزيد فيطالب بمتطلبات أخرى، مثلاً Google Maps يطالب بإضافة: "Map data ©2015 Google" كعلامة مائية كما في الصورة التالية أسفل اليمين:

    • maps-att.png.d8c00e6dff50eef0f1874f9e7d0cf641.png

    • وبعض رخص المكتبات يطالب بجعل المشروع مفتوح المصدر [Open Source].

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

    • زبدة الموضوع اقرأ رخصة المكتبة التي تنوي استخدامها جيداً.

    • مرجع مساعد لمعرفة أنواع الرخص: https://choosealicense.com

  5. الحذر من ازدياد حجم التطبيق متأثراً بكثرة المكتبات المستخدمة، حتى لا تواجه مشكلة: 64K Method Limit

ماذا إذا لم تجد المكتبة المناسبة؟ وكنت تحتاج هذه الميزة بشكل متكرر في تطبيقاتك؟ الجواب هو: النسخ واللصق :) وأفضل من ذلك أن تُنشأ مكتبتك الخاصة وهذا: دليل إنشاء مكتبة أندرويد.

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

 

الجزء العملي:

في هذا الجزء سنعتمد على أحد تطبيقات المهام الموجودة هنا والمسمى: todo‑mvp، ولمتابعة التطبيق يلزمك التالي:

  1. برنامج Android Studio
  2. برنامج إدارة الإصدارات Git

خطوات تنزيل مشروع المهام todo‑mvp:

  1. انسخ رابط المشروع: 

    https://github.com/googlesamples/android-architecture.git

     

  2. افتح برنامج Git Bash.

  3. غير إلى المجلد الذي تريد استنساخ المشروع إليه، على سبيل المثال:

    cd D:\AndroidStudioProjects

     

  4. استنسخ المشروع بالأمر git clone وألصق الرابط السابق:

    git clone https://github.com/googlesamples/android-architecture.git

     

  5. انتقل للمشروع:

    cd android-architecture

     

  6. ثم انتقل للتفريع todo-mvp كالتالي:

    git checkout todo-mvp

     

  7. افتح أندرويد استديو ثم:

    Open an existing Android Studio project >> [path to android-architecture folder] >> todoapp

     

  8. شغل التطبيق. إذا سارت الأمور على ما يرام ستظهر لك هذه الواجهة:

  9. Screenshot_1501654819.thumb.png.05a3e32386d9755c0d6d4978039a253a.png

  10. أضف بعض المهام بالضغط على الأيقونة الحمراء.

  11. ثم اضغط على الأيقونة ☰، ثم Statistics، ستظهر لديك إحصائية بالمهام النشطة والمكتملة بشكل نصي كما يلي:

  12. Screenshot_1501910771.thumb.png.f6a9e407c47a6b2286b7fdfd637b67d2.png

 

مهمتنا هي إضافة جانب رسومي للإحصائية وتحسين شكل (الميزة ص).

خطوات البحث عن مكتبة:

هل الميزة ص (تمثيل البيانات الإحصائية بطريقة رسومية) موجودة في تطبيقات أخرى؟

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

unnamed.thumb.png.0c547567375cae7f94df9c3d36469403.png

لنطبق معايير التي ذكرنها على هذه المكتبة:

  1. الصيانة:
    • مجموع المساهمين 57 منهم مؤسس المكتبة PhilJay و4 مساهمين رئيسيين وجه لهم المؤسس شكر خاص أسفل صفحة المكتبة. ما يهمنا أن مجتمع المكتبة كبير وهو مؤشر على استمرارية الصيانة.
    • آخر إصدار للمكتبة بتاريخ Mar 23, 2017 وآخر تحديث للمكتبة كان في Jul 20, 2017 وهو تاريخ قريب، وأنشئت المكتبة بتاريخ Apr 25, 2014.
    • المكتبة موثقة بشكل جيد في التبويب Wiki وتحتوي على أمثلة ونماذج وتطبيق لتجربتها.
  2. القضايا المعروفة:
    1. نحن سنستخدم [Pie Chart] أو المخطط الدائري ولا توجد أخطاء [bugs] قد تؤثر على عملنا حتى كتابة هذه المقالة.
  3. الميزات:
    • ابحث في قوقل عن: MPAndroidChart vs، من ضمن النتائج هذه المقارنة والتي تعطي الأفضلية لهذه المكتبة.
  4. الرخصة:

خطوات استخدام المكتبة في المشروع:

  1. إضافة الاعتماد في ملف build.gradle:
    • على مستوى المشروع [project level]: 
      
      allprojects {
        repositories {
          jcenter()
          maven { url "https://jitpack.io" } //إضافة هذا السطر
        }
      }

       

    • وعلى مستوى التطبيق [app level]: 

      
      dependencies {
          ...
          compile 'com.github.PhilJay:MPAndroidChart:v3.0.2'
      }

       

  2. ثم زامن ملفات gradle.

  3. انتقل إلى ملف statistics_frag.xml وأضف View من نوع المخطط الدائري: 

    
    <com.github.mikephil.charting.charts.PieChart
            android:id="@+id/chart"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    وعدل طول TextView إلى: 

    
    android:layout_height="wrap_content"

    سنحصل على النتيجة التالي: 

  4. layout-2017-08-05-063420.thumb.png.5caf7b40b52d50e2889e4fe17b493088.png

  5. في ملف StatisticsFragment.java نضيف متغير من النوع PieChart: 

    
    private TextView mStatisticsTV;
    private PieChart mPieChart;

     

  6. ثم في الإجراء [method] المسمى onCreateView نضيف: 

    
    mStatisticsTV = (TextView) root.findViewById(R.id.statistics);
    mPieChart = (PieChart) root.findViewById(R.id.chart); // هذا السطر

     

  7. الآن كل ما نحتاجه هو تعديل الإجراء showStatistics في ملف StatisticsFragment.java: 

    
    ...
    mStatisticsTV.setText(displayString); // نضيف التالي بعد هذا السطر
    
    // لحساب النسبة المئوية للمهام النشطة والمكتملة
    float total = numberOfIncompleteTasks + numberOfCompletedTasks;
    float percentOfIncompleteTasks = numberOfIncompleteTasks / total * 100;
    float percentOfCompletedTasks = numberOfCompletedTasks / total * 100;
    
    // مصفوفة المدخلات وكلما أضفنا مُدخل جديد سيزيد عدد الحصص في المخطط الدائري
    List<PieEntry> entries = new ArrayList<>();
    
    // إذا كان لدينا مهمة أو مهام غير مكتملة
    if (numberOfIncompleteTasks != 0) {
       // نضيف حصة إلى المخطط الدائري بعنوان نشط
       entries.add(new PieEntry(percentOfIncompleteTasks, "نشط"));
    } else {
       // وإلا سنضيف كلمة "أحسنت" في منتصف المخطط الدائري لأننا أنجزنا جميع المهام
       mPieChart.setCenterText("أحسنت");
    }
    
    // إذا كان لدينا مهمة أو مهام مكتملة
    if (numberOfCompletedTasks != 0) {
       // نضيف حصة إلى المخطط الدائري باسم مكتملة
       entries.add(new PieEntry(percentOfCompletedTasks, "مكتملة"));
    }
    
    // الكائن التالي يحتوي المدخلات السابقة والتي يجب أن تكون من نفس النوع
    // ويسمح بإضفاء اللمسات التصميمية
    PieDataSet dataSet = new PieDataSet(entries, "");
    dataSet.setColors(ColorTemplate.MATERIAL_COLORS);
    dataSet.setValueFormatter(new PercentFormatter());
    dataSet.setValueTextSize(14);
    
    // لإضافة الوصف الذي يظهر أسفل اليمين
    Description description = new Description();
    description.setText("إحصائية المهام");
    mPieChart.setDescription(description);
    
    // الكائن التالي يحتوي كائن مجموعة البيانات السابق
    PieData data = new PieData(dataSet);
    mPieChart.setData(data);
    // للتحديث
    mPieChart.invalidate();

     

  8. سنحصل على النتيجة التالي:

  9. Screenshot_1501908930.thumb.png.ff24df53fadeb8a30a0a7fd413bea983.png

هذا والله أعلم وصلى الله وسلم على نبينا محمد.

المراجع:

كلمات دليلية:
0
إعجاب
3355
مشاهدات
0
مشاركة
0
متابع
متميز
محتوى رهيب

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !