จะทำอย่างไรเมื่อคุณไม่สามารถกำหนดค่าบูลีนได้


38

เรากำลังสร้างเว็บแอปพลิเคชั่นให้กับ บริษัท ซึ่งมีการจัดการอยู่ในแผ่นงาน Excel เท่านั้น เราเกือบจะเสร็จแล้ว แต่เมื่อเร็ว ๆ นี้ฉันได้รับมอบหมายให้นำเข้าข้อมูลทั้งหมดจากแผ่นงานเหล่านั้นไปยังระบบใหม่ของเรา ระบบสร้างขึ้นใน Java แต่การนำเข้านี้เป็นเพียงครั้งเดียวฉันตัดสินใจเขียนสคริปต์ใน Python แทนและนำเข้าโดยตรงด้วยการสืบค้น SQL ที่นี่ปัญหามา โมเดลข้อมูลใหม่มีแอตทริบิวต์ใหม่บางตัวซึ่งไม่รวมอยู่ในข้อมูลที่มีอยู่ ในกรณีส่วนใหญ่นี่ไม่ใช่ปัญหาฉันแค่ใส่ค่าเป็นศูนย์ซึ่งฉันไม่สามารถหาข้อมูลได้ แต่แล้วฉันก็วิ่งเข้าไปหาคุณสมบัติบางอย่างซึ่งเป็นบูลีนและไม่สามารถเป็นค่าเริ่มต้นได้ ก่อนอื่นฉันพยายามอนุญาต null สำหรับเขตข้อมูลเหล่านั้นในฐานข้อมูลของเรา แต่ผู้พัฒนาระดับสูงของฉันบอกให้ฉันไม่ทำ เพราะจะทำให้เกิดปัญหาในระบบของเราในอนาคต และตอนนี้ฉันไม่แน่ใจว่าจะทำอย่างไร วิธีแก้ปัญหาที่ชัดเจนคือการกำหนดค่าบูลีนที่ไม่รู้จักเป็นเท็จ แต่ฉันคิดว่ามันผิดเช่นกันเพราะฉันไม่รู้จริง ๆ ไม่ว่าจะเป็นของปลอม

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

วิธีที่ดีที่สุดในสถานการณ์นี้คืออะไร? เราควรบอกให้ บริษัท กรอกข้อมูลที่หายไปด้วยตนเองหรือไม่? หรือตั้งค่าเริ่มต้นเป็นเท็จ


70
สำหรับฉันการอนุญาตให้ NULL เป็นโซลูชันที่ถูกต้อง ผู้อาวุโสของคุณเจาะจงมากกว่า "ทำให้เกิดปัญหาในระบบของเราในอนาคต" หรือไม่? ถ้าไม่ถามเขาด้วยเหตุผลที่เฉพาะเจาะจงมากขึ้น
larsbe

48
คุณควรเริ่มต้นมันFileNotFoundเห็นได้ชัด
คุณ

7
เป็นไปได้ไหมที่จะเพิ่มเขตข้อมูลบูลีน "isValidHasRadio" หรือบางสิ่งบางอย่าง
hyde

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

17
อย่างไรก็ตามฉันไม่ใช่แฟนตัวยงของค่าว่าง ฉันควรใช้ enum กับ 'ไม่รู้จัก', 'มีวิทยุ' และ 'ไม่มีวิทยุ' วิธีนี้จะครอบคลุมความต้องการของคุณและมีพื้นที่ให้เติบโตหากคุณต้องระบุประเภทของวิทยุในอนาคตเช่น 'Radio with Integrated TV' หรืออะไรทำนองนั้น
Machado

คำตอบ:


129

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

โดยทั่วไปจะนำไปสู่กรณีใดกรณีหนึ่งต่อไปนี้:

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

  • มีกฎวิธีการกำหนดค่าเริ่มต้นที่เหมาะสมที่สุดจากข้อมูลอื่น ๆ ดังนั้นคุณสามารถใส่กฎนี้เป็นรหัสได้

  • ผู้ใช้หรือลูกค้าของคุณจะขยายข้อมูลอินพุตและระบุค่าที่หายไป (อาจจะด้วยตนเอง) ก่อนที่จะถูกนำเข้าสู่ฐานข้อมูล

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

กรณีสุดท้ายต้องการบางสิ่งบางอย่างเช่น NULL เพื่อแสดงสถานะที่ไม่ได้กำหนดค่าเริ่มต้นหรือไม่รู้จักแม้ว่าจะเป็นค่าบูลีนหากผู้อาวุโสของคุณชอบหรือไม่ก็ตาม หากมีเหตุผลทางเทคนิคที่ไม่ชัดเจนซึ่งห้ามการใช้ค่า NULL สำหรับคอลัมน์ใดคอลัมน์หนึ่งคุณจำเป็นต้องจำลองสถานะ "ไม่ทราบ" ในวิธีที่ต่างกันโดยแนะนำคอลัมน์บูลีนเพิ่มเติม (เช่นhasRadioIsUnknown) หรือโดยใช้ 3 แจงนับ -valued แทนบูล (เช่นHasNoRadio=0, HasRadio=1, Unknown=2) แต่พูดคุยกับรุ่นพี่อีกครั้งหลังจากที่คุณทำการวิเคราะห์ข้อกำหนดอย่างละเอียดเพื่อให้แน่ใจว่าการแก้ปัญหาดังกล่าวมีความจำเป็นจริงๆ


29
คุณควรทราบด้วยว่าคำตอบเดียวกันนี้ใช้กับคอลัมน์อื่น ๆ ที่คุณใช้ NULL ได้สะดวก คุณควรตรวจสอบว่านี่เป็นค่าเริ่มต้นที่ถูกต้อง ตัวอย่างเช่นหากคอลัมน์อื่น ๆ ระบุว่า "กำลังประมวลผลเสร็จแล้ว" และคุณนำเข้าข้อมูลเก่าจากประวัติการสั่งซื้อของลูกค้า (คิดถึง webshop) คุณอาจต้องตั้งค่าเป็น "จริง" แทนที่จะเป็น "NULL" เพื่อหลีกเลี่ยงกระบวนการบางอย่างที่ถูกเรียก เมื่อพวกเขาพบรายการที่ยังไม่ได้ดำเนินการ (ตามการตีความของคอลัมน์นั้น)
Frank Hopkins

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

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

ตัวเลือก 4: บันทึกที่หายไปค่าคอลัมน์ใดคอลัมน์หนึ่งนั้นไม่มีประโยชน์จริง ๆ และควรแยกออกจากการนำเข้า ตัวเลือกที่ 5: มีคนต้องการแก้ไขข้อมูลขาเข้าทั้งหมดก่อนที่จะได้รับการนำเข้า ตัวเลือกมากมายขึ้นอยู่กับความต้องการและงบประมาณ การนำเข้าข้อมูลเก่ามักเป็นเรื่องใหญ่
jpmc26

@ jpmc26: ดีฉันไม่ได้รวมตัวเลือก 4 ตั้งแต่ฉันต้องการที่จะติดสิ่งที่ตัวอักษรเขียน (กรณีที่ข้อมูลที่ขาดหายไปไม่รวมอยู่ในข้อมูลนำเข้าแน่นอนไม่มีบันทึก) ตัวเลือกที่ 5 เป็นสิ่งที่ควรค่าแก่การกล่าวขวัญเนื่องจากเป็นอีกวิธีหนึ่งในการหลีกเลี่ยงความจำเป็นสำหรับค่า NULL แก้ไขคำตอบของฉันตาม
Doc Brown

39

นี่ไม่ใช่คำถามทางเทคนิค มันเป็นคำถามเกี่ยวกับกฎเกณฑ์ทางธุรกิจ ดังนั้นคุณต้องถาม "ธุรกิจ"

เข้าหาเจ้าของผลิตภัณฑ์และ / หรือผู้มีส่วนได้ส่วนเสียแล้วพูดดังนี้:

เรามีข้อมูลที่ไม่สมบูรณ์สำหรับหนึ่งในฟิลด์ที่คุณร้องขอในแอปพลิเคชัน คุณต้องการให้เราใช้ค่าเริ่มต้นหรือไม่ คุณต้องการให้เราเพิ่ม "ไม่รู้จัก" เป็นค่าที่ถูกต้องหรือไม่ หรือคุณต้องการให้ใครบางคนในทีมของคุณแก้ไขข้อมูลก่อนนำเข้าหรือไม่

การสนทนาบางอย่างอาจจะตามมา แต่ที่พื้นมัน โซลูชันทางเทคนิคจะไหลอย่างเป็นธรรมชาติจากกฎเกณฑ์ทางธุรกิจที่มีเนื้อมากขึ้น


9

ปัญหาทั่วไปเป็นพื้นที่ย่อยทั้งหมดของการเขียนโปรแกรมที่เรียกว่าล้างข้อมูลซึ่งเป็นส่วนหนึ่งของพื้นที่ย่อยที่เรียกว่าขนาดใหญ่รวมข้อมูล การหลีกเลี่ยงปัญหาประเภทเหล่านี้น่าจะเป็นสาเหตุส่วนใหญ่ของการโยกย้ายจากแผ่นงาน Excel และสาเหตุที่นักพัฒนาอาวุโสไม่ต้องการให้เขตข้อมูลกลายเป็นโมฆะ ฉันไม่คิดว่ามันไม่มีเหตุผลที่จะบอกว่านี่เป็นหนึ่งในแหล่งความซับซ้อนที่ใหญ่กว่าในการย้ายข้อมูล

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

ความแตกต่างบางอย่างมีแนวโน้มเนื่องจากรูปแบบข้อมูลไม่ตรงกัน การจัดการกับสิ่งนี้ส่วนใหญ่เป็นเรื่องของการคุ้นเคย (อย่างใกล้ชิด) กับทั้งตัวแบบข้อมูลและการรู้วิธีแมปตัวเก่ากับตัวใหม่ ตราบใดที่หนึ่งใหม่คือความสามารถในการจับภาพคนเก่า (ถ้าไม่ใช่ทีมของคุณอาจมีปัญหาใหญ่มาก) สิ่งนี้อาจต้องการการทำงานมากกว่าการคัดลอกคอลัมน์ Darkwing ให้ตัวอย่างที่ยอดเยี่ยมเกี่ยวกับเรื่องนี้ (เช่นเดียวกับสาเหตุที่การใส่ NULL แบบสุ่มสี่สุ่มห้าเป็นสิ่งผิดปกติที่ต้องทำ) Elaborating เมื่อมันถ้ารุ่นเก่ามีReceivedDateและInProgressบิตและรุ่นใหม่มีStartDateและคุณจะต้องตัดสินใจว่าและวิธีการตั้งค่าProcessingEndTime ProcessingEndTimeขึ้นอยู่กับวิธีการใช้งานตัวเลือกที่สมเหตุสมผล (แต่โดยพลการ) อาจตั้งค่าให้เหมือนกับตัวเลือกStartDate (หรือหลังจากนั้นไม่นานหากจะทำให้เกิดปัญหา)

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

ตัวอย่างเช่นลองนึกภาพใบแจ้งหนี้ที่มีปริมาณและผลรวมต่อรายการ (แต่ไม่ใช่ราคาต่อหน่วย) ยกเว้นว่าปริมาณบางอย่างขาดหายไปอย่างลึกลับ การพูดคุยกับบุคคลที่ประมวลผลใบแจ้งหนี้ดังกล่าวอาจทำให้เกิดสถานการณ์หนึ่ง (หรือมากกว่า) ในสถานการณ์ต่อไปนี้: 1) "โอ้ปริมาณที่ว่างเปล่าหมายถึงปริมาณ 1", 2) "โอ้ฉันรู้ว่าสิ่งของเหล่านั้นมีราคาประมาณ 1,000 ดอลลาร์ เห็นได้ชัดว่านี่เป็นคำสั่งซื้อ 2 ", 3)" เมื่อสิ่งนั้นเกิดขึ้นฉันค้นหาราคาในระบบอื่นนี้และหารและปัดเศษ ", 4)" ฉันค้นหาในระบบอื่น ", 5)" นั่นไม่ใช่ข้อมูลจริง ", 6)" ไม่เคยเห็นมาก่อน "

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


14
โดยสรุป: หากคุณคิดว่าการจัดการกับรหัสดั้งเดิมนั้นไม่เป็นที่น่าพึงพอใจลองจัดการกับข้อมูลดั้งเดิม
ปีเตอร์เทย์เลอร์

0

เปลี่ยนชุดข้อมูล

คุณสามารถทำให้มาตรฐานเป็นปกติและจากนั้นคุณจะไม่มีค่าใด ๆ อีกต่อไป

หากคุณไม่สามารถกำหนดค่าบูลีนได้อย่าใช้บูลีน

โดยการอนุญาตให้ค่าบูลีนกลายเป็นโมฆะมันหยุดเป็นบูลีน บูลีนสามารถมี 2 สถานะ: เท็จ, จริง

สิ่งที่คุณต้องการคือ 3 สถานะ: False, True, Unknown

คุณมีตัวเลือกในการเปลี่ยนชุดข้อมูลหรือไม่?

(และอีกสิ่งหนึ่งที่ฉันคิดถ้าในไพ ธ อนหรือจาวาคุณดึงข้อมูลจากฐานข้อมูลของคุณคุณดึงข้อมูลบันทึกตรวจสอบช่อง hasradio จะเกิดอะไรขึ้นถ้าคุณตรวจสอบว่ามันจริงหรือเท็จและมันจะเป็นโมฆะ?)


2
โดยการเปลี่ยนรูปแบบข้อมูลและ "normalizing ออก hasRadio" ผมถือว่าคุณบางสิ่งบางอย่างเช่นการเพิ่มค่าเฉลี่ยตารางใหม่CarFeaturesที่มีเขตCar_ID, Feature_ID, Has_Feature? ดูเหมือนความคิดที่ดี
jpa

2
@jpa มันเป็นสถานการณ์ที่ค่อนข้างยุ่งยาก คุณต้องชัดเจนมากในสิ่งที่คุณทำเพราะการขาดบันทึกในสถานการณ์ของเรานั้นไม่เป็นที่รู้จัก ในขณะที่บ่อยครั้งที่ไม่มีบันทึกหมายความว่ามันไม่มีคุณสมบัติ
Pieter B

1
คุณกำลังดูว่ามันผิดปีเตอร์ ไม่มีใครพูดว่า a boolมีค่ามากกว่าสองค่าเพราะอย่างที่คุณพูดมันไม่ได้เป็นเช่นนั้น boolเป็นอย่างใดอย่างหนึ่งหรือtrue falseอย่างไรก็ตามในกรณีตรวจการณ์, OP ไม่ได้จัดการกับboolโดยตรง แต่ค่อนข้างOption<bool>/Maybe<bool>ซึ่งจะมีหรือSome -> true/false None
แอนดี้

@DavidPacker อาร์กิวเมนต์ของฉันคือเพราะอาจเป็น <บูล> คุณควรหยุดเรียกมันว่าอะไรที่คล้ายกันจากระยะไกลมิฉะนั้นคุณจะสับสน และถ้าคุณยืนยันในการใช้บูลีนให้หาวิธีที่ปลอดภัยที่จะทำ
Pieter B

4
ในความคิดของฉันบูลีน nullable นั้นเป็นเรื่องปกติ ฉันไม่เคยมีปัญหากับค่า null แม้ว่าฉันจะได้พบกับนักพัฒนาที่ทำ
แอนดี้

-1

ตามที่คนอื่น ๆ ได้ชี้ให้เห็นสิ่งที่คุณมีอยู่ที่นี่คือค่าบูลีนที่ไม่ได้บูลีนอย่างแท้จริงและปัญหาคือการบังคับให้บูลีนหรือจัดการมันเป็นอย่างอื่น

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

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

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.