מצגת השיעור - קורס תכנות מתקדם

Download Report

Transcript מצגת השיעור - קורס תכנות מתקדם

‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫תכנות מתקדם ‪89-211 2‬‬
‫תרגול מספר ‪12‬‬
‫תש"ע ‪2009-2010‬‬
‫מבוא ל ‪Groovy‬‬
‫אליהו חלסצ'י‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫הקדמה‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫‪ Groovy‬היא שפת סקריפט לפלטפורמת ‪Java‬‬
‫שפות סקריפט מאפשרות קלות וגמישות בתכנות‬
‫הן דינאמיות ולכן יש פחות הגבלות משפה רגילה‬
‫מאפשרות פיתוח מהיר יותר (פחות קוד לכתוב)‬
‫על חשבון זמן ריצה ‪interpreter -‬‬
‫שפות כגון ‪ Python‬או ‪ Ruby‬עברו בהצלחה‬
‫לפלטפורמה של ‪Java‬‬
‫– ‪JRuby ,Jython‬‬
‫• אז למה יש לנו צורך ללמוד עוד שפה??‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫הקדמה‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫לא צריך ללמוד שפה חדשה כדי לתכנת ב ‪groovy‬‬
‫• ‪ Jython‬ו ‪ JRuby‬נותנות הרגשה של‬
‫‪ Python‬ו ‪Ruby‬‬
‫– הן גם משתמשות בספריות הקוד שלהן‪...‬‬
‫– ‪ Groovy‬נותנת הרגשה של ‪ Java‬ללא הגבלות‬
‫• ‪ Groovy‬מבדילה עצמה מהאחרות באמצעות‬
‫– התחביר שלה‬
‫– והיכולת להשתמש בספריות הסטנדרטיות של ‪Java‬‬
‫באופן טבעי‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫הקדמה‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫אין צורך יותר בקימפול‬
‫מתאפשר שימוש ב ‪dynamic types‬‬
‫תחביר עם פחות אילוצים‬
‫ניתן להריץ סקריפטים בתוך אפליקציות ‪Java‬‬
‫‪ Groovy‬מגיעה עם ‪interpreter‬‬
‫– מפרש בזמן ריצה את הקוד ל ‪ byte code‬ומריץ אותו‬
‫• תזכורת‪ Scala :‬תומכת גם בקימפול הקוד לפני‬
‫ריצה‪ ,‬ולכן היא סקלבילית גם לתוכנית גדולות‪...‬‬
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
Java ‫הבדלים מ‬
:‫ מפורש לבאים‬import ‫• לא צריך לבצע‬
• java.io.*
)‫ (לפי תוכן‬equals ‫• == זה‬
• java.lang.*
• java.math.BigDecimal
:
‫מערך‬
‫הגדרת‬
•
• java.math.BigInteger
•
•
•
•
java.net.*
java.util.*
groovy.lang.*
groovy.util.*
int ][a = {1,2,3};
int ][a = [1,2,3[
‫– במקום‬
‫– יש לכתוב‬
:for ‫• לולאות‬
‫– במקום‬
:‫– הבאים אפשריים‬
for (int i=0; i < len; i++) {...}
for (i in 0..len-1) {...}
for (i in 0..<len) {...}
len.times {...}
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫הבדלים מ ‪Java‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫המילה ‪ return‬אופציונאלית‬
‫‪ this‬מתוך מתודה סטטית מתכוון למחלקה‬
‫ברירת המחדל למתודות ולמשתני מחלקה –‬
‫‪public‬‬
‫ל ‪ protected‬אותה המשמעות כמו ב ‪Java‬‬
‫בינתיים לא ניתן ליצור מחלקה בתוך מחלקה‬
‫– אך יש תמיכה ב ‪)!( closures‬‬
‫• ‪ Groovy‬לא בודק חתימה של ‪ throws‬למתודה‬
‫– משום שאין הבדל מבחינתו בין ‪ checked‬לבין‬
‫‪unchecked exceptions‬‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫קיים ב ‪ Groovy‬ולא ב ‪Java‬‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫תמיכה ב ‪Closures‬‬
‫תחביר מיוחד לרשימות ומפות‬
‫תמיכה בביטויים רגולריים כחלק מתחביר השפה‬
‫תמיכה גם ב ‪ static‬וב ‪dynamic typing‬‬
‫– לא צריך להצהיר על טיפוס‬
‫– איטרציה פולימורפית‬
‫– ‪ Switch Case‬פולימורפיים‬
‫• ניתן להטמיע ביטויים בתוך מחרוזות‬
‫– לא צריך לשרשר מחרוזות וביטויים בעצמנו‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫קיים ב ‪ Groovy‬ולא ב ‪Java‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫• נוספו המון מתודות עזר ל ‪JDK‬‬
‫• קל יותר לכתוב ‪Beans‬‬
‫– ‪ Beans‬הן מחלקות רגילות המשמשות כ ‪struct‬‬
‫– ב ‪ Java bean‬צריך להגדיר ‪ setters‬ו ‪getters‬‬
‫– וב ‪ Groovy bean‬לא צריך‪ ,‬נעשה אוטומטית‬
‫• במשפטי ‪ if‬לא צריך לוודא תחילה שהאובייקט אינו‬
‫‪null‬‬
‫• תמיכה ב ‪functional programming‬‬
‫– לדוג'‬
‫} )‪def fac(n) { n == 0 ? 1 : n * fac(n - 1‬‬
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
‫צעדים ראשונים‬
:‫• אתר רשמי‬
http://groovy.codehaus.org/ –
:‫• הוראות התקנה‬
http://groovy.codehaus.org/Installing+Groovy –
:eclipse ‫ ל‬plug-in ‫• התקנת ה‬
http://dist.springsource.org/release/GRECLIPSE/e3.5/ –
:‫• יצירת פרויקט חדש‬
Filenewproject… –
GroovyGroovy project –
‫– או ע"י‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫צעדים ראשונים‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫• ניצור קובץ חדש ע"י ‪srcnewfile‬‬
‫• נקרא לו בשם ‪myTest.groovy‬‬
‫"!‪x="Hello World‬‬
‫• כבר ניתן לראות ש‪:‬‬
‫‪println x‬‬
‫– ב ‪ script‬אין צורך ב ‪...main‬‬
‫– ‪Dynamically Typed‬‬
‫– ‪ x‬יכול להיות כל טיפוס‬
‫‪x = 1‬‬
‫‪println x‬‬
‫)(‪x = new java.util.Date‬‬
‫‪println x‬‬
‫‪x = -3.149‬‬
‫‪println x‬‬
‫‪x = false‬‬
‫‪println x‬‬
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
‫רשימות ומפות‬
‫• פעולות נפוצות‬
list=[]
map=[:]
list.add ("Hello")
map.put ("hello", "World!")
list.add ("World!")
list+=['today','is',new Date()]
map+=['today is':new Date(), 89:210,
'advanced':'programming']
println list.join(' ')
println map['hello']
println list[0]
println list[-1]
println list.size()
list = [4, 5, 6, 6, 4, 7, 2]
println list.count(6)
println list.sort()
println map.hello
map[89]=211
println map[89]
println map.size()
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫‪closures‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫• ‪ Closure‬מזכיר מחלקה אנונימית פנימית אלא ש‬
‫– הוא בעצם מתודה אחת הניתנת לקריאה‬
‫– הוא יכול לקבל פרמטרים (כמה שנרצה)‬
‫– ללא פרמטרים אפשר לעשות שימוש ב ‪it‬‬
‫} )"}‪closure = { param -> println("hello ${param‬‬
‫)"!‪closure.call("world‬‬
‫} )‪closure = { greeting, name -> println(greeting + name‬‬
‫)"!‪closure.call("hello ", "world‬‬
‫} ‪closure = { println "hello " + it‬‬
‫)"!‪closure.call("world‬‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫מבוא ל‬
‫‪closures‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫דוגמאות למעבר על אוספים באמצעות ‪Closures‬‬
‫• אפשר באמצעות לולאת ‪for‬‬
‫{)‪for(x in list‬‬
‫‪sum+=x‬‬
‫• אפשר באמצעות מתודות‬
‫}‬
‫עזר כגון ‪ each‬המקבלות‬
‫}‪list.each {sum+=it‬‬
‫‪ closure‬כפרמטר‬
‫}‪list.findAll {it>5}.each{sum+=it‬‬
‫}‪list.findAll {x -> if(x>5) sum+=x‬‬
‫• ‪ it‬כמו גם הפרמטרים‪,‬‬
‫}‪list.findAll {if(it>5) sum+=it‬‬
‫יכולים להיות מכל טיפוס‬
‫}‪println list.every {it>5‬‬
‫}‪println list.any {it>5‬‬
‫(איטרציה פולימורפית)‬
‫• כיצד נעבור על ‪ map‬באמצעות ‪?closure‬‬
‫}"‪map.each{key,val -> println "$key = $val‬‬
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
Dynamic Typing
x ‫• קודם ראינו השמה של טיפוסים שונים לאותו ה‬
:‫ לדוגמא‬,‫• ניתן גם להניח מה יש לאובייקט‬
class Movie{
int length
String name
}
class Book{
String name
String author
}
def myFavorite(thing){
println "my favorit "+thing.class +" is "+ thing.name
}
movie= new Movie(length:124, name:"Star Wars")
book = new Book(name:"The War of the Worlds", author:"H.G. Wells")
myFavorite(movie)
myFavorite(book)
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
Dynamic Typing
‫ הפרמטר לא חייב‬,switch case ‫• גם במבנה‬
...‫להיות מטיפוס מסוים‬
def x = 1.23
case 12..30:
def result = ""
result = "range"
switch ( x ) {
break
case "foo":
case Integer:
result = "found foo"
result = "integer"
// lets fall through
break
case "bar":
case Number:
result += "bar"
result = "number"
case [4, 5, 6, 'inList']:
break
result = "list"
default:
break
result = "default"
}
println result == "number"
‫מבוא ל‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫ביטויים רגולריים‬
‫•‬
‫•‬
‫•‬
‫•‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫זוכרים את ‪ Pattern‬ואת ‪?Matcher‬‬
‫~= מחזיר מופע של ‪Matcher‬‬
‫בהקשר בוליאני מחזיר אמת אם קיים מופע לתבנית‬
‫~== בודק התאמה לתבנית‬
‫"‪str = "89211‬‬
‫‪println str ==~ /\d+/‬‬
‫– בעצם קורא ל )(‪.matches‬‬
‫• קיימות מתודות עזר‬
‫– ‪replaceAll‬‬
‫– ‪replaceFirst‬‬
‫– ועוד‬
‫"‪"AGCGTTCGAG GCTAGATTAA‬‬
‫= ‪str‬‬
‫{)'‪if (str =~ 'TT‬‬
‫'‪println 'found a match‬‬
‫}‬
‫"‪ptrn = ~"TT‬‬
‫)'‪nStr = (str =~ ptrn).replaceAll('GC‬‬
‫‪println nStr‬‬
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
beans
‫ מספיק לכתוב רק את המאפיינים‬Groovy ‫ב‬
...‫ קיימים אוטומטית‬getters ‫ וה‬setters ‫ה‬
public ‫כאמור ברירת המחדל היא‬
:‫דוגמא‬
class Foo {
// read only property
final String name = "John"
// property with public getter and protected setter
Integer amount
protected void setAmount(Integer amount) { this.amount = amount }
// dynamically typed property
def cheese
}
•
•
•
•
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
beans
:Groovy ‫• ב‬
class Customer {
// properties
Integer id
String name
Date date
// sample code
static void main(args) {
def customer = new Customer(id:1, name:"Bean", date:new Date())
println("Hello ${customer.name}")
println("your id is "+customer.getId())
}
}
‫הקדמה‬
Java ‫הבדלים מ‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
...‫סיכום תרגולי הקורס‬
‫מבוא ל‬
12 ‫ – תרגול‬2 ‫ תכנות מתקדם‬89-211
beans
import java.util.Date;
‫ היינו חייבים‬Java ‫• ב‬
public class Customer {
// properties
import ‫– להוסיף‬
Getters ‫ ו‬Setters –
‫– לאתחל את המאפיינים‬
...‫אחד אחד‬
private Integer id;
private String name;
private Date date;
public Integer getId() {
return this.id;
}
public String getName() {
return this.name;
}
public Date getDob() {
// sample code
return this.date;
public static void main(String[] args) {
}
Customer customer = new Customer();
public void setId(Integer id) {
customer.setId(1);
this.id = id;
}
customer.setName("Bean");
public void setName(String name) {
customer.setDob(new Date());
this.name = name;
}
System.out.println("Hello " + customer.getName());
public void setDob(Date date) {
System.out.println("your id is "+customer.getId());
}
this.date = date;
}
}
‫מבוא ל‬
‫סיכום תרגולי הקורס‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫כבר עברה לה שנה‪ ...‬בואו נראה מה למדנו‪:‬‬
‫סמסטר א'‪:‬‬
‫• שפת ‪Java‬‬
‫סמסטר ב'‪:‬‬
‫• כלים שימושיים‬
‫– היכרות עם ‪Java‬‬
‫– תחביר ‪Java‬‬
‫– ‪Java containers‬‬
‫•‬
‫•‬
‫‪Shared libraries‬‬
‫כלים שימושיים‬
‫– ‪SVN, ANT, Junit‬‬
‫•‬
‫תכנות מקבילי‬
‫– מבוא ל ‪Threads‬‬
‫– נושאים מתקדמים ב ‪Threads‬‬
‫•‬
‫•‬
‫– ‪Mercurial‬‬
‫– ‪Maven‬‬
‫– ‪Tomcat , Jetty‬‬
‫•‬
‫– ‪Sockets‬‬
‫– ‪Servlets, JSP‬‬
‫• עבודה מול מסד נתונים‬
‫– ע"י שכבת ‪Hibernate‬‬
‫•‬
‫ארכיטקטורות של ‪web services‬‬
‫– ‪Rest, Comet‬‬
‫‪SWT – Event driven GUI‬‬
‫‪Design Patterns‬‬
‫•‬
‫– ‪Creational, Structural,‬‬
‫‪Behavioral‬‬
‫•‬
‫• ‪Spring Framework‬‬
‫• דוגמת ‪ Design‬גדולה‬
‫תקשורת ו ‪web‬‬
‫הרצת תוכנית ‪ Java‬כשירות‬
‫– ‪Daemon, Service‬‬
‫שפות חדשות‬
‫– מבוא ל ‪Scala‬‬
‫– מבוא ל ‪Groovy‬‬
‫מבוא ל‬
‫סיכום תרגולי הקורס‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫כבר עברה לה שנה‪ ...‬בואו נראה מה למדנו‪:‬‬
‫סמסטר ב'‪:‬‬
‫• כלים שימושיים‬
‫סמסטר א'‪:‬‬
‫• שפת ‪Java‬‬
‫– היכרות עם ‪Java‬‬
‫– תחביר ‪Java‬‬
‫– ‪Java containers‬‬
‫•‬
‫•‬
‫– ‪Mercurial‬‬
‫– ‪Maven‬‬
‫– ‪Tomcat , Jetty‬‬
‫•‬
‫‪Shared libraries‬‬
‫כלים שימושיים‬
‫– ‪Sockets‬‬
‫– ‪Servlets, JSP‬‬
‫– ‪SVN, ANT, Junit‬‬
‫•‬
‫• עבודה מול מסד נתונים‬
‫תכנות מקבילי‬
‫– ע"י ‪Hibernate‬‬
‫– מבוא ל ‪Threads‬‬
‫– נושאים מתקדמים ב ‪Threads‬‬
‫•‬
‫• ‪SWT – Event driven GUI‬‬
‫יכולים להיות‬
‫בהחלט‬
‫• אנו‬
‫‪Design‬‬
‫‪Patterns‬‬
‫– ‪Creational, Structural,‬‬
‫‪Behavioral‬אנו מתכנתים‬
‫אבל האם‬
‫• ‪Spring Framework‬‬
‫• דוגמת ‪ Design‬גדולה‬
‫תקשורת ו ‪web‬‬
‫ארכיטקטורות של ‪web services‬‬
‫– ‪Rest, Comet‬‬
‫‪ Java‬כשירות‬
‫גאים הרצת‬
‫•‬
‫ההספק!‬
‫תוכניתעל‬
‫בעצמנו‬
‫– ‪Daemon, Service‬‬
‫שפות?חדשות‬
‫•‬
‫מתקדמים‬
‫– מבוא ל ‪Scala‬‬
‫– מבוא ל ‪Groovy‬‬
‫מבוא ל‬
‫סיכום תרגולי הקורס‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬
‫כדי להיות מתכנתים מתקדמים‪:‬‬
‫• תגישו פרויקט איכותי עד ל ‪...dead line‬‬
‫• תעלו את הסיכומים ל ‪ wiki‬ותלמדו טוב למבחן!‬
‫• תכירו לעומק את השפה בה אתם מתכנתים‬
‫• תהיו הראשונים ללמוד על טכנולוגיות‪ ,‬שפות וכלים חדשים ברגע‬
‫שהם רואים אור‬
‫• תשכילו להשתמש בכלים‪ ,‬בשפות התכנות ובספריות הקוד שהכי‬
‫מתאימים לעבודה הנדרשת‬
‫• תחשבו על ‪( design‬גמיש) לפני שתחשבו על קוד‬
‫• תממשו את בדיקת הקוד לפני כתיבתו‪...‬‬
‫• תזכרו שאתם לא מתכנתים לבד בפרויקט‪...‬‬
‫• תתרמו לפרויקט קוד פתוח!!‬
‫• הכי חשוב‪ :‬תצברו ניסיון‬
‫• תארו את הניסיון שלכם בבלוג ;‪)-‬‬
‫מבוא ל‬
‫סיכום תרגולי הקורס‬
‫‪ 89-211‬תכנות מתקדם ‪ – 2‬תרגול ‪12‬‬
‫אני מודה לכם מאד על ההקשבה‪,‬‬
‫הנכונות להשתתף בשיעור ולשאול שאלות‪,‬‬
‫ובעיקר על ההתמדה‪...‬‬
‫נותר לי רק לאחל לכם בהצלחה!‬
‫בפרויקט‪ ,‬במבחן‪ ,‬בהמשך התואר ובכלל‪...‬‬
‫אלי‪.‬‬
‫הקדמה‬
‫הבדלים מ ‪Java‬‬
‫צעדים ראשונים‬
‫דוגמאות קוד‬
‫סיכום תרגולי הקורס‪...‬‬