שאלה ב OOP
מתלבט במשהו, ויכול להיות שיש איזה pattern או פתרון יותר אלגנטי. אני מפתח בסביבת דוט נט (התחלתי ב 1.1 ועברתי ל 2), בעיקר ב asp.net. יש את הקובץ web.config שניתן להגדיר אותו כך שיחזיק הגדרות לאפליקציה כולה, תחת המפתח appSettings. העניין הוא שלפעמים איזה משתמש שיש לו גישה לקובץ משנה / עלול לשנות את ההגדרה כך שהיא "בלתי אפשרית", ואני רוצה להגן על האפליקציה בפני מצב שכזה, ולהתעלם להערך השגוי ופשוט לשים ערך אחר, שמוגדר בקוד עצמו, כלומר hard coded. למשל, הגדרה שאמורה להיות מספר שלם חיובי - מרגע שאינה כזו אני קובע לה את הערך 123 (למשל). מכיוון שרוב ההגדרות שאני רוצה להגן עליהן בצורה הזו הן מספרים מסוג int, יצרתי מחלקה קטנה. ב CTOR שלה אני מכניס את ה string שמגיע מההגדרה, ערך ברירת מחדל (123 בדוגמה הקודמת), וכן גבולות לבדיקה (אופציונלי). להלן המחלקה:
מתלבט במשהו, ויכול להיות שיש איזה pattern או פתרון יותר אלגנטי. אני מפתח בסביבת דוט נט (התחלתי ב 1.1 ועברתי ל 2), בעיקר ב asp.net. יש את הקובץ web.config שניתן להגדיר אותו כך שיחזיק הגדרות לאפליקציה כולה, תחת המפתח appSettings. העניין הוא שלפעמים איזה משתמש שיש לו גישה לקובץ משנה / עלול לשנות את ההגדרה כך שהיא "בלתי אפשרית", ואני רוצה להגן על האפליקציה בפני מצב שכזה, ולהתעלם להערך השגוי ופשוט לשים ערך אחר, שמוגדר בקוד עצמו, כלומר hard coded. למשל, הגדרה שאמורה להיות מספר שלם חיובי - מרגע שאינה כזו אני קובע לה את הערך 123 (למשל). מכיוון שרוב ההגדרות שאני רוצה להגן עליהן בצורה הזו הן מספרים מסוג int, יצרתי מחלקה קטנה. ב CTOR שלה אני מכניס את ה string שמגיע מההגדרה, ערך ברירת מחדל (123 בדוגמה הקודמת), וכן גבולות לבדיקה (אופציונלי). להלן המחלקה:
internal class IntSafeValue { private int _value; public int Value { get { return _value; } } public IntSafeValue(string configName, int defaultValue, int? minValue, int? maxValue) { string temp; int k; // try to get the config value temp = System.Configuration.ConfigurationManager.AppSettings[configName]; if (string.IsNullOrEmpty(temp)) { // no value, return default value _value = defaultValue; return; } // there was something in the config file, // now check if it's an int if (!int.TryParse(temp, out k)) { // not an int _value = defaultValue; return; } // do some more logic checks... if ((null != minValue) && (minValue.HasValue) && (k < minValue.Value)) { _value = defaultValue; return; } if ((null != maxValue) && (maxValue.HasValue) && (k > maxValue.Value)) { _value = defaultValue; return; } // all ok, return the value from config
_value = k; } }
בסוף התהליך אני מקבל ב property שנקרא Value ערך שהגיע תקין מההגדרות או שעבר תיקון (לא מפריע לי). דוגמה לשימוש:
IntSafeValue temp = new IntSafeValue("activationHours", 5, 1, 1000); if (myValue <= temp.Value) { // do something... }
הסבר: קח מה web.config את הערך שיש תחת המפתח "activationHours", ודא שהוא int, וכן שהוא בין 1 ל 1000. אם הוא לא עומד במי מהתנאים שהוגדרו - השתמש בערך 5. ואחרי כל ההקדמה הזאת, מגיעה השאלה שלי. טכנית, ניתן גם לכתוב מתודה (סטאטית) שמבצעת את כל הבדיקות הנ"ל ומחזירה int. האם יש איזשהו יתרון בכתיבה של הסיפור הזה כמחלקה לעומת מתודה סטאטית של איזה Util? איך אתם הייתם כותבים את זה (ולמה?). תודה רבה מראש ...