PracticU

תכנות מונחה עצמים ב-NodeJS

בלי כתוביותעם כתוביות
PracticU › קורס NodeJS › תכנות מונחה עצמים ב-NodeJS
מילון מושגים:
OOP - תכנות מונחה עצמים: גישת פיתוח שמארגנת את הקוד סביב אובייקטים המאגדים נתונים ופעולות.
Node.js - סביבת ריצה שמאפשרת להריץ קוד JavaScript מחוץ לדפדפן, בעיקר בצד השרת.
מחלקה - תבנית בתכנות מונחה עצמים שמגדירה אילו נתונים ופעולות יהיו לאובייקטים שנוצרים ממנה.
תחביר - אוסף הכללים של שפת תכנות הקובעים כיצד לכתוב קוד תקין. הפרתם גורמת לשגיאת תחביר.
בנאי - מתודה מיוחדת שמופעלת אוטומטית בעת יצירת אובייקט ממחלקה, ומאתחלת את ערכיו ההתחלתיים.
JavaScript - שפת תכנות שרצה בעיקר בדפדפן ומוסיפה אינטראקטיביות לדפי אינטרנט. רצה גם בצד השרת באמצעות Node.js.
מתודה - פונקציה המוגדרת בתוך מחלקה ומתארת פעולה שאובייקטים מאותה מחלקה יכולים לבצע.
אובייקט - יחידה בתכנות מונחה עצמים שמאגדת נתונים (תכונות) ופעולות (מתודות). נוצר בדרך כלל ממחלקה המשמשת כתבנית.

תכנות מונחה עצמים ב-NodeJS
הסרטון מראה איך בונים מחלקה ב-Node.js ואיך מסתירים בתוכה נתונים שאינם חוקיים, על בסיס המחלקה הקלאסית Person.
בניית המחלקה
1. קובץ נפרד: המחלקה נכתבת בקובץ person.js, בתחביר class של ECMAScript 6.
2. קונסטרקטור: constructor(firstName, lastName) שומר את הערכים ב-this.firstName וב-this.lastName. לפי הדובר, התחביר הזה הוא עטיפה נוחה לפונקציית constructor רגילה ב-JavaScript.
3. display: מתודה שמדפיסה את הפרטים של האובייקט.
4. ייצוא: המחלקה כולה נחשפת עם module.exports = Person.
שימוש במחלקה
1. ייבוא עם אות גדולה: const Person = require('./person'). שמות מחלקות נכתבים באות גדולה, כדי שמי שקורא את הקוד יבין שזו מחלקה ולא פונקציה.
2. יצירת אובייקט: new Person(...), ואז קריאה ל-display.
הסתרת נתונים
1. שדה פרטי בשם: הגיל נשמר ב-this._age. ב-JavaScript אין שדות פרטיים בתחביר הזה, ולכן הקו התחתון מסמן שאין לגעת בשדה מבחוץ.
2. setter: set age(value) בודק שהערך מספרי וחיובי (בעזרת isFinite). אם לא, הוא זורק Error. רק ערך תקין נכנס לשדה.
3. getter: get age() מחזיר את הערך השמור.
4. בדיקה: ערך שלילי נתפס ב-try/catch וההודעה מוצגת, והתוכנית לא קורסת.
הסרטון מזכיר גם דרכים נוספות להסתיר נתונים, כמו Object.defineProperty או closures. לפי הדובר, אלה פחות נוחות לשימוש, ו-_age עדיין נגיש מבחוץ בשיטה שמוצגת.
השיעור הבא בקורס: הורשה ב-NodeJS

פרקי ההרצאה: תכנות מונחה עצמים ב-NodeJS

  1. 00:00

    תכנות מונחה עצמים ב-Node.js והמטרה של הנושא

  2. 00:58

    בניית מחלקת Person עם constructor

  3. 02:01

    הוספת פונקציית הצגת הפרטים למחלקה

  4. 03:51

    חשיפת מחלקה מקובץ עם module.exports

  5. 05:27

    שימוש במחלקה באמצעות require ו-new

  6. 07:16

    Encapsulation ובדיקת תקינות ערכים בקונסטרקטור

תמלול ההרצאה: תכנות מונחה עצמים ב-NodeJS

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

  1. 00:02

    אנחנו מגיעים ליישום Object Oriented Programming ב-Node.js. כלומר, אנחנו הולכים לראות עכשיו בנושא הזה איך בעצם אנחנו מפתחים Object Oriented ב-Node.js.

  2. 00:16

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

  3. 00:38

    או מודול נפרד ואז לחזור לזה או פשוט לדלג על הנושא הזה כי אנחנו לא הולכים ללמוד פה מההתחלה אלא רק לראות איך אנחנו מיישמים את כל האלמנטים של Object Oriented ב-Node.js אז דבר ראשון מה שאנחנו רוצים לעשות זה Incapsulation כלומר איך אנחנו בונים מחלקה ואיך אנחנו משתמשים בה אנחנו נבנה את המחלקה

  4. 01:04

    הידועה שמי שהשתמש באובג'קט אוריינטד או למד אובג'קט אוריינטד בטח בנה אותה המון פעמים. פרסון, מחלקה שמתארת אדם.

  5. 01:14

    אז מה שנכון לבצע זה קודם כל כל מחלקה אנחנו בונים בקובץ נפרד. אז בואו נייצר פה קובץ שנקרא person.js ופשוט יש לנו באקמה סקריפט 6 גרסה 6 של ג'אווה סקריפט אפשרות לבנות קלאסים.

  6. 01:32

    אס פרסון עכשיו אנחנו רוצים קודם כל שיהיה לנו מאפיינים למחלקה בוא נניח שם פרטי ושם משפחה בתור התחלה אין לנו אפשרות בג'אווה סקריפט להגדיר אותם כדאטה ממברס רגילים כלומר משתנים עם הרשעת גישה פאבליק פאבליק או פרייבט או משהו כזה אין דבר כזה אלא יש לנו קונסטרקטור first name last

  7. 01:59

    name הקונסטרקטור מקבל first name ו last name ויש לנו this first name שווה first name this last name שווה last name ומה שבעצם מתרחש כאן זה שהתחביר של קלאס באקמה סקריפט 6 פשוט הופך את כל הסיפור הזה למה שנקרא ב-JavaScript constructor function זה פשוט פונקציה שמקבלת לסוגריים את שני החבר'ה האלה

  8. 02:30

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

  9. 02:43

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

  10. 03:00

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

  11. 03:10

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

  12. 03:16

    לנו פה או console.log, נניח מי זה ה-first name, ונדפיס this first name. בואו נשכפל את זה גם ל-last name, ויש לנו this.last name, והנה יש לנו מחלקה מאוד פשוטה שמתארת בן אדם, יכול להיות מצב שאנחנו רוצים באפליקציה לבנות כל מיני אנשים,

  13. 03:54

    לקוחות, ספקים, עובדים. עכשיו אנחנו רוצים לחשוף את המחלקה הזאת החוצה, ב-node.js אנחנו חושפים מהקובץ שהוא בעצם מודול על ידי מודול נקודה אקספורטס.

  14. 04:08

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

  15. 04:36

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

  16. 04:52

    אז כאשר אנחנו משתמשים במחלקה אנחנו חושפים רק מחלקה אחת, כאילו שהיינו חושפים פונקציה אחת. ועכשיו אנחנו רוצים להשתמש במחלקה הזאת, זה אומר שאנחנו צריכים לגשת ל-app.js ודבר ראשון אנחנו רוצים const ולייבא על ידי require את המודול של ה-person.js.

  17. 05:15

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

  18. 05:37

    require שחושף מחלקה, אנחנו תמיד נרשום את השם של המחלקה שהוא חושף עם אות ראשונה גדולה, כי בעצם מה יש עכשיו אחרי שעשינו require כאן?

  19. 05:50

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

  20. 06:01

    אני אקרא לזה person עם פי גדולה, וזה הדבר היחידי שאנחנו עושים עם אותיות גדולות. רק שמות של קלאסים. const my first object or person or my first man, בואו נקרא לזה man שווה new person.

  21. 06:19

    הקונסטרקטור שלנו מקבל first name last name, מוישה רופניק, הדמות המיתולוגית. ואז יש לנו my first man נקודה דיספליי, אנחנו יכולים עכשיו להריץ את התוכנית Node-up ולראות שיש לנו First Name ו-Last Name.

  22. 06:38

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

  23. 07:01

    ויש לנו פה את my second man נריץ. הכל עובד, אנחנו יכולים עכשיו למנות כמה אובייקטים שאנחנו רוצים מהמחלקה שבנינו. עכשיו, מה בקשר באמת ל-incapsulation?

  24. 07:16

    הרי לתוך first name ו-last name אנחנו יכולים להכניס כל מה שבא לנו, אבל ה-incapsulation האמיתי אומר, רגע, יכול להיות מצב שיש פה איזה ערך שהוא בעצם לא חוקי, ואתם לא רוצים לאשר להכניס דברים לא חוקיים לתוך המידע עצמו.

  25. 07:41

    המידע עצמו הוא מאוד מאוד חשוב, אני לא רוצה להכניס כל דבר אליו. לתוך first name ו-last name בואו נניח שאין לי בעיה להכניס הכל, אבל בואו נניח שיש גם גיל, age לפרסון.

  26. 07:53

    ו-age זה אומר, רגע, מותר לכם להכניס ל-age רק ערכים שהם מספריים וחיוביים בלבד. אז מה אנחנו עושים? אז אם הייתי מגדיר את זה באותה הצורה זה לא היה בסדר, הייתי יכול להכניס מבחוץ כל דבר לתוך הערכים האלה, לתוך Age.

  27. 08:15

    אז בואו נראה איך אנחנו תוקפים את ה-Concept של Incapsulation כאשר אנחנו רוצים בעצם לדאוג שהמידע הוא חוקי. אז אנחנו רוצים לקבל גם Age לתוך ה-Constructor ומה שאנחנו עושים כאן אנחנו יוצרים ב-dis underline Age

לקורס המלא: קורס NodeJS אונליין בעברית

ההרצאה הקודמת: קריאה וכתיבה לקובץ עם Promise

ההרצאה הבאה: הורשה ב-NodeJS

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

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

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

  • קורס יסודות HTML - בניית אתר אינטרנט פשוט
  • קורס CSS 3 - בדגש על Flex & Grid
  • קורס Javascript כולל JQuery
  • קורס ג'אווה סקריפט מעשי - JavaScript
  • קורס TypeScript
  • קורס ריאקט - React