הוראת מדעי המחשב באקדמיה והשלכותיה על הוראת עיצוב תכנה בתיכון
Download
Report
Transcript הוראת מדעי המחשב באקדמיה והשלכותיה על הוראת עיצוב תכנה בתיכון
JAVA/C#כשפת תכנות ראשונה
(באוניברסיטה ובתיכון)
נעם ניסן ,אוניברסיטה עברית
Slide 1 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
נסיון עם הוראת JAVA
• נלמד באוניברסיטה העברית מאז 1996
שפת תכנות ראשונה – במבוא למדעי המחשב --מאז 1999
• כיום שפת תכנות ראשונה באוניברסיטאות רבות בכל
העולם – כנראה ברובן
• שפת התכנות בתיכונים בארה"ב בתכנית המתקדמת (ה-
)APמאז 2003
• למיטב ידעתי בשום מקום בעולם (אוניברסיטה ,מכללה ,או
תיכון) מעולם לא לימדו C#כשפת תכנות ראשונה
Slide 2 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
למה להתחיל עם שפה OOולא עם שפה יותר פשוטה?
•
•
•
•
•
תכנות מונחה עצמים מנצח בעולם
מאפשר ,באמת ,הפרדה אמיתית בין ממשק למימוש
מאפשר ,באמת ,שימוש פשוט בספריות
מימוש בשפה של הרעיון של טיפוסי נתונים אבסטרקטים
מוטיבציה ,כיף
Slide 3 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
הבעיות האדמיניסטרטיביות של המעבר לJAVA/C#-
בתיכון
• רק השפה שונתה ולא הפרדיגמה
יש לשנות את הדגשים ,סדר הלימוד ,המבחנים ,הדוגמאות ,ועוד
• לא ברור באיזה שלב לומדים את האלמנטים הבסיסיים
ביותר
בניית אובייקטים
ירושה
יחידה חמישית ( )OOלעומת רביעית (מבני נתונים)
• אף אחד מהמעורבים בשינוי לא שולט ממש בתכנות OO
ועדת המקצוע ,כותבי הספרים ,המורים
התוכנית תשתנה בשנים הקרובות
בינתיים המורים צריכים לכסות על קלקולי המערכת
Slide 4 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
תמונת העולם
תכנות OO
תכנות פרוצדורלי
אלגוריתמים
נתונים
Slide 5 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
איך לפרק תכנית לתתי-יחידות?
תכנית בשפה מודולריתOO/
תכנית בשפה פרצדורלית
פרוצדורה
פרוצדורה
מחלקה/מודול
פרוצדורה
פרוצדורה
נתונים
Slide 6 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
הצגת אובייקטים לראשונה – מתי?
• יתרונות של הצגה מוקדמת
בניה נכונה של חשיבה OOמהמסד
דגש על ממשק לעומת מימוש
אפשרות שימוש בספריות תכנות "כייפי"
• חסרונות של הצגה מוקדמת
שינוי מהקיים
חוסר תשומת לב לתכנות בסיסי (לולאות ,וכו')
קושי
• גישה שלי:
Slide 7 of 38.
שימוש באובייקטים נתונים מההתחלה
בניית אובייקטים חדשים רק לאחר שליטה בתכנות בסיסי
ירושה עוד יותר מאוחר
נעם ניסן
תכנות מונחה עצמים בתיכון
שימוש באובייקטים משלב 0
Slide 8 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
דוגמה :שימוש בצב LOGO
Slide 9 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
הגדרת הממשק של צב – שמסופק לתלמידים כקופסה
שחורה
צב נמצא על המסך בנקודה מסוימת ופונה לכוון מסוים .בקצה זנבו
עפרון המשאיר סימן.
"פקודות" שאפשר לתת לו:
new Turtle()
moveForward(distance)
turnRight(degrees)
turnLeft(degrees)
tailUp()
tailDown()
Slide 10 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
Using a Turtle
public class TurtleDrawing {
public static void main(String[] args){
Turtle leonardo = new Turtle();
leonardo.tailDown();
leonardo.moveForward(100);
leonardo.turnRight(60);
leonardo.moveForward(100);
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 11 of 38.
:1 תרגיל בית מספר
• Hello World!
• Write a class called Pentagons that draws two pentagons
with all the edges 100 units long, as shown in the
following figure:
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 12 of 38.
יתרונות
• התנסות משמעותית באלגוריתמים מאוד פשוטים
אפילו ללא לולאות או IF
• התנסות מסיבית בשימוש בהפשטות
רק כך ניתן להבין כיצד יש להפריד ממשק ממימוש
הבנה של חשיבות התיעוד ()API
• כיף
Slide 13 of 38.
תרגילי בית פשוטים ונחמדים
נעם ניסן
תכנות מונחה עצמים בתיכון
רקורסיה עם צבים --פרקטלים
Slide 14 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
TurtleFractal
public class TurtleFractal {
static Turtle turtle = new Turtle();
public static void main(String[] args)
turtle.tailDown();
drawFractal(500,4);
}
public static void drawFractal(int
if (level==0)
turtle.moveForward(length);
else {
drawFractal(length/3, level-1)
turtle.turnLeft(60);
drawFractal(length/3, level-1)
turtle.turnRight(120);
drawFractal(length/3, level-1)
turtle.turnLeft(60);
drawFractal(length/3, level-1)
}
}}
תכנות מונחה עצמים בתיכון
נעם ניסן
{
length, int level){
;
;
;
;
Slide 15 of 38.
שימוש במחלקות מתוך הספריה הסטנדרטית
import java.util.Random;
public class RandomNumbers {
public static void main (String[] args){
Random generator = new Random();
int num = generator.nextInt();
System.out.println ("A random int: " + num);
num = generator.nextInt();
System.out.print(“Another one: “ + num);
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 16 of 38.
שימוש במחלקות שנבנו מראש לקלט ופלט
public class CircleCalc {
public static void main(String[] args){
final double PI = 3.14159;
InputRequestor in = new InputRequestor();
OutputWindow out = new OutputWindow();
double r = in.requestDouble("Radius: ");
out.println("Radius = " + r);
out.println("Area = " + PI * PI * r);
out.println("Circumference = " + 2 * PI * r);
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 17 of 38.
גרפיקה משלב 0
Slide 18 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
Smiley Applet
import java.applet.Applet;
import java.awt.*;
public class Smiley extends Applet{
public void paint (Graphics page){
page.setColor(Color.yellow);
page.fillOval(50,50,300,300);
page.setColor(Color.black);
page.fillOval(125,125,50,50);
page.fillOval(225,125,50,50);
page.drawLine(150,275,250,275);
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 19 of 38.
הגדרת אובייקטים חדשים
Slide 20 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
מתי ללמד הגדרת אוביקטים חדשים?
• דומה לשאלה "מתי ללמד פרוצדורות בשפה פרצדורלית?"
• שתי גישות:
כמה שיותר מהר – אפילו לפני לולאות
לאחר שיש לתלמידים שליטה בתכנות רגיל :לולאות ,משתנים... ,IF ,
• הגדרת מחלקה+שיטות כאלמנט האבסטרקציה הבסיסי
Slide 21 of 38.
כבר השתמשו לרוב
הגדרת ממשק מאוד טבעית
מימוש "טיפוסי נתונים אבסטרקטיים" לפני התמקדות בטיפוסים "חכמים"
ניתן לתת מראש תוכניות מוכנות שמשתמשות במחלקה הנדרשת
נעם ניסן
תכנות מונחה עצמים בתיכון
Clock class
public class Clock {
public Clock(int h, int m, int s){ … }
public void secondElapsed() { … }
public int getHours() { … }
public int getMinutes() { … }
public int getSeconds() { … }
// implementation missing
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 22 of 38.
) מתודה לדוגמא+ מימוש לדוגמא (שדות
private int hours, minutes, seconds;
public void secondElapsed() {
if (seconds < 59) seconds++;
else {
seconds=0;
if (minutes < 59) minutes++ ;
else { minutes = 0; hours = (hours+1)%12; }
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 23 of 38.
החלפת המימוש
private int secondsFromZero;
public void secondElapsed() {
secondsFromZero = (secondsFromZero+1)%(12*60*60);
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 24 of 38.
תרגיל סיכום להגדרת אובייקטים חדשים
כל הגרפיקה נכתבה
עבור התלמידים
על התלמידים לכתוב
רק את המחלקות:
Paddle
Ball
Brick
Game
לפי APIנתון
Slide 25 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
מבני נתונים (היחידה הרביעית)
Slide 26 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
מבני נתונים (היחידה הרביעית)
• נלמד רק לאחר שהובהר כבר כל הרעיון של מימוש לעומת
ממשק
• כל הדיון על "טיפוס נתונים אבסטרקטי" מאבד את עוקצו
שכן כעת מדובר פשוט על ממשק של מחלקה לעומת
מימושים שלה.
• שני אלמנטים אינטלקטואלים חדשים:
טיפול מובנה באוספים של אברים ))Collections
טיפול במבני נתונים דינמים
Slide 27 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
טיפוסי נתונים עיקריים של Collections
•
•
•
•
מערך ,סדרה :גישה לפי אינדקס – לא לפי ערך
קבוצה ,אוסף :גישה לפי ערך – ללא סדר פנימי של
האברים
מחסנית ,תור :גישה לפי סדר הכנסה
טבלה :אוסף זוגות – גישה לפי ערך מפתח
• רשימות מקושרת ועצים בינאריים הינם מבני נתונים
המאפשרים לממש את הטיפוסים האלו.
• לפעמים מסתכלים עליהם כטיפוסי נתונים בפני עצמם – אך
הגדרה מדויקת של הטיפוס האבסטרקטי קשה
Slide 28 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
Stack using an Array
public class Stack {
private int[] elements;
private int top;
private final static int DEFAULT_MAX_SIZE = 10;
public Stack(){
elements = new int[DEFAULT_MAX_SIZE];
top=0;
}
public void push(int x) { elements[top++] =x; }
public int pop() { return elements[--top]; }
public boolean isEmpty() { return top == 0; }
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 29 of 38.
)ListNode רשימה מקושרת בסיסית (לפעמים נקרא
public class List {
private int data;
private List next;
public List(int data, List next) {
this.data = data;
this.next = next;
}
public int getData() {
return data;
}
public List getNext() {
return next;
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 30 of 38.
Stack using a List
public class Stack {
private List elements;
public Stack() { elements = null; }
public void push(int x) {
elements = new List(x, elements);
}
public boolean isEmpty() { return elements == null; }
public int pop() {
int x = elements.getData();
elements = elements.getNext();
return x;
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 31 of 38.
מניפולציות של רשימות
LIST מתוך
public class List {
// fields and methods
// as before
public int length() {
int n=1;
List p=this;
while (p.next != null){
p=p.next;
n++;
}
return n;
}
{
תכנות מונחה עצמים בתיכון
במחלקה אחרת
public class Other {
// …
static int length(List p){
int n=1;
while(p.getNext()!=null){
p=p.getNext();
n++;
}
return n;
}
{
נעם ניסן
Slide 32 of 38.
רקורסיה עם רשימות
public class List {
private int data;
private List next;
// List(), getData(), getNext() as before
public int length() {
if (next==null) return 1;
return 1+next.length();
}
{
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 33 of 38.
ירושה (תורשה)
Slide 34 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
שני הפנים של ירושה
• ירושה של תכונות
שדות
מימוש של מתודות
שימוש מחדש בקוד
די פשוט קונצפטואלית
• ירושה של מחויבויות (ממשק)
מתודות וירטואליות
פונקציה מורצת נבחרת בזמן ריצה
מתוחכם ודורש רמה חדשה של הפשטה
מאפשר פולימורפיזם
מאפשר "תכנות מסדר שני"
Slide 35 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון
דוגמא לירושת קוד
public class IntelligentTurtle extends Turtle {
public void drawPolygon(int n, double edgeSize) {
double theta = 360.0 / n;
for (int i=0; i<n; i++) {
moveForward(edgeSize);
turnLeft(theta);
}
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 36 of 38.
דוגמא למתודות וירטואליות
public class X {
public int getVal() { return 1; }
}
public class Y extends X {
public int getVal() { return 2; }
}
public class Test {
public static void main(String[] args) {
X x;
x = new Y();
System.out.println(x.getVal());
// Will print 2!!
}
}
תכנות מונחה עצמים בתיכון
נעם ניסן
Slide 37 of 38.
לא לשכוח:
לנו קשה להחליף פרדיגמת תכנות
לתלמידים קל ללמוד מראש פרדיגמה טובה
Slide 38 of 38.
נעם ניסן
תכנות מונחה עצמים בתיכון