» נושאי לימוד
» נושאי לימוד
יום שני 29 באפריל 2024
פיתוח חבילות משלך
דף ראשי  מתחילים  חבילות (Packages)  פיתוח חבילות משלך גרסה להדפסה

 

פיתוח חבילות משלך

 

 

- ציון package

- ציון  import

- הידור תוכניות בעלות ציוני package

- תוכנית לדוגמה

 

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

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

 

גישת החבילות מאפשרת לנו לאחסן את קבצי המחלקות בהיררכיה של ספריות
(או בקובץ
zip, שמייצג היררכיה כזו),
והדרישה היחידה היא שמשתנה
classpath יצביע על ראש ההיררכיה.
המבנה ההיררכי עצמו יוצפן בתוכניות שלנו תוך שימוש בציוני
package וציוני import .

 

כעת אני מגיע לפנינת חוכמה, שלקח לי שבע שעות לגלות.

 

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

 

נועצתי בספרים רבים ואף אחד מהם לא עזר לי בכך. לבסוף נתקלתי באמירה הבאה המופיעה בתיעוד הנלווה של JavaSoft (כשכל הקִצים כָּלים, קרא את התיעוד).
להלן הטקסט מתוך התיעוד של
JavaSoft JDK 1.1:

 

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

 

לדוגמה, נניח שברצונך לאפשר למפענח של Java לאתר מחלקות בחבילה בשם mypackage.
אם הנתיב אל ספריית
mypackage הוא C:\java\MyClasses\mypackage, עליך לקבוע את משתנה CLASSPATH באופן הבא:

 

 set CLASSPATH=C:\java\MyClasses 

 

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

 

מרגע שלמדתי כי עלי לקבוע את משתנה classpath כך שיצביע על הספרייה הנמצאת ישירות מעל הספרייה הראשונה בהיררכיה (אשר מצוינת בציון ה‑package שלי), הכל התחיל לעבוד.

 

ציון package

 

למה נועד ציון package וכיצד הוא נראה?

 

ציון package נועד לזיהוי מחלקה כלשהי (או קבוצת מחלקות הכלולה בתוך קובץ source יחיד ונקראת יחידת הידור) כשייכת לחבילה מסוימת.

 

המידע הזה הוא בעל חשיבות רבה בשל סיבות רבות, אחת העיקריות שבהן היא העובדה, שכל מערכת בקרת הגישה סובבת סביב המושג של השתייכות מחלקות לחבילות ספציפיות. לדוגמה,
הקוד בחבילה אחת מסוגל לגשת רק למחלקות
public בחבילה אחרת.
(השיעור הבא ידון בבקרת גישה בהרחבה.)

 

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

 

בזמן הידור ניתן יהיה לזהות מחלקה כחלק מחבילה מסוימת אם מופיע ציון package בתחילת קוד ה‑source.

 

במידה והוא קיים, ציון package חייב להופיע בתחילת קוד ה‑source
(אם מתעלמים מהערות ושורות ריקות).
לפני ציון
package לא ניתן לכלול טקסט אחר למעט הערות ושורות ריקות.

 

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

 

להלן כמה דוגמאות לציוני package, שיופיעו בתוכניות הבאות:

 

package Combined.Java.p1; 
package Combined.Java.p2;

 

בהנחה שה‑classpath במחשב שלי הוא:

 

CLASSPATH=.c:\Baldwin\JavaProg

 

שני ציוני ה‑pakage מציינים שקבצי המחלקות, הנשלטים על ידם, נמצאים בספריות הבאות:

 

c:\Baldwin\JavaProg\Combined\Java\p1 
c:\Baldwin\JavaProg\Combined\Java\p2

 

 

שים לב כיצד חיברתי את ציון ה‑pakage ל‑classpath, והחלפתי את הלוכסן (\) בנקודה (.)
בהמרה מציון
package לְשם נתיב מאושר.

 

הקוד בחבילה אחת מסוגל לגשת למחלקה בחבילה אחרת (אם זו ניתנת לגישה) באמצעות אישור שם המחלקה ושם החבילה שלה, באופן הבא:

 

Combined.Java.p2.Access02 obj02 = 
  new Combined.Java.p2.Access02();

 

 

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

 

ציון  import

 

דיון זה יהיה קצר מאוד, משום שלמן השיעור הראשון השתמשת בציוני import. בשלב זה,
אתה כבר אמור לדעת כיצד הם נראים וכיצד להשתמש בהם.

 

אם אתה מתעניין בפרטים הקטנים (למשל, מה קורה כשאתה מציין שני ציוני import, המצביעים על שתי חבילות שונות שלכל אחת מהן שם קובץ מחלקה זהה), תוכל להיעזר ב‑Java Language Reference by Mark Grand, או להוריד את פירוט שפת Java מאתר JavaSoft.

 

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

 

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

 

קובץ source עשוי להכיל כל מספר של ציוני import. עליהם להופיע אחרי ציוני ה‑package
(אם יש כאלה) ולפני כל הצהרה על מחלקות או על ממשקים.

 

למעשה, ציוני import עשויים להופיע באחת משתי צורות – עם, או בלי, תו wildcard.
שתי הצורות מומחשות בקטע הקוד הבא:

 

import java.awt.* 
import java.awt.event.ActionEvent 

 

 

ציון ה‑import הראשון גורם לכך, שכל קבצי המחלקות בחבילת java.awt יהיו זמינים לשימוש בקוד של חבילה אחרת, תוך ציון שמות הקבצים בלבד.

 

ציון ה‑import השני גורם לכך, שרק קובץ מחלקה בשם ActionEvent בחבילה java.awt.event
יהיה זמין באופן הנ"ל.

 

 

הידור תוכניות בעלות ציוני package

 

כיצד אם כן מהדרים תוכניות המכילות ציוני package? קרוב לוודאי, ישנה יותר מדרך אחת.
כאן תתואר הדרך המוצלחת ביותר בעיניי.

 

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

 

לאחר מכן, מקם את קבצי קוד ה‑source בכל אחת מהספריות, האמורות להכיל את קבצי המחלקות המשויכות עם אותם קבצי קוד source. (לאחר הידור ובדיקת התוכנית, תוכל להסיר את קבצי קוד ה‑source, אם תרצה בכך.)

 

אם רוצים, ניתן להדר את קבצי קוד ה‑source כל אחד לכשעצמו, אם כי אין זה הכרחי.

 

אחד מקבצי קוד ה‑source יכיל את המחלקה השולטת. מבחינתי, המחלקה השולטת היא זו שמכילה את מתודת ()main, שתבוצע כאשר תריץ את התוכנית משורת הפקודה באמצעות המפענח של Java

 

הפוך את הספרייה, שמכילה את קובץ קוד ה‑source, לספרייה הנוכחית שלך.
אם אינך יודע כיצד לעשות זאת, פנה ל‑
DOS For Dummies למידע.

 

כל אחד מקבצי קוד ה‑source חייב להכיל ציון package, המציין את החבילה שתכיל את הגירסאות המהודרות של כל הגדרות המחלקות באותו קובץ קוד source. אם תשתמש בהנחיות הניתנות כאן, ציון ה‑package יתאר גם את הספרייה שמכילה את קובץ קוד ה‑source .

 

כל קובץ קוד source המכיל קוד אשר מתייחס למחלקות בחבילה אחרת, חייב לכלול גם את ציוני ה‑import המתאימים, אחרת יהיה עליך להשתמש בשמות מאושרים של חבילות על מנת לגשת לאותן מחלקות.

 

לאחר מכן, השתמש בתוכנית javac, לפי בחירתך, כדי להדיר את קובץ קוד ה‑source המכיל את המחלקה השולטת. הדבר יגרום לכך, שכל שאר קבצי קוד ה‑source, המכילים מחלקות שמקושרות לקוד שבמחלקה השולטת (במישרין או בעקיפין), יהודרו גם כן.
על כל פנים, ייעשה ניסיון להדיר אותם. ייתכן שתגלה שגיאות הידור אחדות.

 

לאחר שנפטרת מכל שגיאות ההידור, תוכל לבדוק את האפליקציה באמצעות תוכנית java כדי לבצע את המחלקה השולטת.

 

לאחר שווידאת שהכל עובד כשורה, תוכל (אם תרצה) להעתיק את קבצי קוד ה‑source אל ספריית ארכיב ולהסיר אותם מהספריות של החבילה.

 

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

 

כעת, כיצד תבצע את התוכנית? ככל הנראה ישנה יותר מדרך אחת. עליך לזכור, כי ייתכן שהמחלקה השולטת אינה נמצאת על ה‑CLASSPATH. היא עשויה להיות בספרייה כלשהי, אי-שם בהיררכיית הספריות שלך. משום כך, לא יהיה די פשוט להקליד את שמה לאחר הפקודה java בשורת הפקודה, אלא אם כן הפכת תחילה את הספרייה, שמכילה את קובץ המחלקה השולטת, ל"ספרייה הנוכחית".

 

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

 

·       הופך תחילה את הספרייה, המכילה את קובץ המחלקה השולטת, ל"ספרייה הנוכחית".

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

 

כיום, כשיש לנו ממשקי משתמש גרפיים, אינני מרבה להשתמש בפרמטרים נוספים לאחר שם המחלקה השולטת בשורת הפקודה, אך אם דרוש לעשות זאת,
ניתן להשתמש באינדיקטורים %1,%2 של קבצי אצווה, המאפשרים להכניס פרמטרים משורת הפקודה לאחר שם קובץ האצווה
(אם אינך מבין מה זה אומר, ואתה מעוניין לדעת, פנה ל‑
DOS For Dummies ).

 

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

 

 05-01-04 / 18:01  נוצר ע"י רונית רייכמן  בתאריך 
 חבילות (Packages) - הקודםהבא - תוכנית לדוגמה 
תגובות הקוראים    תגובות  -  0
דרכונט
מהי מערכת הדרכונט?
אינך מחובר, להתחברות:
דוא"ל
ססמא
נושאי לימוד
חיפוש  |  לא פועל
משלנו  |  לא פועל
גולשים מקוונים: 3