ביתי אל מול גולן הוא פזמון שנכתב ב-1962 על ידי יוסף נצר (מילים) וחיים ברקני (לחן). השיר זכה לפופולריות בשנות ה-60 ובוצע מאז על ידי זמרים רבים.
השיר היה שיר הנושא למחזמר שנשא גם הוא את השם "ביתי אל מול גולן" והועלה בקיבוץ שער הגולן על ידי חבריו, לכבוד חג ה-25 לעליית הקיבוץ על הקרקע. נצר וברקני היו חברי שער הגולן וכתבו את המחזה ואת הלחנים. המחזה עסק בהווי הקיבוץ ובבעיותיו, אולם אלו תוארו ברוח טובה. הצלחתו של המחזמר הביאה להצגתו באמפיתיאטרון בצמח ולאחר מכן אף בהיכל התרבות בתל אביב. בהצגה שנערכה בקיבוץ ביצעה ראשונה את השיר בתי לרר (כיום, בת-עמי לשם).
מילות השיר מתארות את הקשר החזק הנוצר בנפש האדם אל המקום בו גדל כתוצאה מנופי ומחוויות הילדות:
בהמשך, הקליטו את השיר אמנים רבים נוספים. במיוחד זכו לפרסום ביצועיהם של שלישיית שריד, יפה ירקוני, הפרברים ואריק איינשטיין. עוד ביצעו את השיר הדסה סיגלוב, שמעון ישראלי, לוסי ארנון, אברהם פררה, אריק סיני ולהקת סטלה מאריס בעיבוד לסגנון רוק כבד.
בשיר נעשה גם שימוש בסרט הישראלי "אשת הגיבור" שצולם בחלקו בקיבוץ שער הגולן בבימויו של פיטר פריי ובכיכובם של בתיה לנצט, גדעון שמר ושמואל אומני.
בהצגה "שישה ימים" שהועלתה ב"בימת הקיבוץ" באוקטובר 1967, בבימויו של גיורא מנור, ועסקה בהשתקפות המלחמה בעיני הלוחמים בני הקיבוץ, שימש השיר כרקע יחד עם שירו של מאיר אריאל, "ירושלים של ברזל".
Dependency injection
הזרקת תלויות (באנגלית: dependency injection) היא תבנית עיצוב המאפשרת בחירה של רכיבי תוכנה בזמן ריצה (ולא בזמן ההידור). תבנית זו יכולה, לדוגמה, לשמש כדרך פשוטה לטעינה דינאמית של plug-ins או בחירה באובייקטי דמה (mock objects) בסביבות בדיקה, במקום להשתמש באובייקטים אמיתיים של סביבת הייצור. תבנית עיצוב זו מזריקה את האלמנט שתלויים בו (אובייקט או ערך, וכדומה) אל היעד שלו, בהתבסס על ידיעה של הצרכים של היעד.
הגדרה.
הזרקת תלויות כוללת לפחות שלושה אלמנטים:
האובייקט "התלוי" מתאר את רכיב התוכנה שהוא תלוי בו לצורך ביצוע העבודה שלו. "המזריק" מחליט אילו מחלקות קונקרטיות (concrete classes) מספקות את הדרישות של האובייקט התלוי, ומספק לו אותן.
בתכנות מסורתי, האובייקט התלוי מחליט בעצמו באיזה סוג של מחלקה קונקרטית הוא ישתמש. בעבודה עם הזרקת תלויות, החלטה זו מועברת אל ה"מזריק" שיכול להחליט בזמן ריצה להחליף בין מימושים קונקרטיים שונים של הממשק של התלות (dependency).
היכולת לבצע את ההחלטה הזו בזמן ריצה (ולא בזמן ההידור) היא היתרון המרכזי של הזרקת תלויות. בזמן ריצה, ניתן ליצור מימושים רבים שונים של אותו רכיב תוכנה, ולהעביר ("להזריק") אותו לאותו קוד בדיקות. כך קוד הבדיקות יכול לבדוק את כל רכיבי התוכנה השונים, מבלי להיות מודע לכך שמה שהוזרק לו ממומש באופן שונה.
שימושים ודוגמה.
המטרה העיקרית בשימוש בהזרקת תלויות היא על מנת לאפשר בחירה מבין מגוון מימושים של ממשק מסוים (הוא התלות - dependency) - בזמן ריצה או באמצעות קובצי קונפיגורציה, במקום בזמן ההידור. תבנית עיצוב זו שימושית במיוחד על מנת לספק מימושי "דמה" (mock) של רכיבים מורכבים בזמן ביצוע בדיקות תוכנה. כמו כן, לעיתים קרובות משתמשים בתבנית זו גם לצורך איתור רכיבי פלאג-אין או לאיתור ואתחול של שירותי תוכנה.
ביצוע של בדיקות יחידה של רכיבים במערכות תוכנה גדולות הוא קשה בגלל שלעיתים קרובות הרכיבים הנבדקים דורשים קיום של תשתית רחבה על מנת שבכלל יוכלו לפעול. הזרקת תלויות מפשטת את תהליך היצירה של מופע עובד של רכיב בודד לצורך בדיקה שלו. בזכות העובדה שרכיבים מכריזים על התלויות (dependencies) שלהם, טסט יכול באופן אוטומטי להביא רק את הרכיבים שתלויים בהם, הנדרשים לצורך ביצוע הבדיקה.
מעבר לזאת, בזמן ביצוע בדיקות, ניתן להגדיר את ה"מזריק" להחליף את המימוש הרגיל של הרכיב שתלויים בו, במימוש "דמה" מפושט. הרעיון הוא שהרכיב הנבדק יכול להיבדק בנפרד כל עוד הרכיבים שמוזרקים לו מממשים את החוזה של הממשק שהוא תלוי בו, באופן מספק לצורך ביצוע בדיקת היחידה הספציפית.
בתור דוגמה ניתן לחשוב על תוכנה למסחר אוטומטי במניות, אשר מתקשרת בזמן אמת עם שירות מסחר און-ליין, ושומרת את הנתונים ההיסטוריים בבסיס נתונים מבוזר. במצב רגיל, על מנת לבדוק את הרכיב שממליץ על עסקאות, יהיה צורך בחיבור אל שירות האון-ליין, ובבסיס נתונים מבוזר אמיתי, המכיל נתונים מתאימים לצורך הבדיקה. בשימוש בהזרקת תלויות, ניתן להחליף לגמרי את הרכיבים שמספקים גישה אל שירות האון-ליין ואל בסיס הנתונים, במימושי דמה של הממשקים שתלויים בהם, ובכך לספק את ה"חוזה", ולספק רק את הפונקציונליות הנדרשת לצורך ביצוע הבדיקות על הרכיב הנבדק, ולא מעבר לכך.
מימושים.
ללא הזרקת תלויות, הרכיב ה"צרכן" אשר נזקק לשירות מסוים לצורך ביצוע משימה כלשהי, חייב ליצור מופע של מחלקה קונקרטית אשר מממשת את ממשק התלות. לעומת זאת, כאשר משתמשים בהזרקת תלויות, הרכיב ה"צרכן" מציין את חוזה השירות על ידי ממשק, והרכיב ה"מזריק" בוחר את המימוש עבור הרכיב ה"תלוי".
במימוש הפשוט ביותר שלו, הקוד שיוצר את האובייקטים שהצרכן תלוי בהם, מספק את התלויות לאובייקט הזה דרך ארגומנטים של constructor או על ידי קביעת ערכים למשתני מחלקה (properties) של האובייקט (באמצעות מתודות set).
מימושים מורכבים יותר, כדוגמת Google Guice ,Spring Framework ו-(Microsoft Managed Extensibility Framework (MEF, מספקים אוטומציה של תהליך זה. תשתיות תוכנה אלה מזהות את הארגומנטים שקונסטרקטורים מקבלים, או את משתני המחלקה שיש ליצור, בתור בקשות לאובייקטים שתלויים בהם. במסגרת תהליך היצירה של האובייקט התלוי, הן אוטומטית מזריקות לו מופעים של התלויות שנוצרים מראש, כארגומנטים לקונסטרקטור או קובעות אותם כערכים עבור משתני המחלקה שלו. הלקוח יוצר בקשה למערכת הזרקת התלויות לקבלת מימוש של ממשק מסוים; מערכת הזרקת התלויות יוצרת את האובייקט, ובאופן אוטומטי ממלאת את התלויות בהתאם לצורך.
יתרונות.
יתרון אחד של שימוש בגישת הזרקת התלויות הוא בהפחתת הכמות של קוד החוזר על עצמו (boilerplate code) באובייקטים של היישום, מאחר שהעבודה לאתחול או הקמה של התלויות מבוצעת על ידי הרכיב ה"ספק".
יתרון נוסף הוא בכך שהזרקת תלויות מאפשרת גמישות בקונפיגורציה. ניתן להשתמש במימושים אלטרנטיביים של שירות מסוים מבלי להדר מחדש את הקוד. דבר זה שימושי בבדיקות יחידה מכיוון שזה מקל על הזרקת מימושים "מזויפים" של שירות לתוך אובייקט נבדק, על ידי עריכת קובץ קונפיגורציה, או על ידי שינויים ברישום האובייקטים בזמן ריצה.
כמו כן, שימוש בהזרקת תלויות מסייע בכתיבת קוד נוח לבדיקה.
סוגים.
מומחה התוכנה מרטין פאולר זיהה שלוש דרכים בהן אובייקט יכול לקבל קישור (reference) למודול חיצוני, בהתאם לתבנית המשמשת כדי לספק את התלות:
תשתיות תוכנה אחרות יכולות להשתמש גם בסוגי הזרקה שונים מאלה שמפורטים כאן.
דוגמאות קוד ב-Java.
בהתבסס על דוגמת התוכנה למסחר במניות שהוזכרה קודם, הדוגמאות הבאות בשפת Java ממחישות את הדרכים הטיפוסיות לביצוע הזרקת תלויות ידנית, והזרקת תלויות המבוצעת על ידי תשתיות (frameworks) ייעודיות.
הממשקים הבאים מגדירים את החוזים עבור התנהגות הרכיבים במערכת המסחר במניות:
public interface IOnlineBrokerageService {
String[] getStockSymbols();
double getAskingPrice(String stockSymbol);
double getOfferPrice(String stockSymbol);
void putBuyOrder(String stockSymbol, int shares, double bidPrice);
void putSellOrder(String stockSymbol, int shares, double offerPrice);
public interface IStockAnalysisService {
double getEstimatedValue(String stockSymbol);
public interface IAutomatedStockTrader {
void executeTrades();
תלויות מצומדות חזק (highly coupled).
הדוגמה הבאה מציגה קוד ללא יישום של הזרקת תלויות:
public class VerySimpleStockTraderImpl implements IAutomatedStockTrader {
private IStockAnalysisService analysisService = new StockAnalysisServiceImpl();
private IOnlineBrokerageService brokerageService = new NewYorkStockExchangeBrokerageServiceImpl();
public void executeTrades() {
for (String stockSymbol : brokerageService.getStockSymbols()) {
double askPrice = brokerageService.getAskingPrice(stockSymbol);
double estimatedValue = analysisService.getEstimatedValue(stockSymbol);
if (askPrice &lt; estimatedValue) {
brokerageService.putBuyOrder(stockSymbol, 100, askPrice);
public class MyApplication {
public static void main(String[] args) {
IAutomatedStockTrader stockTrader = new VerySimpleStockTraderImpl();
stockTrader.executeTrades();
המחלקה codice_1 יוצרת מופעים של codice_2 ו-codice_3 על ידי קישור נוקשה בקוד (hard coding) למחלקות הקונקרטיות שממשות את הממשקים (קריאה ישירה לקונסטרקטורים של המחלקות הקונקרטיות באמצעות המילה השמורה codice_4).
הזרקת תלויות ידנית.
ארגון מחדש של הקוד מהדוגמה הקודמת לשימוש בהזרקת תלויות ידנית תיראה כך:
public class VerySimpleStockTraderImpl implements IAutomatedStockTrader {
private IStockAnalysisService analysisService;
private IOnlineBrokerageService brokerageService;
//constructor
public VerySimpleStockTraderImpl(IStockAnalysisService analysisService, IOnlineBrokerageService brokerageService) {