Menu
CoddyTech

אימות ב-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;  // הצלחה
}

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

challenge icon

אתגר

קל

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

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

  • temperature.h: הממשק הציבורי שלך, באמצעות תבנית המצביע האטום. הצהר על טיפוס Temperature באמצעות הצהרה מקדימה בלבד. הצהר על הפונקציות הבאות:
    • create_temperature: מקבלת מספר שלם עבור המעלות ההתחלתיות ומחזירה מצביע ל-Temperature
    • free_temperature: משחררת את הזיכרון שהוקצה
    • temp_get_degrees: getter שמחזירה את ערך הטמפרטורה הנוכחי
    • temp_set_degrees: setter שמחזירה int (1 להצלחה, 0 לכישלון)
    השתמש בשומרי הכללה עם הסמל TEMPERATURE_H.
  • temperature.c: הגדר את struct Temperature בפועל, עם איבר int degrees מוסתר. ממש את כל הפונקציות. החלק החשוב הוא ה-setter שלך. היא צריכה לקבל רק ערכים בין -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

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

נסו בעצמכם

#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 אונליין