تجميع كل الأجزاء
جزء من قسم المنطق وتدفق التنفيذ في رحلة GO على Coddy. الدرس 25 من 68.
التحدي
سهلحان وقت إنهاء تطبيق قائمة المهام. في هذه الخطوة الأخيرة، ستجمع كل ما تعلمته في الدروس السابقة: بنية Task، والدوال addTask وviewAllTasks وcompleteTask وremoveTask، بحيث تُدار بواسطة جلسة من إجراءات القائمة.
ستتلقى ثلاثة مدخلات:
- سلسلة تحتوي على اسم التطبيق واسم المستخدم، يفصل بينهما فاصلة (مثل:
"MyTasks,Alice") - سلسلة تحتوي على المهام التي تبدأ بها القائمة، بالتنسيق
"name1:status1,name2:status2"، حيث تكون الحالة"true"أو"false"(مثل:"Write report:false,Call dentist:true"). يكون هذا السطر فارغًا عندما تبدأ القائمة فارغة. - سلسلة تحتوي على إجراءات الجلسة، تفصل بينها فواصل. يكون الإجراء إما اسمه فقط، أو اسمه ومعامل واحد موصولًا باستخدام
|(مثل:"add|Buy groceries,view,complete|2,remove|0,exit"). تنتهي قائمة الإجراءات دائمًا بـ"exit".
تحتوي أسماء المهام على مسافات، لذا اقرأ الأسطر الثلاثة باستخدام bufio.Scanner، كما في الدروس السابقة.
مهمتك هي:
- تعريف بنية
Taskنفسها، مع حقليName(من النوع string) وCompleted(من النوع bool) - إعادة الدوال الأربع التي كتبتها سابقًا، بالتواقيع نفسها:
addTask(tasks []Task, taskName string) []TaskviewAllTasks(tasks []Task)، التي تطبع"[x] [task_name]"للمهمة المكتملة و"[ ] [task_name]"للمهمة التي لا تزال مفتوحةcompleteTask(tasks *[]Task, index int)removeTask(tasks []Task, index int) []Task
- بناء القائمة الابتدائية من الإدخال الثاني، مع تذكّر أن السطر الفارغ يعني قائمة فارغة
- طباعة رسالة الترحيب والقائمة، تمامًا كما في الخطوة الأولى من المشروع:
"Welcome to [app_name], [user_name]!""1. Add Task""2. View Tasks""3. Complete Task""4. Remove Task""5. Exit""Current tasks: [count]"
- تنفيذ الإجراءات بالترتيب. يطبع كل إجراء عنوانه أولًا:
"add": اطبع"--- ADD TASK ---"، وأضف المهمة التي يحددها المعامل، ثم اطبع"Task '[task_name]' added!""view": اطبع"--- VIEW TASKS ---"، واعرض كل مهمة باستخدامviewAllTasks، ثم اطبع سطر الملخص"complete": اطبع"--- COMPLETE TASK ---"، وعلّم المهمة الموجودة عند ذلك الفهرس، ثم اطبع"Task '[task_name]' marked as completed!""remove": اطبع"--- REMOVE TASK ---"، واحذف المهمة الموجودة عند ذلك الفهرس، ثم اطبع"Task '[task_name]' removed successfully!""exit": اطبع"--- EXIT ---"، ثم"Final list:"، ثم القائمة كاملة، ثم سطر الملخص، وأخيرًا"Goodbye, [user_name]!". لا يُنفَّذ أي شيء بعد exit.
- تبدأ الفهارس من 0، كما في الدروس السابقة. عندما يكون فهرس
"complete"أو"remove"خارج القائمة، اطبع"Invalid task number"بدلًا من ذلك واترك القائمة دون تغيير. - سطر الملخص هو السطر الذي تعرفه مسبقًا:
"Total: [total_count] tasks ([completed_count] completed, [incomplete_count] remaining)"
استخدم الحزمة strings لتقسيم أسطر الإدخال، والحزمة strconv لتحويل الفهرس إلى رقم. توضّح هذه الخطوة الأخيرة كيف تتكامل الدوال الصغيرة التي كتبتها واحدةً تلو الأخرى لتكوين برنامج يعمل.
جرّب بنفسك
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
type Task struct {
Name string
Completed bool
}
// TODO: Bring back addTask, viewAllTasks, completeTask and removeTask
// من الدروس السابقة لهذا المشروع
func main() {
// إنشاء ماسح لقراءة أسطر الإدخال
scanner := bufio.NewScanner(os.Stdin)
// اقرأ اسم التطبيق واسم المستخدم
scanner.Scan()
names := scanner.Text()
// اقرأ المهام التي تبدأ بها القائمة
scanner.Scan()
taskData := scanner.Text()
// اقرأ إجراءات الجلسة
scanner.Scan()
actionData := scanner.Text()
// TODO: أكمل التنفيذ
// 1. قسّم names على "," للحصول على اسم التطبيق واسم المستخدم
// 2. ابنِ شريحة المهام الابتدائية من taskData
// 3. اطبع رسالة الترحيب والقائمة وعدد المهام الحالي
// 4. نفّذ كل إجراء في actionData بالترتيب، مع طباعة ترويسته أولاً
}
جميع دروس المنطق وتدفق التنفيذ
1تدفق التحكم المتقدم
جملة Switch مع `fallthrough`الخروج من الحلقات المتداخلةالاستمرار في حلقة محددةجملة `goto`ملخص - التحكم المتقدم في الحلقات2الـ Structs والميثودز (Methods)
تعريف الـ Methods على الـ Structsالـ Value Receiversالـ Pointer Receiversاختيار الـ Receiversالـ Methods مقابل الـ Functionsملخص - سلوك الـ Struct5تعمق في الـ Maps
Maps من نوع Structsالـ Pointers كقيم في الـ Mapsالتحقق من الـ Nil Mapsمقارنة الـ Mapsمراجعة - عداد تكرار الكلمات3الواجهات (الأساسيات)
ما هي الواجهة؟تعريف الواجهةتطبيق الواجهةاستخدام أنواع الواجهاتالواجهة الفارغةتأكيدات النوع (Type Assertions)تبديل النوع (Type Switch)ملخص - الأشكال والسلوكياتتدرّب بنفسك: مترجم Go عبر الإنترنت