مشروع التخرّج: تطبيق جافا حقيقي

نظرة عامة على المشروع الختامي ومتطلباته

15 دقيقة الدرس 1 من 13

نظرة عامة على المشروع الختامي ومتطلباته

لقد أتممتَ رحلتك عبر البرمجة كائنية التوجه (OOP)، والأنواع العامة (Generics)، والمجموعات (Collections)، والتدفقات (Streams)، والتزامن (Concurrency)، والإدخال/الإخراج (I/O)، وJDBC. يجمع هذا المشروع الختامي كل هذه المفاهيم في تطبيق واحد متماسك. لن تكون هذه مجرد تمرينًا معزولًا، بل ستبني برنامجًا صغيرًا لكنه واقعي — يمكنك عرضه بثقة في مراجعة كود أو معرض أعمال احترافي.

ماذا سنبني؟

المشروع هو متتبّع مالية شخصية — تطبيق سطر أوامر يتيح للمستخدم تسجيل معاملات الدخل والمصروفات وتصنيفها، وتوليد تقارير ملخصة، وحفظ البيانات في قاعدة بيانات SQLite محلية بين جلسات التشغيل.

تم اختيار هذا المجال بعناية لبساطته (كل شخص يفهم مفهوم دخل/مصروف) حتى تتمكن من التركيز على كيفية هيكلة الكود لا على استيعاب مجال معقد. وبرغم هذه البساطة، يستدعي التطبيق كل ما تعلمته:

  • OOP والتصميم — كيانات وخدمات ومستودعات وطبقة تطبيق خفيفة.
  • Generics والمجموعات — قوائم مُنوَّعة، خرائط لتجميع الفئات، إرجاعات اختيارية.
  • Streams واللامدا — تصفية بيانات المعاملات وتجميعها وفرزها واختزالها.
  • JDBC — قراءة وكتابة بيانات SQLite؛ إنشاء المخطط تلقائيًا عند أول تشغيل.
  • I/O — قراءة إدخال المستخدم من الطرفية؛ تصدير تقرير CSV إلى القرص.
  • معالجة الاستثناءات — رسائل خطأ واضحة بدلًا من قوائم استثناءات مفاجئة.
  • الاختبار — اختبارات وحدة لمنطق الأعمال دون الحاجة إلى قاعدة بيانات.
لماذا واجهة سطر أوامر وليس تطبيق ويب؟ تضيف طبقة الويب (Servlets أو Spring MVC) قدرًا كبيرًا من الكود التحتي الذي يُشتّت الانتباه عن أساسيات Java التي استهدفها هذا المقرر. تُتيح واجهة سطر الأوامر النظيفة التركيز على منطق المجال والاستمرارية وهيكل الكود — وهي المهارات التي تنتقل مباشرةً إلى أي إطار عمل.

المتطلبات الوظيفية

يجب أن يستوفي التطبيق النهائي المتطلبات التالية. تعامل معها كمستند مواصفات — النوع الذي تتلقاه من صاحب عمل أو عميل.

  1. تسجيل معاملة — يُدخل المستخدم تاريخًا (YYYY-MM-DD)، ومبلغًا (رقم عشري موجب)، ونوعًا (INCOME أو EXPENSE)، وفئة نصية، ووصفًا اختياريًا. يتحقق التطبيق من صحة كل حقل ويرفض المدخلات غير الصالحة برسالة واضحة.
  2. عرض المعاملات — يعرض جميع المعاملات المسجلة بترتيب زمني تنازلي في جدول منسّق داخل الطرفية.
  3. تصفية المعاملات — تصفية حسب نطاق التاريخ أو النوع أو الفئة، مع إمكانية دمج المرشحات.
  4. تقرير الملخص — عرض إجمالي الدخل والمصروفات والرصيد الصافي وتفاصيل كل فئة — كلها محسوبة في الذاكرة باستخدام Streams API.
  5. حذف معاملة — إزالة سجل بمعرّفه بعد رسالة تأكيد.
  6. تصدير إلى CSV — كتابة العرض الحالي المُصفَّى (أو كل السجلات) إلى ملف .csv يختاره المستخدم.
  7. تخزين دائم — تبقى جميع البيانات بعد إعادة تشغيل التطبيق عبر JDBC + SQLite.

المتطلبات غير الوظيفية

يُقيَّم البرنامج الجيد بأكثر من مجرد الميزات. يتطلب المشروع الختامي صراحةً:

  • قابلية الاختبار — يجب أن يكون منطق الأعمال قابلًا للفصل عن I/O وقاعدة البيانات. ستكتب اختبارات JUnit 5 تعمل دون اتصال بقاعدة بيانات.
  • قابلية القراءة — لا دالة يتجاوز طولها ~30 سطرًا، وأسماء واضحة، ولا ثوابت سحرية بلا أسماء معبّرة.
  • المتانة — يجب ألا ينهار التطبيق بسبب استثناء غير معالج نتيجة إدخال خاطئ أو ملف قاعدة بيانات مفقود.
  • Java الحديثة (17+) — استخدام Records للكائنات ذات القيم الثابتة، والواجهات المختومة (Sealed Interfaces) حيثما تناسب، وكتل النص (Text Blocks)، وتعبيرات switch.
ابدأ بالمتطلبات لا بالكود. يقرأ المطورون المحترفون المواصفات، ويطرحون أسئلة توضيحية، ويرسمون البنية قبل فتح IDE. الدرسان التاليان (البنية ونمذجة المجال) يفعلان ذلك بالضبط. قاوم الإغراء بالبدء في الكتابة من الدرس الأول.

حدود النطاق (ما لن نبنيه)

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

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

خيارات التقنية والمبررات

لا يستخدم المشروع شيئًا خارج مكتبة Java 17 القياسية سوى مكتبتين صغيرتين ومعروفتين:

  • SQLite عبر مشغّل org.xerial:sqlite-jdbc — قاعدة بيانات مدمجة لا تحتاج إعدادًا؛ قاعدة البيانات بأكملها ملف واحد. لا خادم للتثبيت.
  • JUnit 5 + AssertJ — المعيار الفعلي لاختبار وحدات Java.

أداة البناء: Maven (تمت تغطيتها في درس أدوات البناء). يُعلن pom.xml عن هذه الاعتماديات لتبني المشروع بأمر واحد: mvn package.

<!-- مقتطف اعتماديات pom.xml --> <dependency> <groupId>org.xerial</groupId> <artifactId>sqlite-jdbc</artifactId> <version>3.45.3.0</version> </dependency> <dependency> <groupId>org.junit.jupiter</groupId> <artifactId>junit-jupiter</artifactId> <version>5.10.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.assertj</groupId> <artifactId>assertj-core</artifactId> <version>3.25.3</version> <scope>test</scope> </dependency>

خارطة طريق الدروس

إليك كيف تبني الدروس التسعة المتبقية على بعضها:

  1. نظرة عامة على المشروع ومتطلباته (هذا الدرس) — تحديد ما نبنيه ولماذا.
  2. تصميم البنية — البنية الطبقية، وتخطيط الحزم، وقواعد التبعية.
  3. نمذجة المجال — Records والـ Enums وكائنات القيمة؛ الثبات (Immutability) كخيار افتراضي.
  4. بناء طبقة البيانات — نمط المستودع عبر JDBC، إنشاء المخطط تلقائيًا، إدارة الاتصال.
  5. تنفيذ منطق الأعمال — طبقة الخدمة، التجميع بالـ Streams، التصفية.
  6. إضافة واجهة التطبيق — حلقة أوامر CLI، تحليل المدخلات، تنسيق المخرجات.
  7. معالجة الأخطاء والتحقق — استثناءات مخصصة، التحقق من المدخلات، التدهور الرشيق.
  8. اختبار التطبيق — اختبار وحدات الخدمات ببدائل في الذاكرة؛ اختبار تكامل المستودع.
  9. تغليف التطبيق وتشغيله — ملف JAR شامل بمكوّن Maven Shade، التشغيل في أي مكان بـ java -jar.
  10. الخلاصة والخطوات التالية — مراجعة، إضافات ممكنة، الطريق بعد هذا المقرر.

ما يجب عليك فعله قبل الدرس الثاني

للمشاركة الفاعلة لا المجرد القراءة، افعل التالي قبل الدرس القادم:

  1. أنشئ مشروع Maven جديدًا: mvn archetype:generate -DgroupId=com.example.finance -DartifactId=finance-tracker -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
  2. أضف الاعتماديات الثلاثة أعلاه إلى pom.xml وتحقق من نجاح mvn compile.
  3. اكتب باللغة العادية أهم خمسة أشياء يجب أن يفعلها التطبيق بشكل صحيح. قارن قائمتك بالمتطلبات الوظيفية أعلاه — الفجوات هي قرارات تصميم ستجيب عنها في الدرس الثاني.
قراءة المتطلبات بعين ناقدة مهارة احترافية. أي غموض تلاحظه الآن (مثل: "ماذا يحدث إذا أدخل المستخدم تاريخًا مستقبليًا؟") هو قرار تصميمي حقيقي. في فريق عمل ستطرحه في تذكرة (ticket)؛ هنا ستتخذ قرارًا مدروسًا وتوثّقه في تعليق. هذه هي عقلية المشروع الختامي.