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

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.‬‬
‫נעם ניסן‬
‫תכנות מונחה עצמים בתיכון‬