הכרות עם Java.

ב־1.4.2009, מאת ארתיום; פורסם תחת: פיתוח, תכנה ומחשבים, C++‎‏; ‏12 תגובות

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

לאחרונה, התחלתי לכתוב יישומים ויישומונים ב־Java ביניהם רכיבי GUI קטנים. הסיבות לכך היו שניים:

  1. דרישת הקורס -- הגשת תרגילים ב־Java.‏
  2. צורך לכתוב רכיבי GUI בלתי תלויים בפלטפורמה גם למערכות אקזוטיות ביותר כמו OpenVMS.

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

  1. יש דור מתכנתים שמקולקלים ע"י Java וחושבים במושגים שלה גם בשפות תכנות אחרות.
  2. Java היא בהחלט שפה יפה... יפה בפשוטתה המוחלטת הגובלת באמירה --- "כל המתכנתים מטומטמים"

עכשיו נסכם בקצרה

כתיבת GUI

בניית GUI ב־Java עם swing הייתה די פשוטה ויפה. היא קצת הזכירה לי עבודה עם Qt. בסה"כ תוך זמן קצת הצלחתי לבנות טופס להזנת נתונים, לקשר בין אירועים לקריאת מתודות וכד'.

למרות שלא מצאתי מדריך ממצא של מבוא ל־Swing באיכות מדריכי Qt, מתוך דוגמאות הצלחתי לבנות מספר דברים נחמדים.

אחת הנקודות היפות שמצאתי, זה inner class שמכיר את אובייקט האבא שלו. המושג איננו קיים ב־C++‎‏1 ואפילו לא ב־C#‎, זה בהחלט נותן לך הבנה למה הטענה שלא צריך delegate ב־Java היא הגיונית. למעשה שיטת inner class של Java חזקה משמעותית מ־delegate כי היא יותר מזכירה ביטויי למבדא.

הנקודות השליליות ב־swing --- ברירות מחדל לא טובות, שליטה על Layout הרבה יותר מסובכת בהשוואה לזו שקיימת ב־Qt.‏ עבודה עם LookAndFeel דורשת התערבות ידנית בקוד (אם כי לא מסובכת).

Containers

המצב פה הזכיר לי קצת C. מצד אחד יש לך רשימות, עצים, hash, אבל מצד שני, הכל מרגיש כמו ב־C, כאלו הרשימה שלך זה רשימת void *‎. נכון, שהחל מ־Java 1.5 יש תמיכה ב־Generics והקונטיינרים הפכו לבטוחים יותר, עדיין, נשארת הרגשה של C.

בגדול, בסה"כ יש לך כלים נפוצים לעשות דברים נפוצים, אם כי חסר לי multimap של Stl.

התחושה הכללית

אחד הדברים הבולטים ביותר היא ש־Java משאירה לך טעם של:

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

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

  • כל המחלקות חייבות להופיע בקבצים נפרדים, שמות של קבצים חייבים להתאים לשמות של מחלקות.
  • אתה חייב לתפוס כל exception או להצהיר עליו שאתה נותן לו לחלחל הלה.
  • הפונקציה שלך יכולה רק להחזיר תוצאה אחת (אין pass-by-ref.‎) או שגיאה.
  • שגיאות הן רק exceptions.

ועוד. ללא ספק, זאת שפה מאוד נחמדה וקלה. קל לכתוב בה. לא צריך לחשוב הרבה. יש לה יתרון אדיר של פורטביליות גבוהה, כך שאפילו לא צריך לקמפל דבר. זאת, למעשה, השפה היחידה שמספקת רכיבי GUI כחלק אינטגרלי מ־SDK. לא Pascal, לא Python, לא Perl, לא C#‎ ולא C++‎, נותנים לך אפשרות כזו.2

נכון שאפשר לכתוב ב־C++‎ ב־Qt4, אפשר להשתמש ב־bindings ל־GTK,‏ Qt או WxWidgets ב־Python ואחרות... אבל כל אלה גוררים עשרות תלויות ולא באות כברירת מחדל עם ההתקנה של השפה.

השפעת Java על קוד C++‎.

אחרי שהתחלטתי לכתוב קצת ב־Java הבנתי שקיים דור מתכנתים מקולקל. לדוגמה:

  1. בונים מחלקות שונות ולכל אחת מהן מממשים פונקציה toString()‎... למעשה, הם שוכחים דבר פשוט:

    • ב־C++‎ אין ירושה מרוכזת מ־Object לכן, אין כל־כך משמעות לכתוב לכל דבר toString.
    • ב־C++‎ לא מממשים toString אלא:

        ostream &operator<<(ostream &, MyClass const &);‎
      

      ואז אפשר לכתוב את האבייקט לקובץ, אפשר להפוך אותו מחרוזת, אפשר להשתמש בו ב־boost::format או ב־boost::lexical_cast.‏

  2. ב־C++‎ משום מקום צץ מושג של Method שמנסה להחליף member function.‏
  3. פתאום לאובייקט שיש לו member function שנקרא next()‎ הופך ל"איטרטור".
  4. פתאום מנסים להעביר לכל מקום מצביע או אפילו shrared_ptr‎ במקום reference או ערך הפשוטים והמקובלים ב־C++‎, כדי לחכות את מנגנון ניהול זכרון של שפות רבות בהן אובייקט הוא למעשה מצביע.

ועוד הרבה דברים כאלה שבאים מהשפעת Java על עולם שונה בצורה מהותית.

סיכום

  1. Java נותנת לי תחושה של כתיבה ב־Basic המשודרגת ל־OOP.‏
  2. Java בהחלט שפה קלילה ונחמדה לכתוב בה.
  3. Java בהחלט מגינה עליך מטעויות גסות.
  4. היא יותר סבילה למתכנתים לא מנוסים או כאלה שלא רוצים לחשוב בכלל.
  5. הייתי משתמש בה עבור פרויקטים קטנים שלא איכפת לי כמה "מנופחים" הם יהיו.
  6. אני כנראה אשתמש בה עבור GUI כאשר פורטביליות וקלות הפצה מרבית היא דרישה חזקה.

  1. ביטויי למבדא ב־C++0x נותנים משהו "דומה".
  2. למעשה, אקדים ואומר ש־FreePascal עם Lazarus נותן לך GUI, אבל, השפה עדיין אינה פורטבילית כמו Java (מישהו אמר VMS?) וחסרת תיעוד.

    חוץ מזה FreePascal הרבה יותר מבולגנת כי מנסה לתמוך בדיאלקטים שונים, למשל, שני סוגי מחלקות -- נוסח TP ונוסח Delphi.

תגובות

ik_5, ב־1.4.2009, 1:17

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

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

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

לא הבנתי את הכוונה שלך לגבי שפת פסקל. ל FPC יש תמיכה בדיאלקטים, אבל אתה לא חייב לעבוד עם כולם. אני למשל משתדל לעבוד רק עם OBJFPC, כי הוא הכי גמיש ונוח. אם אתה רוצה פסקל "נקי", אז מומלץ לעבוד עם GNU Pascal, אבל לדעתי האישית הוא ממש לא נוח לתכנות, כי הוא בנוי ברוח הסטנדרטים הישנים ביותר.

מאיר, ב־1.4.2009, 1:24

פייתון מגיעה עם tkinter.

אורן, ב־1.4.2009, 2:00

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

ארתיום, ב־1.4.2009, 7:32

נראה לי שיש לך טעות, מתודה זה מונח שהגיע מג'אוה ולא מ- CPP כפי שכתבת.

תקרא שוב באיזה הקשר כתבתי... הכוונה שמי שכותב ב־C++‎ ועדיין מדבר כמו ב־Java.

דבר שני swig לא מגיע עם השפה.

הוא חלק מ־JDK:‏ Java Development Kit, כך שאם אתה מתקין java של sun וכלי הפיתוח שלה, אז אתה מקבל גם swing. אולי אתה מתבתבל עם swt.

לדעתי אתה נגשת לתכנת בג'אווה עם יותר מידי חשיבה בשפת ++C וזה לא בריא

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

מה שרציתי להגיד שיש מתכנתי C++‎ שעדיין חושבים ב־Java.

פייתון מגיעה עם tkinter.

אתה יודע מה... זה מעניין, אני מאוד מקווה שהוא עובד גם ב־VMS. אגב, הבעיה העיקרית של tk זה שהוא נראה נורא בלינוקס.

מאיר, ב־1.4.2009, 13:16

אולי זה עשוי לעזור: http://whatsup.org.il/article/6112

ארתיום, ב־1.4.2009, 13:22

אגב, tkinter לא עזר לי, הוא לא בא עם Python על VMS.

נדב, ב־1.4.2009, 14:02

האם אובונטו עושה את המשתמשים למטומטמים?

ורק מי שמתעסק כל היום בבעיות עם גנט'ו הוא חכם?

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

ארתיום, ב־1.4.2009, 14:25

ההבדל שבגנט'ו ובC/++ אתה מתעסק הרבה ב"שטויות"/סיסטם בעוד שבג'אווה/אובונטו אתה יכול להתמקד ביעילות במה שאתה רוצה לעשות/לפתח וכו, ואז תגיע להשגים הרבה יותר מהירים וטובים…

אתה מבלבל שני דברים שונים. ב־Ubuntu אתה עדיין יכול לרדת עד לרמה הכי קטנה, לקמפל קרנל אם צריך לעשות 10001 דברים שונים, כאשר הרוב נעשה פשוט.

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

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

מאיר, ב־1.4.2009, 15:45

זה לא קשור לטמטום. זה קשור לטיפול במערכות מאוד מורכבות (שוק ה-enterprise בו ג'אווה חזקה). דוגמא: בצורה כזו תדע באופן מיידי היכן למצוא מחלקה שונה ומה הקובץ בו אתה צופה אמור להכיל, אחרת המערכות האלה יוצאות מכלל שליטה.

זה לא שאני אוהב את זה, אך צריך להבין את הדרישה שזה עונה עליה.

ארתיום, ב־1.4.2009, 16:13

זה לא קשור לטמטום. זה קשור לטיפול במערכות מאוד מורכבות (שוק ה-enterprise בו ג'אווה חזקה). דוגמא: בצורה כזו תדע באופן מיידי היכן למצוא מחלקה שונה ומה הקובץ בו אתה צופה אמור להכיל, אחרת המערכות האלה יוצאות מכלל שליטה.

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

sijp, ב־15.4.2009, 22:52

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

מה שאני זוכר זה שבתנאי שאחת המחלקות היתה public היא היתה צריכה לקבל את שם הקובץ.

וסתם שאלה שמעניינת אותי. השנה ביקרתי בתיכון שלמדתי בו במסגרת יום פתוח (כבוגר כמובן :)) ודיברתי עם המורים וגיליתי שהיום לומדים הכל בג'אווה עפ"י משרד החינוך. אני חשבתי שזה רעיון רע אבל המורים חשבו שזה טוב. הטענה שלי היתה מאוד דומה לשלך - שזו שפה מנָוֶנת שמקנה הרגלים רעים. הם טענו שזה מספיק טוב בשביל הרמה הנדרשת מתלמידים בכיתות י'-י"ב. מה דעתך?

ארתיום, ב־15.4.2009, 23:05

זו שפה מנָוֶנת שמקנה הרגלים רעים. הם טענו שזה מספיק טוב בשביל הרמה הנדרשת מתלמידים בכיתות י'-י"ב. מה דעתך?

בואו נגיד ככה, היום הייתי בוחר ב־Python לצורך המטרה של לימוד בסיסי --- הבנת מושגים עקרוניים בתכנות. לעומת זאת, אחר כך הייתי ממשיך ל־C או Pascal.

היתרון העיקרי של Java זה ה־JDK העשיר שלה שמאפשר לך לכתוב גם יישומי GUI וגם יישומים רבים אחרים.

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

אתה מוזמן לקרוא כאן את דעתי על Java בתור שפת התכנות הראשונה: כיצד היום מלמדים לתכנת -- טעות או קידמה?

אגב, תשים לב שהיום בבית הספר מלמדים הרבה גם על Asp.Net ו־C#‎. ביניםה לבין Java בחירה שלי ברורה --- Java!!! (אפילו ש־C#‎ נחשבת למתקדמת יותר)

הוסף תגובה:

 
 כתובת דוא"ל לא תוצג
 

ניתן לכתוב תגובות עם שימוש בתחביר Markdown.

חובה לאפשר JavaScript כדי להגיב.

דפים

נושאים