246. Fluent syntax

סדרת הטיפים הקרובה עוסקת במה שנקרא Fluent syntax.

לפעמים אנחנו צריכים “לקנפג” איזשהו אובייקט. לפעמים קינפוג זה הוא לא כל כך פשוט, למשל יצירת DataSet עם שתי טבלאות וRelation בין שני DataTableים נראה בערך כך:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
DataSet dataSet = new DataSet();
DataTable employers = dataSet.Tables.Add("EMPLOYER");
employers.Columns.Add("NAME", typeof (string));
employers.Columns.Add("DEPARTMENT_FK", typeof(int));
DataTable departments = dataSet.Tables.Add("DEPARTMENT");
departments.Columns.Add("PK", typeof (int));
departments.Columns.Add("NAME", typeof(string));
departments.PrimaryKey = new DataColumn[] {departments.Columns["PK"]};
DataRelation employerToDepartment =
new DataRelation("EMPLOYER_TO_DEPARTMENT",
departments.Columns["PK"],
employers.Columns["DEPARTMENT_FK"]);
employers.ParentRelations.Add(employerToDepartment);

תכנות כזה נעשה קשה לקריאה ולהבנה של הנעשה. בעצם מה שקורה כאן זה שיש לנו הרבה שורות שאחראיות איכשהו על תהליך אחד, של בניית אובייקט.

Fluent Syntax (או Fluent Interface) הוא Syntax הבא להפוך את הקוד לקריא וכיפי יותר.

איך זה נעשה? הרעיון הוא שרשור קריאה למתודות אחת אחרי השנייה, בצורה שהיא Self-reference.

למשל הקוד הרשום למשל יכול להכתב בערך בצורה הבאה:

1
2
3
4
5
6
7
8
9
10
11
12
dataSet.
AddTable("DEPARTMENT").
WithColumn<int>("PK").
MakePrimaryKey().
WithColumn<string>("NAME").
AddTable("EMPLOYER").
WithColumn<string>("NAME").
WithColumn<int>("DEPARTMENT_FK").
RelatedTo("DEPARTMENT").
WithParentKey("PK").
WithChildKey("DEPARTMENT_FK").
Named("EMPLOYER_TO_DEPARTMENT");

במבט ראשון זה נראה בערך כמו אותה כמות קוד, אבל מצד שני זה יותר קריא, כי הקוד מאוד מסביר את עצמו. למעשה, מה שכתוב כאן זו אנגלית פשוטה…


איפה נתקלנו בעבר בFluent Syntax? בLINQ!

(ראו טיפים מספר 91-95)

תזכורת: אפשר לכתוב שאילתות ע"י שרשור Extension Methods:

1
2
3
IEnumerable<string> childrenNames =
family.Where(person => person.Age <= 12)
.Select(person => person.FirstName);

הדבר הזה יכול להתאים להרבה מאוד מקומות בהם צריך לקנפג אובייקט ע"י מספר שלבים, במקום ע"י קריאה בודדת למתודה / Constructor.

בהמשך נראה איך אנחנו יכולים לבנות Fluent Syntax משלנו 😃

המשך יום צף טוב!

שתף