Governance (Governance)
governance สำหรับ operational characteristic ทั่วไป เช่น responsiveness, scalability, availability และอื่น ๆ นั้นขึ้นอยู่กับแต่ละ use case และแตกต่างกันได้มาก แต่ในมุมมองด้าน structural สถาปนิกจะใช้บทบาทและความรับผิดชอบของ filter แต่ละประเภทเพื่อกำกับดูแล pipeline architecture
filter พื้นฐานทั้งสี่ประเภท (producer, transformer, tester และ consumer) แต่ละแบบทำหน้าที่เฉพาะของตน อย่างไรก็ตาม นักพัฒนามักยัดความรับผิดชอบมากเกินไปให้กับ filter ได้ง่ายเกินไป ซึ่งทำให้ pipeline architecture กลายเป็น monolith ที่ไร้โครงสร้าง
เป็นเรื่องยากที่จะเขียน automated fitness function เพื่อกำกับดูแลว่า producer filter เป็นจุดเริ่มต้นของ pipeline จริงหรือไม่ หรือ tester filter กำลังตรวจสอบเงื่อนไขเพื่อตัดสินว่าจะดำเนินการต่อหรือหยุด flow จริงหรือไม่ เทคนิคการกำกับดูแลช่วยให้สถาปนิกนำทีมพัฒนาให้ยึดถือบทบาทและความรับผิดชอบของ filter แต่ละประเภทได้
เทคนิคหนึ่งคือการใช้ tag (ในภาษา Java tag ถูก implement เป็น annotation และในภาษา C# เป็น custom attribute ) tag ไม่ได้ทำหน้าที่ใด ๆ จริง ๆ แต่ให้ metadata เกี่ยวกับ component หรือ service ในเชิงโปรแกรม การใช้ tag ใน starting class ของ filter component จะบอกนักพัฒนาว่ากำลังสร้างหรือแก้ไข filter ประเภทใด ช่วยป้องกันไม่ให้ filter นั้นได้รับความรับผิดชอบมากเกินไปหรือทำหน้าที่ที่ไม่เกี่ยวข้องกับประเภทของมัน
เพื่อแสดงเทคนิคนี้ ลองพิจารณาโค้ดต้นฉบับต่อไปนี้ที่กำหนด tag สำหรับ filter พื้นฐานทั้งสี่ประเภท นี่คือ Java tag annotation definition:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface Filter {
public FilterType[] value();
public enum FilterType {
PRODUCER,
TESTER,
TRANSFORMER,
CONSUMER
}
}
และนี่คือ C# tag custom attribute definition:
[System.AttributeUsage(System.AttributeTargets.Class)]
class Filter : System.Attribute {
public FilterType[] filterType;
public enum FilterType {
PRODUCER,
TESTER,
TRANSFORMER,
CONSUMER
};
}
เนื่องจาก filter เป็น architectural component โดยพื้นฐาน จึงสามารถ implement ผ่าน class file หลายไฟล์ได้ ตัวอย่างเช่น ใน continuous fitness function ตัวอย่างของเราใน Figure 12-2 Trend Analyzer filter ค่อนข้างซับซ้อนและอาจมี class file หลายไฟล์ ด้วยเหตุนี้ เราจะกำหนด tag เพิ่มอีกหนึ่งตัวเพื่อระบุ class ที่เป็น entry point ของ filter เพื่อให้เราสามารถแนบ tag อื่น ๆ เข้ากับมันได้
นี่คือ Java entry point tag definition:
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
public @interface FilterEntrypoint {}
และ C# entry point tag definition:
[System.AttributeUsage(System.AttributeTargets.Class)]
class FilterEntrypoint : System.Attribute {}
ตอนนี้นักพัฒนาสามารถเพิ่ม tag FilterType ให้กับ Entrypoint class เพื่อระบุประเภทและบทบาทที่สอดคล้องกันใน architecture ได้ ตัวอย่างเช่น annotation ต่อไปนี้ระบุประเภทและบทบาทของ Trend Analyzer transformation filter ในภาษา Java:
@FilterEntrypoint
@Filter(FilterType.TRANSFORMER)
public class TrendAnalyzerFilter {
...
}
และในภาษา C#:
[FilterEntrypoint]
[Filter(FilterType.TRANSFORMER)]
class TrendAnalyzerFilter {
...
}
แม้เทคนิคนี้อาจไม่สามารถหยุดนักพัฒนาทุกคนจากการทำให้ transformer filter ทำ logic แบบ testing (ซึ่งควรเป็นหน้าที่ของ tester filter) ได้ แต่อย่างน้อยมันก็ให้ context เพิ่มเติม .