מחולל כתובות אמריקאיות מפיק כתובות מלאות לפי דרישה, ומרכיב אותן ממספר בית, משם רחוב, מיחידה אופציונלית, מעיר, מקיצור של מדינה בן שתי אותיות ומיקוד בן חמש ספרות שלעיתים נושא הרחבה בת ארבע ספרות. מה שמפריד בין מחולל שימושי לבין בונה מחרוזות אקראיות הוא ההסכמה בין כל השדות: העיר שייכת למדינה, והמיקוד שייך לשתיהן יחד. אותה הסכמה היא גם מה שהופך את הרשומה לשמישה בבדיקה חוזרת, כי היא נשארת תקפה גם כשהסביבה מתחלפת וגם כשהטבלה נבנית מחדש מגלגול קוד מאוחר יותר.
המדריך הזה עובר על מה שמרכיב כתובת אמריקאית בפועל, על היחסים בין המדינות, הטריטוריות והחלוקות המנהליות זו לזו, על הסיבה לכך שעקביות בין המיקוד לעיר חשובה יותר מכפי שרוב הצוותים מעריכים, ועל מקומו המדויק של הגבול בין רשומה שימושית לרשומה שנראית אמיתית. בסופו של דבר אפשר לזהות אילו פגמים בכתובת הטפסים אמורים לתפוס, ואילו מהם המחולל מסיר בשקט עוד לפני שהבודק הספיק לחשוב עליהם.
ממה מורכבת כתובת של ארצות הברית?
כתובת אמריקאית נכתבת מהקטן אל הגדול, וזהו ההפך מהסדר שנהוג ביפן ובמערכות דואר נוספות. שורת הנמען באה ראשונה, אחריה מספר הבית ושם הרחוב, אחר כך ציון היחידה או הדירה, אחריו שם העיר, אחריו קיצור המדינה, ולבסוף המיקוד. כשהכתובת נכתבת בשורה אחת, התבנית המקובלת מאחדת את העיר ואת המדינה, מוסיפה פסיק, ומניחה את המיקוד בסוף השורה. מחולל כתובות אמריקאיות שמכבד את הסדר הזה מפיק תווית שנקראת נכון בעיני מוביל, ואילו מחולל שמשנה את סדר הרכיבים מפיק שורה שנראית זרה גם כאשר כל ערך בתוכה נכון לחלוטין.
רכיב המדינה הוא תמיד קוד בן שתי אותיות ולא שם כתוב במלואו, ושירות הדואר מחזיק את הרשימה הזו כמערכת סגורה שאינה מתרחבת לעיתים קרובות. המיקוד הוא בן חמש ספרות, ומאז סוף שנות השמונים של המאה הקודמת יכול לבוא אחריו מקף וסיומת בת ארבע ספרות, שמזהה מקטע מסירה קטן יותר בתוך אותו אזור. טופס שמקבל את הצורה המורחבת חייב לקבל את שני האורכים גם יחד, כי מערך נתונים שנושא רק את הגרסה בת חמש הספרות לא יפעיל לעולם את המסלול הארוך, וכך יישאר החלק הזה של הקוד ללא כיסוי אמיתי.
ציון היחידה הוא השדה שסביר ביותר להיות אופציונלי במערכת אחת וחובה באחרת. דירה, סוויטה, קומה, יחידה או מספר בניין יכולים להיכתב כמילה ואחריה מספר, כסימן סולמית ואחריו מספר, או כמספר בלבד בשורה שנייה. כל הצורות האלה מופיעות בנתונים אמיתיים, ולכן מפענח שמטפל רק בצורת המילה ידחה קלט תקין לחלוטין וידווח על שגיאה שלא קיימת. אותה בעיה חוזרת גם בשדה מספר הבית, שמקבל לעיתים אות בסיומת ואף טווח של מספרים.
במה נבדלים המדינות, מחוז קולומביה והטריטוריות
חמישים מדינות, מחוז קולומביה והטריטוריות המאוכלסות נושאים כל אחד קוד בן שתי אותיות משל עצמו, ואין להחליף ביניהם ברשימה נפתחת. מחוז קולומביה נושא את הקוד DC ומתנהג כמדינה לצורכי כתובת, אך הוא אינו מדינה, ומערכת שדוגמת את הרמה הראשונה בהיררכיה בשם מדינה תייגה אותו שלא כהלכה בדוחות ובסינונים ותחזיר תוצאות חסרות בלי שתדע מדוע.
הטריטוריות הן הבעיה השקטה יותר. פוארטו ריקו נושאת את הקוד PR, גואם נושאת את הקוד GU, איי הבתולה של ארצות הברית נושאים את הקוד VI, סמואה האמריקאית נושאת את הקוד AS, ואיי מריאנה הצפוניים נושאים את הקוד MP. חלק ממערכות המשלוח והמס מתייחסות אליהן כיעדים פנים-ארציים וחלק מתייחסות אליהן כיעדים בין-לאומיים, ולכן טופס שמקבע את ארצות הברית כמדינה היחידה הקבילה לצד קוד של טריטוריה ייצור שילוב ששאר המערכת דוחה בהמשך הדרך.
קיימת גם קבוצה של מדינות בשיוך חופשי ואזורים מבודדים קטנים שמופיעים במערכי עזר עם קודים משלהם אך כמעט אינם מופיעים על תווית משלוח. מחולל שמצהיר על כיסוי אמריקאי צריך להיות מפורש בשאלה אם הוא כולל רק את חמישים המדינות, או את המדינות בתוספת מחוז קולומביה, או את המערכת המלאה כולל הטריטוריות. ההבדל הזה קריטי כשהבודק מפעיל רשימה נפתחת של תחומי שיפוט ולא שדה של כתובת רחוב, כי שני השדות נכשלים בדרכים שונות לגמרי.
מדוע המיקוד, העיר והמדינה חייבים לנוע יחד
הפגם הנפוץ ביותר בנתוני כתובת אמריקאיים שנבנו ביד הוא אי התאמה בין המיקוד לבין המקום שאליו הוא אמור להשתייך. מישהו בוחר שם עיר סביר, מקליד מספר בן חמש ספרות שנראה סביר, ולשני הערכים אין כל קשר זה לזה. שום דבר בשני הערכים אינו נראה שגוי כשהוא עומד לבדו, וזו בדיוק הסיבה שהפגם שורד את סבב הבדיקה ומגיע לנתוני הבדיקה המשותפים בלי שאיש יעצור אותו.
בחירה אקראית בלתי תלויה מחמירה את המצב במקום לשפר אותו. אם שולפים שם עיר מתוך רשימה של אלף שמות ומיקוד מתוך טווח של ארבעים אלף אפשרויות, הסיכוי שהזוג יהיה אמיתי הוא זניח לחלוטין, והסיכוי שיהיה אמיתי פעמיים ברצף קטן עוד יותר. זה אותו כשל שמופיע בכל מדינה אחרת, בין אם מדובר בנפה טורקית ששויכה למחוז הלא נכון ובין אם מדובר במיקוד ברזילאי שהוצמד לרשות מקומית אחרת לגמרי.
התיקון הוא מבני ולא עריכתי. קובעים תחילה את המדינה, אחר כך בוחרים עיר ומיקוד ששניהם שייכים לאותה מדינה, ומגזירים מאזור זה גם את קידומת הטלפון. מחולל שפועל בסדר הזה לא יכול להפיק זוג חוצה אזורים, וזו הסיבה שמחולל הכתובות באתר הזה בונה כל רשומה ממדינה אחת ומטה. הקשר הרחב בין השדות נדון במאמר על עקביות שדות, והוא חל על עמודות כתובת בדיוק כפי שהוא חל על עמודות זהות.
מה באמת מסמל הכיסוי שמאחורי מחולל כתובות אמריקאיות?
קל לנפח נתוני כיסוי וקשה לפרש אותם, ולכן כדאי לדעת למה בדיוק מתייחסים המספרים. באתר הזה מערך הנתונים האמריקאי משתרע על המערכת המלאה של חלוקות מהרמה הראשונה, על קרוב למאתיים יישובים מאוכלסים, על קצת פחות מאלפיים חלוקות מנהליות שמתחתם, ועל יותר משלושה עשר אלף מיקודים שנלקחו מהקצאה אמיתית ולא הומצאו לצורך העניין.
המספרים האלה חשובים פחות מהיחסים ביניהם. מאתיים ערים מול שלושה עשר אלף מיקודים פירושם שלמקום ממוצע יש מיקודים רבים, ומחולל שדוגם את רשימת הערים ואת רשימת המיקודים בנפרד עדיין יפיק אי התאמה ברוב המקרים. הטענה המשמעותית אינה כמה ערכים קיימים, אלא שכל עיר נבחרת מגיעה תמיד עם מיקוד ששייך לה. כלי שמפיק זוג נכון מכל שתי רשימות שווה יותר מכלי שמחזיק רשימה ארוכה יותר של ערכים שאינם מקושרים, כי רק הראשון אפשר לשלב בבדיקה שעוד תהיה תקפה בשנה הבאה.
כדאי גם לדעת למה משמשת החלוקה שמתחת לרמת העיר. במדינות רבות הרמה הביניים היא היחידה שאליה נקשרים המיקודים, וזו הסיבה שמערכי הנתונים מאורגנים בהיררכיה ולא כרשימות שטוחות. טופס כתובת ששואל רק עיר, מדינה ומיקוד משליך שכבה שמדינות אחרות ידרשו ממנו, ומערכת בדיקות שלא מפעילה את השכבה הזו לא תגלה את ההבדל עד שיגיע קהל משתמשים ממדינה אחרת.
אילו פגמי כתובת הטפסים אמורים לתפוס
נתונים מחוללים שימושיים כדי לוודא שטופס מקבל קלט תקין, והם שימושיים עוד יותר כדי לוודא שהוא דוחה קלט שגוי. הפגמים שראוי לכתוב עבורם מקרי בדיקה הם אלה שהטופס מסוגל לזהות: מיקוד קצר מדי או ארוך מדי, קוד מדינה שאינו ברשימה, עיר שאינה תואמת את המדינה הנבחרת, ציון יחידה ארוך מהשדה, ושורת רחוב שחורגת מרוחב העמודה שנשמרה במסד הנתונים.
מולם עומדים המקרים שהטופס אינו מסוגל לזהות ולכן גם לא צריך להעמיד פנים שהוא מזהה. מיקוד בפורמט תקין ששייך לעיר אחרת מזו שהוזנה אינו משהו שאימות בצד הלקוח יכול לפתור, וכך גם שם עיר שנכתב אחרת מהשם הרשמי או שם רחוב שנכתב בתעתיק שונה. התייחסות למקרים האלה כאל כשל אימות מייצרת דחיות שווא, וזו תוצאה גרועה יותר מקבלת רשומה מוזרה במקצת.
קובץ בדיקה יעיל לתהליך רכישה מכיל בדרך כלל אצווה של רשומות כתובת אמריקאיות מחוללות למסלול התקין, קבוצה קטנה של ערכים פגומים בכוונה למסלול הדחייה, ורשומה או שתיים בעלות צורה חריגה אך חוקית, כגון קוד של טריטוריה, מיקוד מורחב, ושם רחוב שנושא נקודה. המאמר על מקרי בדיקה לטופס כתובת בקופה מונה דוגמאות נוספות, והמאמר על תבנית כתובת בין-לאומית מסביר מדוע אותו שדה יכול להיות חובה במדינה אחת ונעדר לחלוטין באחרת. כששדה דוחה ערך, כדאי לבחון גם את ההודעה ולא רק את הדחייה עצמה, כי הודעה ברורה והודעה גנרית נכשלות אצל משתמשים בדרכים שונות לגמרי.
האם כתובות אמריקאיות מחוללות ניתנות למסירה?
הן אינן ניתנות למסירה, וכל כלי ישר חייב לומר זאת במפורש. לכתובת מחוללת יש מבנה נכון ואת היחסים הפנימיים הנכונים, וזה בדיוק מה שמפענח טופס, מערכת כללי אימות או תהליך רכישה צריכים כדי לפעול. היא אינה מצביעה על בניין אמיתי, היא אינה רשומה על שמו של איש, והיא לא תתקבל על ידי שירות משלוחים כלשהו כיעד מסירה.
קל לטשטש את ההבחנה הזו כשהנתונים נראים רגילים לחלוטין. מספר הבית סביר, שם הרחוב הוא שם רחוב אמיתי שבשימוש במקום כלשהו במדינה, והעיר קיימת באמת וברשימות רשמיות. הצירוף הוא שהופך את הרשומה לבדיונית, כי אותו בית מסוים באותו רחוב מסוים אינו תואם לרשומה שמוצגת על המסך.
המשמעות המעשית היא כלל ששייך להערות מערך הנתונים ולא להערה שאיש אינו קורא. הרשומות האלה קיימות כדי לבדוק תוכנה, אסור להשתמש בהן למשלוחים אמיתיים, ואסור להציג אותן כמעונו של מישהו. אם צילום מסך של נתוני הסביבה הפנימית יוצא מהסביבה, הרשומה צריכה להצהיר על מהותה בעצמה, כדי שמי שרואה אותה יידע מיד שמדובר בנתוני בדיקה.
כיצד לשמור את התוצאה לשימוש חוזר בהמשך
יש לשמור כתובות מחוללות כנתוני בדיקה קבועים ברגע שיש להן תכלית, ולשמור לצידן את פרמטרי ההפקה. רשומה ששומרת את מפתח הזהות, את המדינה ואת הזרע שממנו הופקה ניתנת להפקה מחדש גם שנים לאחר מכן, וזה מה שהופך בדיקת רגרסיה ישנה למשמעותית ולא למסתורית. המאמר על נתוני כתובת בקבצי בדיקה מכסה את הצד המעשי של השמירה הזו.
יש להחזיק את עמודות הכתובת בנפרד מכל השאר. שמות נמענים, הערות פנימיות, פרטי ספק והוראות מסירה אינם שייכים בתוך שורת הרחוב, כי ערבובם מנפח את אורכה, שובר בדיקות תווים ומייצר כשלים שנראים כמו בעיות כתובת כאשר התקלה האמיתית היא בסכימה שהתירה טקסט לא קשור לעבור דרכה.
ולבסוף, יש לאמת את היחסים במקום להניח אותם כמובנים מאליהם. בדיקה שבודקת שהעיר שייכת למדינה ושהמיקוד שייך לאותה מדינה תופסת את רוב נתוני הכתובת האמריקאיים שנעשו ביד לפני שהם מגיעים למערך בדיקות משותף. בדיקה בודדת כזו תורמת לאיכות הנתונים יותר מכל מידת זהירות שהושקעה בהקלדה ידנית של רשומות.
כדאי לאמץ לצידה הרגל נוסף. כשרשומה נכשלת בבדיקת יחסים, מתקנים את המחולל ולא את הרשומה, כי שורה שתוקנה ביד היא שורה שתידרס בפעם הבאה שנתוני הבדיקה יתרעננו מחדש. בדיקה שאין דרך לספק אותה בעריכת שדה בודד היא בדיקה שממשיכה לעבוד גם בעוד שנה, וזו התכונה היחידה שמעניינת בסופו של דבר.
כל כתובת שמופקת בדרך הזו היא נתוני בדיקה בדיוניים בעלי מבנה תקין ויחסים פנימיים תקינים, ולא מעבר לכך. היא אינה מקום שניתן למסור אליו דבר, היא אינה שייכת לאדם או לארגון כלשהם, ואסור להשתמש בה כדי להתחזות למישהו, כדי להוכיח מקום מגורים, כדי לקבל דואר אמיתי או כדי לעבור שלב אימות כלשהו.