Menu
Coddy logo textTech

אימות ב-Setters

חלק מהיחידה תכנות מונחה עצמים במסלול ה-C של Coddy. שיעור 20 מתוך 61.

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

חשבו על Counter שאסור לו לעולם להפוך לשלילי. בלי אנקפסולציה, כל אחד יכול לכתוב c->value = -50 ולפגוע במצב. באמצעות פונקציית הצבה, אתם שולטים באילו ערכים מותרים:

// counter.c
void counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return;  // דחה קלט לא תקין ללא הודעה
    }
    c->value = new_value;
}

כעת מתעלמים מערכים שליליים.

אפשר גם לבחור להחזיר קוד מצב כדי לציין הצלחה או כישלון:

int counter_set_value(Counter *c, int new_value) {
    if (new_value < 0) {
        return 0;  // כישלון
    }
    c->value = new_value;
    return 1;  // הצלחה
}

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

challenge icon

אתגר

קל

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

תיצרו שלושה קבצים:

  • temperature.h: הממשק הציבורי שלכם, באמצעות תבנית המצביע האטום. הכריזו על טיפוס Temperature באמצעות הצהרה מקדימה בלבד. הכריזו על הפונקציות האלה:
    • create_temperature: מקבלת מספר שלם עבור המעלות ההתחלתיות ומחזירה מצביע ל־Temperature
    • free_temperature: משחררת את הזיכרון שהוקצה
    • temp_get_degrees: פונקציית קבלת ערך שמחזירה את ערך הטמפרטורה הנוכחי
    • temp_set_degrees: פונקציית קביעת ערך שמחזירה int (1 להצלחה, 0 לכישלון)
    השתמשו בשומרי הכללה עם הסמל TEMPERATURE_H.
  • temperature.c: הגדירו את struct Temperature בפועל, עם איבר מוסתר int degrees. ממשו את כל הפונקציות. החלק החשוב הוא פונקציית קביעת הערך. היא צריכה לקבל רק ערכים שבין -50 ל־150 (כולל). אם הערך מחוץ לטווח הזה, החזירו 0 והשאירו את הטמפרטורה ללא שינוי. אם הערך תקין, עדכנו את הערך והחזירו 1.
  • main.c: הדגימו את האימות באמצעות ניסיון לקבוע טמפרטורות תקינות ולא תקינות, והראו שערכים לא תקינים נדחים בעוד שערכים תקינים מתקבלים.

תקבלו שלוש קלטים: הטמפרטורה ההתחלתית, טמפרטורה תקינה לקביעה (בתוך הטווח), וטמפרטורה לא תקינה לניסיון קביעה (מחוץ לטווח).

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

הדפיסו את הפלט בפורמט הזה:

Initial: {degrees}
Set {invalid}: {0 or 1}
After invalid: {degrees}
Set {valid}: {0 or 1}
After valid: {degrees}
Freed

לדוגמה, עם הקלטים 25, 100 ו־200, הפלט יהיה:

Initial: 25
Set 200: 0
After invalid: 25
Set 100: 1
After valid: 100
Freed

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

נסו בעצמכם

#include <stdio.h>
#include "temperature.h"

int main() {
    // קרא את הקלטים
    int initial, valid_temp, invalid_temp;
    scanf("%d", &initial);
    scanf("%d", &valid_temp);
    scanf("%d", &invalid_temp);
    
    // TODO: צור Temperature עם הערך ההתחלתי
    
    // TODO: הדפס את הטמפרטורה ההתחלתית
    // פורמט: "Initial: {degrees}"
    
    // TODO: נסה להגדיר את הטמפרטורה הלא תקינה
    // הדפס את התוצאה והראה שהערך נותר ללא שינוי
    // פורמט: "Set {invalid}: {0 or 1}"
    // פורמט: "After invalid: {degrees}"
    
    // TODO: הגדר את הטמפרטורה התקינה
    // הדפס את תוצאת ההצלחה והראה את הערך המעודכן
    // פורמט: "Set {valid}: {0 or 1}"
    // פורמט: "After valid: {degrees}"
    
    // TODO: שחרר את הזיכרון והדפס "Freed"
    
    return 0;
}
quiz iconבחנו את עצמכם

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

כל השיעורים ביחידה תכנות מונחה עצמים

תרגלו בעצמכם: קומפיילר C אונליין