PracticU

תכנות אסינכרוני ASYNC בשפת Dart

בלי כתוביותעם כתוביות
PracticU › קורס פלאטר - Flutter - שפת DART של גוגל למובייל - פיתוח אפליקציות לאנדרואיד ואייפון › תכנות אסינכרוני ASYNC בשפת Dart
מילון מושגים:
אסינכרוני - אופן פעולה שבו פעולה ארוכה רצה ברקע והתוכנית ממשיכה בלי להמתין לה, ומטופלת כשתסתיים.
שרת - מחשב או תוכנה שמספקים שירות למחשבים אחרים (לקוחות) ברשת, למשל אחסון קבצים, אתר אינטרנט או מסד נתונים, ומגיבים לבקשות שלהם.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
בקשה - פנייה שלקוח שולח לשרת כדי לקבל מידע או לבצע פעולה. השרת מחזיר עליה תגובה.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
שם משתמש - מזהה ייחודי שמשתמש מזין כדי להזדהות במערכת, לרוב יחד עם סיסמה.
סיסמה - מחרוזת תווים סודית שמשמשת לאימות זהות המשתמש בעת כניסה למערכת. ככל שהיא ארוכה ומורכבת יותר, כך קשה יותר לנחש אותה.

תכנות אסינכרוני ASYNC בשפת Dart
קוד סינכרוני רץ לפי סדר הכתיבה, אבל כשצריך לחכות לתשובה משרת, הערך מגיע רק בעתיד. בדארט מטפלים בכך עם Future, עם then, או עם async ו-await.
השלבים העיקריים
1. סינכרוני מול אסינכרוני: הדפסה של שלוש שורות רצה לפי הסדר. פונקציה שמדמה בקשה לשרת ומחזירה ערך אחרי שלוש שניות מחזירה Future, כלומר ערך שייקבע בעתיד, ולא את הערך עצמו.
2. then: הפונקציה then מקבלת פונקציה שמופעלת כשה-Future מסתיים, והערך מגיע אליה כפרמטר. אפשר לכתוב אותה כפונקציית חץ.
3. async ו-await: await ממתין עד שהפעולה הארוכה מסתיימת ורק אחר כך ממשיך בקוד לפי סדר הכתיבה. אפשר להשתמש ב-await רק בפונקציה שסומנה כ-async.
4. תרגיל משתמשים: מחלקה User עם שם משתמש, סיסמה ומספר נקודות. הרשימה של המשתמשים קבועה בקוד לצורך ההדגמה.
5. פונקציית לוגין: מחזירה Future של משתמש. הפונקציה ממתינה שלוש שניות בעזרת Future.delayed, מחפשת משתמש שמתאים לשם ולסיסמה בעזרת firstWhere, ומחזירה null אם לא נמצא.
6. החזרת ה-Future: הפונקציה חייבת להחזיר את ה-Future, אחרת מתקבלת שגיאה.
שימו לב
הקוד שמשתמש בפונקציית לוגין צריך להתמודד גם עם null, למשל כשהשם או הסיסמה שגויים.
עכשיו אפשר לכתוב קוד אסינכרוני בשתי דרכים: עם then, או עם async ו-await שקצר וקריא יותר.
השיעור הבא בקורס: חיבור אייפון וסימולטור של אנדרואיד ל-Flutter

פרקי ההרצאה: תכנות אסינכרוני ASYNC בשפת Dart

  1. 00:00

    קוד סינכרוני מול אסינכרוני

  2. 01:10

    מהו Future

  3. 02:14

    שימוש ב-then לקבלת ערך עתידי

  4. 03:21

    המרה לפונקציית חץ

  5. 03:57

    המילה await והמתנה לתוצאה

  6. 05:26

    מחלקת User ורשימת משתמשים

  7. 07:16

    הוספת משתמשים לרשימה

  8. 07:58

    פונקציית לוגין שמחזירה Future

תמלול ההרצאה: תכנות אסינכרוני ASYNC בשפת Dart

הטקסט המלא של הדקות הראשונות בהרצאה «תכנות אסינכרוני ASYNC בשפת Dart» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    בשיעור הזה נלמד על קוד הסינכרוני שזה אומר futures, then, async ו-awet. אז מה זה בעצם קוד הסינכרוני?

  2. 00:10

    קוד הסינכרוני זה קוד שרץ לפי הסדר שבו הוא נכתב. אם לדוגמה נרשום את סדר הפקודות פרינט 1, פרינט 2 ופרינט 3, נריץ את הקוד, נראה ריצה לפי אותו סדר בדיוק.

  3. 00:22

    אבל מה קורה אם בין 1 ל-2 אני רוצה להדפיס לדוגמה את מזג האוויר של עכשיו. העניין הוא שאין לי את מזג האוויר בדיוק באותו רגע, אלא הוא יגיע אליי אחרי 2-3 שניות, אני צריך לבצע איזושהי פנייה לאיזשהו שרת וזה לוקח בין 2 ל-3 שניות.

  4. 00:39

    אני אדביק כאן פונקציה שבעצם מדמה לי בקשה של מזג האוויר משרת. כל מה שהיא עושה היא רק ממתינה 3 שניות ולאחר מכן מחזירה לי ערך קבוע של 32.3. לצורך העניין זה בדיוק כמו לבקש את מזג האוויר משרת.

  5. 00:55

    ועכשיו אני ארשום print get weather. עכשיו לפני שאני אריץ את הקוד הזה אני רוצה לדבר קצת על future. מה זה future? כל דבר שאמור לקרות בעתיד נקרא future זאת אומרת אם יש לי פונקציה שמחזירה לי מיד מספר אז אפשר להגיד שהפונקציה מחזירה לי int אם היא מחזירה מיד true או false היא מחזירה לי בוליאן אבל מה קורה כמו בפונקציה הזאת שהיא לא מחזירה לי ערך מיד אלא היא מחזירה

  6. 01:27

    לי ערך בעוד שלוש שניות או בעוד x שניות אז אפשר לומר שהערך המוחזר מהפונקציה נקרא future עכשיו אני אריץ את הקוד אוקיי ואנחנו רואים פה אחד ואז instance of future double מה זה אומר?

  7. 01:43

    זאת אומרת שהפונקציה בעצם מחזירה לי מופע של future ולא את הערך 32.3 כמו שציפינו. למה? כי בזמן שהקוד רץ הערך עדיין לא קיים, הוא יהיה קיים רק בעוד 3 שניות. אז מה שאנחנו כן רואים זה את מה שחזר מהפונקציה שזה באמת future.

  8. 02:01

    עכשיו אמרנו שבדרך כלל לא חובה לרשום את סוג המשתנה שהפונקציה מחזירה אבל נוכל לרשום כאן שהפונקציה מחזירה future מסוג double וככה זה טיפה יותר מובן. אז יש לנו פונקציה שנקראת getWeather והיא מחזירה ל-future, זאת אומרת ערך עתידי מסוג double בעוד במקרה הזה שלוש שניות.

  9. 02:23

    אז איך בכל זאת נוכל לקבל את הערך שמוחזר על ידי ה-future שמוחזר על ידי הפונקציה? נוכל להשתמש במילה השמורה then. מה זאת אומרת? נרשום getWeather ואז את המילה השמורה then.

  10. 02:39

    וכבר אפשר לראות שהפונקציה then מקבלת פונקציה שמקבלת כפרמטר משתנה מסוג double. נבנה כאן פונקציה עם פרמטר מסוג דאבל שנקרא לו val לצורך העניין כמובן שאפשר להשמיט את סוג המשתנה דאבל והנה גוף הפונקציה וברגע הזה המשתנה val מכיל את הערך שמוחזר על ידי הפיוג'ר בואו נדפיס אותו print val123 ובעוד 3 שניות הנה 32.3. שימו לב מה קרה פה בעצם print1 print2 וprint3 רצו בצורה סינכרונית

  11. 02:47

    זאת אומרת לפי סדר הכתיבה ו-getWeather החזיר ערך בצורה א-סינכרונית, זאת אומרת לאחר שלוש שניות במקרה הזה.

  12. 03:25

    כמובן שנוכל להמיר את הפונקציה האנונימית שכתבנו כאן בפונקציית חץ, בואו נעשה את זה. getWeather.den נבנה כאן פונקציה שמקבלת פרמטר בשם val והנה החץ ונרשום print val, נריץ שוב.

  13. 03:44

    אז הנה 1, 2 ו-3 ו-32.3 ככה זה קצת יותר מובן וכבי. אבל מה אם בכל זאת נרצה להריץ את הקוד שלנו בצורה סינכרונית ולקפוט על המעבד להמתין עד לסיום ביצוע הפעולה הארוכה ורק אחרי זה להמשיך עם הקוד בדיוק לפי הסדר שבו הוא נכתב.

  14. 04:01

    בדיוק בשביל זה נכנסה המילה a-wait. המילה a-wait בעצם אומרת לקומפיילר תמתין בבקשה עד לסיום ביצוע הפעולה הארוכה ורק אחרי זה תמשיך עם הקוד כמו שהוא נכתב.

  15. 04:14

    חשוב להדגיש שאפשר להשתמש במילה a-wait רק בפונקציה הסינכרונית, זאת אומרת פונקציה שהמילה async נכתבה לפני ההתחלה של המימוש. במקרה הזה כבר הקדמתי ורשמתי async אבל בוא נראה מה קורה אם אני אמחק את המילה הזאת, יש לנו כאן שגיאה the a-weight expression can only be used in an asynchronous function זאת אומרת המילה a-weight ניתנת לשימוש רק בפונקציות אסינכרוניות אז נהפוך

  16. 04:39

    אותה לפונקציה אסינכרונית על ידי הוספה של המילה async ועכשיו נוכל להשתמש במילה a-weight אז נרשום var w מלשון weather שווה ל-a-weight get weather ואז אז הקוד ירוץ, ידפיס 1, לאחר מכן הוא יכניס את ה-GetWeather לתוך משתנה w,

  17. 05:03

    ונוכל עכשיו להדפיס את w. רק לאחר מכן הקוד ירוץ וידפיס את print2 ו-print3. בואו נראה 1 ומייד 32.3 ואז 2 ו-3 בדיוק כמו שציפינו.

  18. 05:19

    כדי לחזק את ההבנה אני רוצה לבנות תרגיל נוסף שיכיל חלק גדול מכל מה שכבר למדנו. נמחק את כל זה. ועכשיו בואו נניח שיש לנו מחלקה שנקראת User.

  19. 05:29

    כל משתמש מכיל שם משתמש, סיסמה ומספר נקודות לדוגמה. בנוסף נחזיק רשימה של יוזרים אצלנו במערכת ואז נבנה פונקציית לוגין שמקבלת שמש שם אפס לסיסמה, ואם קיים יוזר מתאים עם אותו שמש שם אפס לסיסמה היא תחזיר אותו, אם לא היא תחזיר נער.

  20. 05:47

    אז נתחיל מההגדרה של המחלקה class user יש לנו כאן string username, string password ו-int points. נתחיל את זה עם 0 כי לכל יוזר בהתחלה יש 0 נקודות.

  21. 06:02

    עכשיו נבנה קונסטרקטור, קונסטרקטור זה יקבל Username, Password ו-Points ויבצע את חו"ל this.username שווה Username, this.password שווה Password ו-this.points שווה points.

  22. 06:21

    עכשיו אני רוצה לשתף אתכם בדרך מאוד מאוד קלה והרבה יותר מהירה לבנות קונסטרקטורים. יש בדאטה את האפשרות לכתוב לפני השם של הפרמטר this.

  23. 06:32

    ואז הקונסטרקטור כבר ידע איזה משתנה להתחיל. ברגע שרשמתי בקונסטרקטור this.user name הוא כבר ידע לבצע את הפעולה הברורה this.user name = user name ואז אפשר למחוק את השורה הזאת.

  24. 06:44

    כנ"ל לגבי פסוורד ופוינטס this.password ו-this.points ואז תראו איזה קונסטרקטור קצר יש לנו. אוקיי, אז סיימנו עם העניין של המחלקה. עכשיו בואו נגדיר רשימה של יוזרים שהיא תהיה כרגע קבועה.

  25. 07:00

    כמובן שבעולם אמיתי הרשימה תימצא בשרת מרוחק בתוך דאטאבייס אבל רק לצורך המחשה נחזיק אותה כאן. אז נבנה ליפט של יוזר נקרא לה users והיא תהיה שווה לרשימה ריקה ועכשיו נתחיל לדחוף לכאן יוזרים.

  26. 07:16

    אז יוזר אחד שם המשתמש יהיה אלי הסיסמה תהיה 1111 ויש לו 20 נקודות. ניצור עוד שתי יוזרים נוספים השני יהיה אבי סיסמה 2222 עם 40 נקודות ו-john333 עם 44 נקודות.

  27. 07:38

    מעולה. אז יש לנו רשימה של יוזרים, יש לנו מחלקה אה שכחתי כאן פסיק יש לנו רשימה של יוזרים, יש לנו את המחלקה user ועכשיו נשאר לנו לבנות את הפונקציה לוגין שמוצאת את היוזר מתוך רשימת היוזרים אז לוגין תהיה פונקציה שמקבלת

  28. 07:56

    יוזרניים ופסוורד, הפונקציה הזאת תחזיר פיוצ'ר של יוזר, זאת אומרת שלאחר x זמן אחרי שהיא תסיים את פעולת החיפוש היא תחזיר לנו יוזר.

  29. 08:11

    עכשיו אני אדמה למעשה את המציאות בעולם האמיתי כאילו שפנינו לשרת מרוחק, זה לקח בערך 3 שניות ואז קיבלנו חזרה את היוזר או נ"ל אם הוא לא נמצא.

  30. 08:21

    אז future.delayed נמתין משך של 3 שניות ולאחר מכן נבצע את הקוד הזה. אז הדבר הראשון שאנחנו צריכים לעשות בתום שלוש שניות זה לחפש ברשימת היוזרים אם קיים יוזר שהיוזרניים והפספורט שלו זהים לאלה שקיבלנו בפונקציה לוגין.

  31. 08:43

    אז users.firstware בוא נראה מה רשום על

לקורס המלא: קורס Flutter אונליין

ההרצאה הקודמת: אובייקטים ומחלקות CLASS - תכנות מונחה עצמים בשפת Dart

ההרצאה הבאה: חיבור אייפון וסימולטור של אנדרואיד ל-Flutter

הרצאות קשורות מקורסים אחרים

  • הדגמה של תכנות אסינכרוני עם async
  • Asynchronous - Async Call
  • הצורך ב-Async Task
  • Async Custom Validators

קורסים נוספים במסלול

  • קורס יסודות התכנות - שפת JAVA - קורס ג'אווה למתחילים
  • קורס פיתוח אפליקציות - לאנדרואיד - Android - ב-JAVA
  • קורס פיתוח אפליקציות - לאייפון iPhone iOS - ב-Swift-Xcode
  • קורס PhoneGap - פיתוח אפליקציות לאנדרואיד ואייפון