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


13

ข้อจำกัดความรับผิดชอบ: ฉันรู้ว่าประเภทข้อมูลนั้นเป็นอัตนัยเล็กน้อยที่ภาษาสคริปต์ / การเขียนโปรแกรมที่คุณใช้ฉันชอบที่จะเขียนใน Python เป็นเรื่องของการตั้งค่า; แม้ว่าฉันยินดีที่จะได้ยินเกี่ยวกับ lanugage / การใช้งาน

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

ตัวอย่าง: นัมเบอร์-1, ,01

  • Pro: รัดกุมมาก
  • Pro: อาจมีประสิทธิภาพ, สามารถเก็บเป็นจำนวนเต็ม 2 บิตที่เซ็นชื่อได้
  • Pro: สามารถใช้เป็นเครื่องชั่งได้เช่นตัวคูณจุดลอยตัว

ตัวอย่างที่ 2: 0, null, 1(หรือการเปลี่ยนแปลงใด ๆ )

  • Pro: กรณีการใช้ที่ไม่เป็นกลางสามารถเป็นแบบไบนารี
  • คอนดิชั่น: ต้องใช้ประเภทข้อมูลแบบไดนามิก
  • คอนดิชั่น: อาจไม่รัดกุม

ตัวอย่างที่ 3: +, (สตริงว่าง)-

  • Pro: รัดกุมมาก
  • คอนดิชั่น: อาจใช้ตรรกะสตริงเพื่อกำหนดสถานะ
  • Pro: การแสดงกราฟิกที่ใช้งานง่าย

อาจมีตรรกะเลขฐานสองที่ฉลาดที่สามารถทำสิ่งที่ฉลาดที่ฉันไม่สามารถจินตนาการได้บางทีอาจจะต้องอาศัยการพิจารณากรณีการใช้มากเกินไป

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


12
Enum : python , java , C # , C , C ++ , ไป ...

Ibidem แต่ฉันจะเพิ่มว่าในหลาย ๆ ภาษาประเภทที่แจกแจงให้ความปลอดภัยมากกว่าการพยายามใส่รองเท้าให้เป็นประเภทอื่น
Blrfl

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

2
ใน. NET คุณสามารถใช้บูลีนที่ไม่มีค่าได้ ฐานข้อมูลส่วนใหญ่จะอนุญาตให้คุณจัดเก็บบูลีน (หรือบิตตามที่มักถูกเรียก) ด้วยสถานะ nullable คุณยังสามารถใช้ถ่านสำหรับการจัดเก็บ ถ่านจะอนุญาตให้มีพื้นที่มากขึ้นในภายหลังโดยไม่ต้องเปลี่ยนกลไกการจัดเก็บ
Adam Zuckerman

1
ตัวชี้ไปยังบูลอาจใช้งานได้ Bool ถูกบังคับให้เป็น 0 และ 1 และถ้าตัวชี้เป็น NULL คุณมีสถานะที่สาม ขึ้นอยู่กับคำแนะนำที่แน่นอน
Devolus

คำตอบ:


7

นอกเหนือจาก enum ซึ่งเป็นวิธีที่ชัดเจนและชัดเจนที่สุดในการแสดงนี้ระบบที่ใช้สำหรับระบบที่ใช้งานร่วมกันได้ซึ่ง enum เฉพาะภาษาไม่สามารถแสดงได้คือตัวเลือก -1/0/1

คุณอาจต้องการลอง bitmask โดยที่ 0 หมายถึง 0, 1 หมายถึง 'bit 2 set' และ 2 หมายถึง 'bit 3 set' (เช่นคุณมี 3 บิตที่สามารถเปิดหรือปิดได้ตราบใดที่คุณไม่ได้กำหนด 3 หรือบิต 1 และ 2 ตั้งค่าแล้วคุณจะดีตัวเลือกนี้จะดีที่สุดถ้าคุณคิดว่าคุณอาจต้องการ 4 หรือมากกว่าธงในอนาคตเป็น 4, 8, 16 ฯลฯ ตั้งค่าบิตที่ตามมา)

สิ่งเหล่านี้รวมอยู่ในประเภทข้อมูล 8 บิตเดียวดังนั้นมันจะไม่สิ้นเปลืองหน่วยความจำหรือต้องการการแปลง (ตามระบบที่ใช้ตัวอักษรบางครั้งใช้ตัวอักษร 16 บิตบางครั้งใช้ 8 บิตขึ้นอยู่กับแพลตฟอร์มของคุณ)

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


คำตอบที่ดีที่สุดที่นี่ IMO NULL อาจเป็นได้ว่ามันไม่ได้ถูกเพิ่มเข้าไปใน DB ไม่ใช่ว่าสถานะของมันคือ 'NULL' ที่มี -1,0,1 และอาจเป็น NULL - NULL - null ระบุว่าเขตข้อมูลนั้นไม่เคยมีประชากรอยู่!
Ken

3

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

อย่างไรก็ตามฉันต้องการดึงความสนใจของคุณไปยังหลักการพื้นฐานและความรู้พื้นฐานเหล่านี้เพื่อให้คุณสามารถตัดสินใจด้วยตนเองได้


เมื่ออ่านโน้ตเบา ๆ โปรดอ่านเรื่องตลกนี้ด้วย: "นักธุรกิจถามนักบัญชี; สองบวกสองคืออะไร"

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


คำถาม: ตารางความจริงของตรรกะสามค่าคืออะไร

ตอบ:

... ลุกขึ้นจากเก้าอี้ของเขาไปที่ประตูปิดมันกลับมาแล้วก็นั่งลง พาดผ่านโต๊ะทำงาน

... และดึงแผนภูมิที่วาดด้วยมือออกมาบนแผ่นกระดาษ

การดำเนินงาน: ตรรกะและ - เป็นความลับ - ร่างสำหรับไตรมาสที่ 3 ปี 2014

   FalseTrue Third
FalseFalseFalse?????
True FalseTrue ?????
Third???????????????

... เขาพูดด้วยเสียงต่ำ " เท่าใดสิ่งที่คุณต้องการให้ค่าความมหัศจรรย์เหล่านั้นเป็นอย่างไร"

นักออกแบบกราฟิกถามโปรแกรมเมอร์ว่า "คุณสามารถยกตัวอย่างตรรกะสามค่าได้หรือไม่"

โปรแกรมเมอร์ตอบว่า "คุณสามารถให้สองสีให้ฉันได้ซึ่งเป็นขาวดำอย่างที่ควรจะเป็น"

นักออกแบบกราฟิก: "งั้น ... ขาวดำ?"

โปรแกรมเมอร์: "แน่นอนตอนนี้ฉันจะให้สีที่สาม - แต่ฉันจะต้องระบุว่าเป็นหมายเลข ARGB ฉันหวังว่าคุณจะไม่สนใจ"

นักออกแบบกราฟิก: "ฉันทำงานกับ ARGB ได้ดีทุกวัน ... "

Black#FF000000
White#FFFFFFFF
Nothing#00000000

สังเกต. ในด้านบนสีดำและสีขาวเป็นสีทึบแสงเต็มที่ สีที่สามไม่มีอะไรโปร่งใสอย่างสมบูรณ์ เมื่อผสมกันในอัตราส่วนต่าง ๆ สีดำและสีขาวผสมกันกลายเป็นสีเทาต่าง ๆ แต่การผสมในไม่มีอะไรจะไม่เปลี่ยนแปลงอะไรเลย


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

1

หากสามสถานะที่เป็นไปได้มีความหมายบางอย่างให้ใช้สิ่งที่เหมาะสมกับความหมายโดยธรรมชาตินั้น ตัวอย่างเช่นสถานะที่เป็นไปได้คือ 1, 2 หรือ 3 หรือถ้าเป็น 100, 200 และ 300 ให้ใช้จำนวนเต็ม หากสถานะที่เป็นไปได้คือใช่ไม่ใช่หรือไม่รู้จักคุณอาจใช้บูลีนหรือตัวชี้ไปยังวัตถุบูลีนโดยมีความเป็นไปได้ที่จะไม่มีค่าเป็นค่า "ใช่" หรือค่า "ไม่" ถึงแม้ว่าบางคนอาจจะไม่ชอบก็ตาม

หากมีวิธีชัดเจนว่าจำนวนเต็มสามารถตีความเป็นสถานะที่เป็นไปได้คุณอาจใช้จำนวนเต็ม พูดถึงฟังก์ชั่นการเปรียบเทียบที่ระบุว่า "น้อยกว่า", "เท่ากับ", "มากกว่า" อาจใช้ -1, 0 และ +1 แม้ว่าบางคนอาจไม่พบสิ่งที่ชัดเจนที่คุณเห็นชัดเจน

หากมีวิธีที่ชัดเจนว่าตัวอักษรสามารถตีความได้ว่าเป็นรัฐที่เป็นไปได้คุณอาจใช้ตัวอักษร ตัวอย่างเช่นหากรัฐของคุณเป็น "สีแดง", "สีเขียว" หรือ "สีฟ้า" คุณอาจใช้ตัวอักษร 'r', 'g' และ 'b' อีกครั้งสิ่งที่ชัดเจนสำหรับคุณ ...

ประเภทที่แจกแจงเป็นไปได้เสมอ สตริงเป็นไปได้เสมอ แต่คุณจะเสียการตรวจสอบประเภทในภาษาส่วนใหญ่

บางคนใช้ค่าบูลีนสามค่าเพื่อแสดง "อยู่ในสถานะ 1", "อยู่ในสถานะ 2", "อยู่ในสถานะ 3"

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


0

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

สิ่งนี้ขึ้นอยู่กับภาษาอย่างมากสิ่งที่คุณกำลังทำระดับนามธรรม (ซึ่งขึ้นอยู่กับภาษาและอื่น ๆ )

ฉันใช้ C ++ เป็นหลักและมีตัวเลือกมากมายที่นี่ enum tribool_state { false_val, true_val, undetermined_val }ที่ง่ายที่สุดคือการ นี่จะเพียงพอหากสถานการณ์การใช้งานของคุณเป็นฟังก์ชันเดียวที่ส่งคืนค่าประเภทนี้

ฉันอาจจะใช้boost::optional<bool>ถ้าฉันต้องการแสดงผลบูลีนที่อาจเป็นไปไม่ได้ (เช่นตรวจสอบว่าข้อมูลเครือข่ายที่ได้รับเสร็จสมบูรณ์จากนั้นประมวลผลค่าบูลีนหากเป็นกรณีนี้)

ผมจะใช้boost::triboolถ้าผมต้องการที่จะแสดงผลแบบบูลฟัซซี่ที่ได้รับการสนับสนุนอย่างเต็มรูปแบบ Tri-State ตรรกะบูลีน (เช่นtrue || indetermined -> true, false && indetermined -> false, true && indetermined -> indeterminedและอื่น ๆ )

ในทำนองเดียวกันในไพ ธ อนฉันจะใช้ชุดค่าคงที่หรือคลาส (อีกครั้งขึ้นอยู่กับความหมาย / ประเภทการดำเนินงานที่ฉันต้องการในรหัสลูกค้า):

ตัวอย่างเช่นฉันจะใช้:

POSITIVE, INDETERMINED, NEGATIVE = 1, 0, -1

ถ้าฉันมีกรณีที่ฟังก์ชั่นง่าย ๆ คืนค่าผลลัพธ์หนึ่งในสาม

ถ้าฉันมีไลบรารี่แบบเต็มซึ่งต้องการตรรกะบูลีนแบบไตรภาคฉันจะใช้ค่าประเภทเป็นคลาส


0

หากคุณใช้ Java คุณสามารถใช้วัตถุบูลีน: เนื่องจากเป็นวัตถุและมีบูลีนจึงสามารถเก็บค่าเป็น true, false และ null ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุดหรือไม่


-6

ใน Microsoft.NET มีประเภท "Tuple" ซึ่งสามารถใช้สำหรับความต้องการของคุณ เยี่ยมชมhttp://msdn.microsoft.com/en-us/library/system.tuple%28v=vs.110%29.aspx


สำหรับหน้านั้น: tuple เป็นโครงสร้างข้อมูลที่มีจำนวนเฉพาะและลำดับขององค์ประกอบ ตัวอย่างของ tuple คือโครงสร้างข้อมูลที่มีสามองค์ประกอบ (รู้จักกันในชื่อ 3-tuple หรือ triple) ที่ใช้ในการจัดเก็บตัวระบุเช่นชื่อของบุคคลในองค์ประกอบแรกปีในองค์ประกอบที่สองและรายได้ของบุคคล สำหรับปีนั้นในองค์ประกอบที่สาม .NET Framework รองรับ tuples ที่มีองค์ประกอบหนึ่งถึงเจ็ดโดยตรง นอกจากนี้คุณสามารถสร้างสิ่งอันดับแปดหรือมากกว่าองค์ประกอบโดยการซ้อนวัตถุ tuple ในคุณสมบัติ Rest ของ Tuple <T1, T2, T3, T4, T5, T6, T7, TRest> วัตถุ
Adam Zuckerman

1
นั่นบอกว่า tuple สามารถเก็บประเภทใดก็ได้ใน octuple (8 ส่วนข้อมูล)
Adam Zuckerman


Python ของฉัน Lang-of-choice, ยังมีประเภทข้อมูล tuple ซึ่งเป็นบิตของการอ่านแนะนำให้ฉันต่อไปว่า tuples ที่มีความเหมาะสมสำหรับข้อมูลที่ประกอบไปด้วย หรืออาจเป็นค่าดัชนีของ tuple จะเป็นข้อมูลที่จะเก็บไว้สำหรับกรณีใช้งานและ tuple จะเป็นเหมือนค่าคงที่มากขึ้น บางอย่างเกี่ยวกับการอ้างอิงค่าคงที่ทั่วโลกหรือค่าคงที่ที่แปลเป็นภาษาท้องถิ่นโดยดัชนีดูเหมือนว่าการปฏิบัติที่ไม่ดีกับฉันเว้นแต่คุณจะอยู่ภายใต้ข้อ จำกัด ที่ห้ามสินค้าฟุ่มเฟือย
ThorSummoner

2
tuple เป็นประเภทข้อมูลที่สามารถจัดเก็บองค์ประกอบหลายอย่างบางสิ่งบางอย่างเช่น struct เฉพาะกำหนดแบบไดนามิก ดังนั้นมันจะเก็บตัวแปร 3 ตัวที่เป็นประเภท OP ที่ต้องการ ไม่ให้ข้อ จำกัด เกี่ยวกับเนื้อหาที่เขาต้องการ
gbjbaanb
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.