שתי שאלות ב-JAVA!!

shazbak

New member
שתי שאלות ב-JAVA!!

האם יש אפשרות לOPERATOR OVERLOADING ב-JAVA? איך,לעזאזל, אני מגדיר משהו כמו DEFINE שיש ב-C++ בJAVA?
 

DarkSwell

New member
תשובה,

קבוע בג'ווה זה final. ;final int n=1 אין אפשרות להעמסת אופרטורים ב ג'ווה.
 

Zack DA

New member
תשובות והערות:

1. אין בג'וואה operator overloading. הגיעו למסקנה שזה עושה יותר נזק מתועלת, ולכן פשוט אין. לדעתי, בכל הקשור לתכנות נכון, כמעט תמיד אין שום סיבה להשתמש בזה, ולכן עזוב את זה. מה שנראה אינטואיטיבי לך לא נראה אינטואיטיבי לאדם אחר. 2. לגבי קבועים, כפי שנאמר, אפשר להשתמש במילה השמורה final, אבל עדיף שזה יהיה סטטי. אם כבר, אז כבר. למשל:
static final String STATION_NAME = "barLev";​
 

shazbak

New member
אבל....

איפה אני כותב את ההגדרה של הDEFINE ב-JAVA(לא ממש הDEFINE אלא מה שאמרתם לי לעשות) כדי שזה יהיה זמין לכל המחלקות שלי?
 

DarkSwell

New member
תשובה,

כתוב את זה במחלקה שבה אתה כותב את פונקצית ה main.
 

Zack DA

New member
לא ! זה תכנון ממש לא נכון !

הנתונים האלה מאפיינים מידע כלשהו שחלק מעיצוב OO כלשהו - שים אותם למקום אליו הם שייכים.
 

zagzagzag

New member
אני מכיר שתי אפשרויות

1. להגדיר אותם במחלקה נפרדת -
public class MyConstants { public static final int C1 = 5; public static final int C2 = 8; }​
ואז אפשר להשתמש בקבועים כך:
if ( var == MyConstants.C1 )​
2. להגדיר אותם בממשק -
interface MyConstantsInterface { int C3 = 7; }​
ולהשתמש בהם כך:
public class Test implements MyConstantsInterface { int var = C3; }​
הפתרון השני קצת מגעיל לדעתי (ממשק לא אמור להיות מאגר של קבועים). ממה שהבנתי, בגרסה הבאה של ג'אווה תהיה אפשרות ליבא קבועים ממחלקות אחרות (import MyCostants.C1 )
 

ChipsMan

New member
מסקנה די מעניינת

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

Zack DA

New member
למה ?

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

ChipsMan

New member
אני חושב..

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

Zack DA

New member
יש דוגמאות אפילו יותר טובות מזה,

ועדיין אני סבור שזו החלטה טובה. עוד פעם, לא תמיד מי שקורא את הקוד מצוי בפרטים, גם אם זה מה שרצוי או אמור להיות - ובכל מקרה, אני מאמין שאפשר להתרגל לעבודה בלי אופרטורים גם בגרפיקה תלת מימדית, למרות שאני לא מתעסק בזה. בכל אופן, יש מספר מקרים קלאסיים כמו מתמטיקה, או למשל המקרה הידוע של get מרשימה (אופרטור ה- []) אבל עדיף לדעתי, אם כבר, ליצור אופרטורים כאלה באופן מובנה בשפה תחת איזה שהוא טיפוס, ולא לתת למשתמשים להשתולל עם דברים שלהם אולי נראים אינטואיטיבים, ולאחרים הם כאב ראש. בכלל זה bug prone לא קטן.
 
למעלה