התבונן בכל קוד מונחה עצמים והכל פחות או יותר עוקב אחר אותו דפוס. צור אובייקט, קרא כמה שיטות על אותו אובייקט ותכונות גישה של אותו אובייקט. אין עוד הרבה דברים שאתה יכול לעשות עם אובייקט אלא להעביר אותו כפרמטר לשיטה של אובייקט אחר. אבל מה שאנחנו עוסקים כאן זה תכונות.
תכונות הן כמו משתני מופע אתה יכול לגשת דרך תווית נקודת האובייקט. לדוגמה, person.name היה ניגש לשמו של אדם. באופן דומה, לעתים קרובות אתה יכול להקצות לתכונות כמו person.name = "אליס". זוהי תכונה דומה למשתני חבר (כמו ב- C ++), אך לא ממש זהה. אין שום דבר מיוחד שקורה כאן, התכונות מיושמות ברוב השפות באמצעות "getters" ו- "seters", או שיטות שמאחזות ומגדירות את התכונות ממשתני מופע.
רובי אינו מבחין בין גטרי-סגולות למתנחלים ובין שיטות רגילות. בגלל השיטה הגמישה של רובי המכנה תחביר, אין צורך להבדיל. לדוגמה, person.name ו person.name () הם אותו דבר, אתה מתקשר ל שם שיטה עם אפס פרמטרים. אחת נראית כמו שיחת שיטה והשנייה נראית כמו תכונה, אבל שניהם באמת אותו דבר. שניהם רק מתקשרים ל שם שיטה. באופן דומה ניתן להשתמש במשימה בכל שם שיטה המסתיים בסימן שווה (=). ההצהרה
person.name = "אליס" זה באמת אותו דבר כמו person.name = (אליס)למרות שיש רווח בין שם התכונה לסימן השווה, זה עדיין רק קורא ל- שם = שיטה.אתה יכול ליישם בקלות תכונות בעצמך. על ידי הגדרת שיטות מגדיר וגטר, תוכלו ליישם כל תכונה שתרצו. להלן קוד דוגמה ליישום ה- שם תכונה לשיעור אדם. זה שומר את השם ב- @name משתנה מופע, אך השם אינו חייב להיות זהה. זכור, אין שום דבר מיוחד בשיטות האלה.
דבר אחד שתבחין בו מייד הוא שמדובר בעבודה רבה. זה הרבה הקלדה רק כדי לומר שאתה רוצה תכונה בשם שם הגישה ל- @name משתנה מופע. למרבה המזל, רובי מספק כמה שיטות נוחות שיגדירו עבורכם שיטות אלה.
ישנן שלוש שיטות ב- מודול בכיתה בה תוכלו להשתמש בתוך הצהרות הכיתה שלכם. זכור כי רובי אינו מבחין בין זמן ריצה ל"קבץ זמן ", וכל קוד שנמצא בהצהרות הכיתה אינו יכול להגדיר רק שיטות אלא גם שיטות שיחה. מתקשר ל attr_reader, attr_writer ו- attr_accessor השיטות, בתורו, יגדירו את המתנחלים והגיטרים שהגדרנו בעצמנו בסעיף הקודם.
ה attr_reader השיטה עושה בדיוק כמו מה שזה נשמע שהיא תעשה. זה לוקח כל מספר של פרמטרים של סמל, ולכל פרמטר מגדיר שיטת "getter" המחזירה את משתנה המופע עם אותו שם. אז, אנו יכולים להחליף את שם בדוגמה הקודמת עם attr_reader: שם.
באופן דומה, ה- attr_writer שיטה מגדירה שיטת "קבע" לכל סמל המועבר אליו. שים לב שסימן השוויון לא צריך להיות חלק מהסמל, אלא רק בשם התכונה. אנחנו יכולים להחליף את ה- שם = מהדוגמה הקודמת עם קריאה אל attr_writier: שם.
וכצפוי, attr_accessor עושה את העבודה של שניהם attr_writer ו attr_reader. אם אתה זקוק גם למכונן וגם לגטר עבור תכונה, נהוג לא להתקשר לשתי השיטות בנפרד, ובמקום זאת להתקשר attr_accessor. נוכל להחליף שניהם ה שם ו שם = שיטות מהדוגמה הקודמת עם קריאה יחידה אל attr_accessor: שם.
מדוע עליך להגדיר מתנחלים ידנית? מדוע לא להשתמש ב- attr_ * שיטות בכל פעם? כי הם שוברים אנקפסולציה. אנקפסולציה היא העיקרית שקובעת שאף גורם חיצוני לא אמור להיות בעל גישה בלתי מוגבלת למצב הפנימי של שלך חפצים. יש לגשת לכל דבר באמצעות ממשק שמונע מהמשתמש להשחית את המצב הפנימי של האובייקט. בעזרת השיטות שלמעלה, חבטנו בחור גדול בקיר האינפסולציה שלנו ואיפשרנו לחלוטין להגדיר שם בשם, אפילו ברור ששמות לא תקפים.
דבר אחד שתראה לעיתים קרובות זה attr_reader ישמש להגדרה מהירה של גטר, אך יוגדר מגדיר מותאם אישית מכיוון שהמצב הפנימי של האובייקט לרוב רוצה להיות לקרוא ישירות מהמדינה הפנימית. לאחר מכן מוגדר הסדר ידנית ועושה בדיקות כדי להבטיח שהערך שנקבע הגיוני. או, אולי לעתים קרובות יותר, אף מגדיר אינו מוגדר כלל. השיטות האחרות בפונקציית המחלקה מגדירות את משתנה המופע מאחורי הגטר בדרך אחרת.
כעת אנו יכולים להוסיף גיל וליישם כראוי א שם תכונה. ה גיל ניתן להגדיר תכונה בשיטת הבנאי, לקרוא באמצעות גיל גטר אך רק מניפולציות באמצעות יש יום הולדת שיטה שתגדיל את הגיל. ה שם למאפיין יש גטר רגיל, אבל הסדיר מוודא שהשם מופיע בצורה של שם פרטי שם משפחה.