เมนู

ขยายข้อมูลทดสอบข้ามหลายประเทศ: รายการค่าคงที่กับรายการข้อยกเว้น

เมื่อจำนวนประเทศเพิ่มขึ้น วิธีดูแลข้อมูลต้องเปลี่ยนจากรายการพิเศษมาเป็นค่าคงที่บวกข้อยกเว้น บทความนี้อธิบายวิธีทำให้การสร้างข้อมูลทำซ้ำได้

เผยแพร่เมื่อ

  • การขยาย
  • ข้อยกเว้น

การขยายข้อมูลทดสอบข้ามหลายประเทศเป็นจุดที่วิธีทำงานแบบเดิมหยุดได้ผล วิธีที่ใช้ได้กับประเทศไม่กี่แห่งคือการดูแลเป็นรายกรณี แต่เมื่อจำนวนเพิ่มขึ้น วิธีนั้นจะกลายเป็นภาระที่ตามไม่ทันและเป็นที่มาของความไม่สม่ำเสมอ

เมื่อใดที่ควรหยุดเพิ่มประเทศทีละแห่ง?

สัญญาณแรกคือการเพิ่มประเทศใหม่หนึ่งแห่งต้องแก้โค้ดหลายจุด ซึ่งแสดงว่าโครงสร้างยังไม่มีที่สำหรับความต่างของประเทศ

สัญญาณที่สองคือมีเงื่อนไขพิเศษที่อ้างถึงประเทศใดประเทศหนึ่งโดยตรงในโค้ด ซึ่งแสดงว่าความรู้เกี่ยวกับประเทศนั้นถูกฝังไว้ในที่ที่ไม่ควรอยู่

สัญญาณที่สามคือไม่มีใครตอบได้ว่าประเทศหนึ่งมีข้อมูลอะไรบ้างโดยไม่ต้องเปิดโค้ด ซึ่งแสดงว่าข้อมูลยังไม่ถูกทำให้เป็นข้อมูลจริง

สัญญาณที่สี่คือผลการทดสอบต่างกันในเครื่องของนักพัฒนาที่ต่างคน ซึ่งแสดงว่ายังมีปัจจัยที่ไม่ถูกกำหนดไว้ในข้อมูล

เมื่อพบสัญญาณใดสัญญาณหนึ่ง การเพิ่มประเทศต่อไปจะทำให้ภาระโตขึ้นแบบทบต้น จึงควรหยุดและจัดโครงสร้างก่อน

ค่าคงที่กับข้อยกเว้นต่างกันอย่างไร?

ค่าคงที่คือสิ่งที่ทุกประเทศมีร่วมกัน และระบบสามารถพึ่งพาได้โดยไม่ต้องตรวจสอบ จึงเป็นส่วนที่ทำให้ตรรกะหลักเรียบง่าย

ข้อยกเว้นคือสิ่งที่ประเทศส่วนน้อยทำต่างจากคนส่วนใหญ่ และต้องถูกเก็บเป็นข้อมูลที่ระบุได้ ไม่ใช่เป็นเงื่อนไขที่ซ่อนอยู่ในโค้ด

ความต่างที่สำคัญคือค่าคงที่เปลี่ยนได้ยากเพราะกระทบทุกประเทศ ส่วนข้อยกเว้นเปลี่ยนได้ง่ายเพราะกระทบเฉพาะกลุ่มเล็ก การเก็บสองอย่างนี้ปนกันจะทำให้การเปลี่ยนข้อยกเว้นต้องระวังผลกระทบทั้งระบบ

ทางปฏิบัติที่แนะนำคือให้ค่าคงที่อยู่ในโครงสร้างข้อมูล ส่วนข้อยกเว้นอยู่ในรายการที่อ้างอิงได้ และให้ทั้งสองมีที่มาที่ตรวจสอบได้

ประเภท กระทบใคร ควรอยู่ที่ใด
ค่าคงที่ ทุกประเทศ โครงสร้างข้อมูล
ข้อยกเว้น ประเทศส่วนน้อย รายการที่อ้างอิงได้
ข้อมูลเฉพาะราย ประเทศเดียว ข้อมูลของประเทศนั้น
เงื่อนไขเฉพาะกิจ กรณีเดียว ไม่ควรอยู่ในโค้ดถาวร

ข้อยกเว้นควรถูกเก็บไว้ที่ใด?

ข้อยกเว้นที่เก็บในโค้ดจะมองเห็นได้ยากและจะไม่ถูกทดสอบเมื่อไม่มีใครแตะโค้ดส่วนนั้น การย้ายข้อยกเว้นออกมาเป็นข้อมูลทำให้ทุกอย่างอยู่ที่เดียวและตรวจสอบได้

เมื่อข้อยกเว้นเป็นข้อมูล จำเป็นต้องมีเครื่องมือที่ช่วยตอบว่าเมื่อเพิ่มประเทศใหม่ จะมีข้อยกเว้นใดที่เกี่ยวข้องบ้าง เพราะนี่คือคำถามที่ทำให้การเพิ่มประเทศใช้เวลานาน

ข้อยกเว้นควรมีเหตุผลและวันที่กำกับ เพื่อให้ทราบว่ายังใช้ได้อยู่หรือไม่ และเพื่อให้คนที่มาแก้ในภายหลังรู้ว่ามันมีไว้ทำอะไร

ข้อควรระวังคืออย่าให้จำนวนข้อยกเว้นเติบโตจนกลายเป็นค่าคงที่ชุดที่สอง ถ้าข้อยกเว้นกลายเป็นส่วนใหญ่ นั่นหมายความว่าค่าคงที่ถูกนิยามผิดตั้งแต่ต้น

การสร้างข้อมูลให้ทำซ้ำได้หมายความว่าอย่างไร?

หมายความว่าการสร้างข้อมูลด้วยข้อมูลตั้งต้นชุดเดียวกันต้องให้ผลลัพธ์ชุดเดียวกันเสมอ ไม่ว่าจะรันเมื่อใดหรือบนเครื่องใด

เงื่อนไขที่ต้องมีคือลวดลายการสุ่มต้องถูกกำหนดไว้ล่วงหน้า และต้องถูกบันทึกไว้พร้อมผลลัพธ์ เพื่อให้สร้างชุดเดิมซ้ำได้เมื่อต้องตรวจสอบปัญหาย้อนหลัง

อีกเงื่อนไขคือลำดับของรายการต้องถูกกำหนดไว้ ไม่ปล่อยให้ขึ้นกับลำดับการอ่านไฟล์หรือลำดับการประมวลผล เพราะลำดับที่ไม่คงที่จะทำให้ผลลัพธ์ต่างกันแม้ข้อมูลตั้งต้นจะเหมือนกัน

เงื่อนไขที่สามคือวันที่และเวลาที่ใช้สร้างต้องถูกส่งเข้ามาเป็นค่า ไม่ใช่ถูกอ่านจากนาฬิกาของเครื่อง เพราะนาฬิกาที่ต่างกันจะทำให้ผลลัพธ์ต่างกัน

ผลพลอยได้จากการทำซ้ำได้คือการแก้ปัญหาง่ายขึ้น เมื่อปัญหาที่พบในเครื่องหนึ่งสามารถสร้างซ้ำในอีกเครื่องหนึ่งได้ การหาสาเหตุจะรวดเร็วขึ้นมาก

การเลือกประเทศสำหรับชุดขนาดใหญ่ควรทำอย่างไร?

เมื่อต้องสร้างข้อมูลจำนวนมาก การกระจายอย่างสม่ำเสมอไปยังทุกประเทศมักไม่สะท้อนการใช้งานจริง และทำให้ชุดข้อมูลบวมโดยไม่ได้ประโยชน์เพิ่ม

วิธีที่ใช้ได้ดีคือแบ่งกลุ่มตามความสำคัญ แล้วกำหนดสัดส่วนของจำนวนรายการให้แต่ละกลุ่ม กลุ่มที่มีผู้ใช้จริงมากได้สัดส่วนมาก ส่วนกลุ่มกรณีขอบได้สัดส่วนน้อยแต่ต้องมีทุกครั้ง

อีกวิธีที่ใช้ได้คือกำหนดชั้นตามลักษณะของข้อมูล เช่นความยาวของข้อความหรือความซับซ้อนของที่อยู่ แล้วเลือกให้ครบทุกชั้น ซึ่งทำให้เห็นปัญหาที่เกี่ยวกับความยาวได้แม้มีข้อมูลจำนวนไม่มาก

สิ่งที่สำคัญคือต้องมีประเทศกรณีขอบอยู่ในทุกชุดที่สร้าง ไม่ใช่ให้ขึ้นอยู่กับความบังเอิญของการสุ่ม เพราะชุดที่ไม่มีกรณีขอบจะให้ความมั่นใจที่เกินจริง

ประเด็นว่าประเทศและภาษาเป็นสองมิติที่ต้องสุ่มแยกกันมีอธิบายไว้ในบทความประเทศกับภาษาไม่เหมือนกัน

จะรู้ได้อย่างไรว่าชุดที่สร้างขึ้นเชื่อถือได้?

สัญญาณแรกคือการตรวจว่าไม่มีรายการใดหายไป เมื่อเทียบจำนวนกับที่คาดไว้จากพารามิเตอร์ที่ส่งเข้าไป

สัญญาณที่สองคือการตรวจว่าทุกกลุ่มที่กำหนดมีรายการอย่างน้อยตามสัดส่วนที่ตั้งไว้ ซึ่งจับกรณีที่กลุ่มถูกตั้งชื่อไว้แต่ไม่มีสมาชิกจริง

สัญญาณที่สามคือการตรวจว่าข้อมูลที่สร้างผ่านการตรวจความสอดคล้องภายในเอง เช่นค่าที่ต้องสัมพันธ์กันยังสัมพันธ์กันอยู่

สัญญาณที่สี่คือการรันซ้ำและเทียบผล ซึ่งเป็นวิธีที่ตรงที่สุดในการพิสูจน์ว่าการสร้างทำซ้ำได้จริง

การตรวจเหล่านี้ควรทำงานอัตโนมัติทุกครั้งที่สร้างข้อมูล เพราะการตรวจด้วยตาไม่ได้ผลเมื่อจำนวนรายการมาก

สำหรับนักพัฒนา: แยกพารามิเตอร์ออกจากตัวสร้างข้อมูล

ข้อแรกคือให้ตัวสร้างข้อมูลรับพารามิเตอร์ที่บอกขอบเขตและสัดส่วนอย่างชัดเจน ไม่มีค่าเริ่มต้นที่ซ่อนอยู่ เพราะค่าเริ่มต้นที่ซ่อนอยู่ทำให้ชุดที่สร้างขึ้นจากที่ต่างกันไม่เหมือนกันโดยไม่มีใครรู้

ข้อที่สองคือให้ผลลัพธ์ของการสร้างบันทึกพารามิเตอร์ที่ใช้ไว้ข้าง ๆ ข้อมูล เพื่อให้สร้างชุดเดิมซ้ำได้

ข้อที่สามคือให้การเพิ่มประเทศใหม่เป็นเพียงการเพิ่มข้อมูล ไม่ใช่การแก้โค้ด ถ้ายังต้องแก้โค้ด แปลว่ายังมีที่ที่ความต่างของประเทศยังไม่ถูกทำให้เป็นข้อมูล

ข้อที่สี่คือเขียนการทดสอบที่ตรวจว่าค่าคงที่ยังคงเป็นค่าคงที่ เมื่อมีประเทศใหม่เข้ามา การทดสอบนี้จะจับกรณีที่มีคนเผลอเพิ่มเงื่อนไขเฉพาะเข้าไปในตรรกะหลัก

ลำดับงานที่ควรทำถัดไป

เริ่มจากการเปิดรายการข้อยกเว้นทั้งหมดที่ทีมใช้อยู่ แล้วถามว่ารายการใดอยู่ในโค้ดและรายการใดอยู่ในข้อมูล รายการที่อยู่ในโค้ดคือรายการแรกที่ควรย้ายออก

ถ้าต้องการดูรายการประเทศและภูมิภาคที่จะใช้เป็นขอบเขตของชุดข้อมูล หน้าประเทศและภูมิภาคบนเว็บไซต์นี้รวมรายการไว้พร้อมข้อมูลของแต่ละแห่ง และวิธีวัดว่าข้อมูลรองรับประเทศใดแล้วบ้างอยู่ในบทความรายการตรวจสอบความครอบคลุมข้อมูลรายประเทศ ส่วนคำถามว่าเหตุใดข้อมูลชุดเดิมจึงควรถูกเก็บไว้แทนการเขียนทับ ซึ่งเป็นสิ่งที่ต้องตัดสินใจก่อนสร้างชุดข้อมูลขนาดใหญ่ อธิบายไว้ในบทความความสดใหม่ของข้อมูลประเทศ

ค่าคงที่และรายการข้อยกเว้นที่ยกมาในบทความนี้เป็นโครงสร้างตัวอย่างที่ผู้เขียนกำหนดขึ้นเพื่ออธิบายแนวทาง ไม่ได้ถอดมาจากระบบข้อมูลชุดใดที่มีอยู่จริง

อ่านต่อ

บทความเกี่ยวกับ รูปแบบที่อยู่และข้อมูลตัวตนตามประเทศ

บทความเกี่ยวกับ รูปแบบที่อยู่และข้อมูลตัวตนตามประเทศ

รายการนี้แสดงเฉพาะบทความในหัวข้อของหน้านี้