אימות ב-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; // הצלחה
}התבנית הזאת מאפשרת לקורא לדעת אם הפעולה הצליחה. התובנה המרכזית היא שפונקציות הגדרה אינן עוסקות רק בהשמה: הן שומרות סף ואוכפות כללים לגבי המצבים שבהם האובייקט שלך יכול להיות. זהו הכוח האמיתי של אנקפסולציה: האובייקט שלך שומר על שלמותו, בלי קשר למה שקוד חיצוני מנסה לעשות.
אתגר
קלבואו נבנה מודול Temperature שמגן על הנתונים שלו באמצעות אימות בפעולת הקביעה. תיצרו מעקב אחר טמפרטורה שמקבל רק ערכים בטווח תקין: כך נדגים כיצד פעולות קביעה משמשות כשומרות סף למצב האובייקט.
תיצרו שלושה קבצים:
temperature.h: הממשק הציבורי שלכם, באמצעות תבנית המצביע האטום. הכריזו על טיפוסTemperatureבאמצעות הצהרה מקדימה בלבד. הכריזו על הפונקציות האלה:create_temperature: מקבלת מספר שלם עבור המעלות ההתחלתיות ומחזירה מצביע ל־Temperaturefree_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;
}
השיעור הזה כולל חידון קצר. התחילו את השיעור כדי לענות עליו ולעקוב אחרי ההתקדמות.
כל השיעורים ביחידה תכנות מונחה עצמים
4כימוס
המושג של מצביעים אטומיםהגדרת מבנים אטומיםפונקציות Get ו-Setאימות ב-Settersסיכום: הקופסה הסודית2אובייקטים ומתודות
מבנים כאובייקטיםמצביע 'Self'נכונות constמצביע לעומת ערךמתודות עזרחזרה: מנהל נקודות5פרויקט: חשבון בנק פשוט
הגדרת הפרויקטמימוש החשבוןתרגלו בעצמכם: קומפיילר C אונליין