לקראת המעבר לשפות תכנות מונחה עצמים

תקציר מאמר

Reges, S. (2002). Can C# Replace Java in CS1 and CS2?

Proceeding of ITiCSE'02, June 24-26, 2002, Aarhus, Denmark.

הוכן ע"י ח'ליפה וליד

החומרים שלפניכם הוכנו על ידי משתתפי סמינר קיץ למורים מובילים תשס"ד.

שימו לב: לא ניתן לעשות בחומר הזה כל שימוש מסחרי ללא רשות בכתב מראש מיוצרי החומרים.

 

תקציר המאמר:

בשנים האחרונות מתרחש מעבר מהוראת קורסי המבוא במדעי המחשב משפת C++  לטובת Java. הסיבות העיקריות למעבר הן: פשטות, תכנות מונחה עצמים ו- Type safety. Java מתעלה על C++ בשלושת הטעמים. המטרות האלה הן ביסוד תכנונה של C#. המאמר סוקר את הדימיון וההבדלים בין Java ו- C#, מתאר את היתרונות והחסרונות של לימוד הקורסים הראשונים במדעי המחשב ב- C# לעומת Java. קורסים אלה ניתנים לסטודנטים הלומדים מדעי המחשב באוניברסיטה. המאמר לא מתייחס למעבר מהוראה בשפה פרוצדורלית לשפה מונחית עצמים, אלא מתאר את ההבדלים בהוראה בין שתי שפות מונחות העצמים. כלומר ההחלטה ללמד כבר בהתחלה בשפה מונחית עצמים כבר התקבלה. המאמר מצדד בלנסות לעבור ללמד את קורסי המבוא בשפת C#, ובסוף הקורס לעבור גם על איך היו מתכנתים ב- Java.

Java ו- C# דומות בהרבה אספקטים: מנגנון שחרור זיכרון אוטומטי (Garbage Collection), אין פונקציות או משתנים חופשיים הכל ארוז בתוך מחלקות, בדיקות המרה (Casting) מתבצעות בזמן קומפילציה, אין הורשה מרובה, ממשקים ואפשרות מימוש מספר ממשקים, חריגות try/catch , threads, type safety.

נסתכל על הקוד הבא בשתי השפות:

Java

C#

public class Figure

{

     public static void main(Sting[] args)

     {

         for (int i=0 ; i<6 i++) {

           for (int j=0; j<6; j++)

                 if (i==j)

                     System.out.print(“\\”);

                 else if (i== 6-j-1)

                            System.out.print(“/”);

                          else  System.out.print(“*”);

             System.out.println();

              }

        }

}

using  System;

public class Figure

{

     public static void Main(sting[] args)

     {

         for (int i=0 ; i<6 i++) {

           for (int j=0; j<6; j++)

                 if (i==j)

                     Console.Write(“\\”);

                 else if (i== 6-j-1)

                            Console.Write(“/”);

                          else  Console.Writet(“*”);

             Console.WriteLine();

              }

        }

}

 

מהסתכלות בקוד, רואים כי ההבדל העיקרי הוא בשם של פקודת ההדפסה, ב- Java ההוראה היא System.out.print לעומת זאת ב- C# היא System.Console.Write.

יתרונות C# לעומת Java

 

C#

Java

קלט סטנרטי

קליטת תו, מחרוזת או מספרים יחסית קלה

קשה לבצע קלט, קיים צורך בלהתעסק עם חריגות

פונקציה ראשית

public static void Main(){

ניתן לכתוב את הפונקציה בלי הפרמטרים המועברים

public static void main(String [] args)

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

Consistent Object Model

מתייחסת לכל הטיפוסים כאל אובייקטים.

Stack s= new Stack();

s.push(19);

int x=(int)s.pop();

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

Stack s=new Stack();

s.push(new Integer(19));

int x=((Integer) s.pop()).intValue();

איטירטורים ולולאת foreach

ArrayList list= new ArrayList();

list.Add(9);

list.Add(20);

foreach (int x in list)

      sum+= x;

 

אין

Properties – מאפיינים

p2.x = p1.x  * 2;

הרבה יותר טבעי וקל.

p2.setX(p1.getX()*2);

שונות

בהעברת פרמטרים יש ref, out. ניתן להגדיר enum או struct, אירועים ומצביעים לפונקציות (delegates) ועוד.

אין

 

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

כותב המאמר למד את C# לקבוצת מתחילים. הוא מאמין כי השפה אפקטיבית ללימוד קורסי המבוא כמו Java. היא מתקנת כמה מחסרונות שפת Java שהיו קשים למתכנת המתחיל ומאפשרת ללמד אלמנטים ומאפיינים חדשים שיכולים להעשיר את הקורסים. C# יותר מורכבת מ- Java הודות להרבה אלמנטים נוספים הקיימים בה.

דעה אישית:

מנסיון אישי בהוראה בשתי השפות, נראה לי כי המעבר להתחיל ללמד את תלמידי התיכון ב- C# יהיה יותר קל מאשר ב- Java. יכול להיות, בגלל שמייקרוסופט נכנסה לשוק הרבה יותר מאוחר היא למדה מהיתרונות והחסרונות של אחרים. לפי החלטת הפיקוח לא יהיה שינוי בתוכניות הלימודים אלא בשפות בהן מלמדים. אבל חייבים להתייחס להבדלים כמו: העברת פרמטרים (ref,out) או struct או קלט ואחרות כפי שהן באות לידי ביטוי בשתי השפות ולהגדיר איך לטפל בהם. אני חושב כי המעבר אפשרי והשאלה העיקרית תישאר האם לעשות את הכל עם static (האם ניתן להגדיר טיפוסים חדשים ב- Java כאשר הכל static? ב- C# ניתן) או להיכנס לתכנות מונחה עצמים (ואז יהיה שינוי בתוכנית הלימודים).

 

חזרה לעמוד הראשי