Kiểu dữ liệu tốt nhất để lưu trữ một biến ternary hoặc ba trạng thái


13

Tuyên bố miễn trừ trách nhiệm: Tôi biết rằng các kiểu dữ liệu hơi chủ quan một chút về ngôn ngữ lập trình / lập trình mà bạn đang sử dụng, tôi muốn viết bằng Python như một vấn đề ưu tiên; mặc dù tôi rất vui khi nghe về bất kỳ lanugage / thực hiện.

Kiểu dữ liệu tốt nhất để lưu trữ một biến ba trạng thái là gì? Một cái gì đó có khả năng hoặc đại diện cho tích cực, trung lập và tiêu cực.

Ví dụ: Số nguyên -1, 0, 1.

  • Pro: Rất súc tích.
  • Pro: Có khả năng hiệu quả, Có thể được lưu trữ dưới dạng một số nguyên có chữ ký 2 bit.
  • Pro: có thể được sử dụng như một thang đo, chẳng hạn như hệ số nhân dấu phẩy động.

Ví dụ 2: 0, null, 1(hoặc bất kỳ hoán vị)

  • Pro: Trường hợp sử dụng không trung tính có thể là nhị phân.
  • Con: Yêu cầu kiểu dữ liệu động
  • Con: Có khả năng không súc tích.

Ví dụ 3 : +, (chuỗi trống),-

  • Pro: Rất súc tích.
  • Con: Có thể sử dụng logic chuỗi để xác định trạng thái.
  • Pro?: Đại diện đồ họa trực quan.

Có lẽ có một số logic nhị phân thông minh có thể làm điều gì đó thông minh mà tôi thậm chí không thể tưởng tượng được, có lẽ có quá nhiều cân nhắc về trường hợp sử dụng.

Ngoài ra, có bất kỳ cân nhắc khi điều chỉnh một trạng thái ternary để lưu trữ trong một công cụ cơ sở dữ liệu? Giống như Innodb để tham khảo.


12
Enum : python , java , C # , C , C ++ , đi ...

Ibidem, nhưng tôi nói thêm rằng trong nhiều ngôn ngữ, các kiểu liệt kê mang lại cho bạn sự an toàn hơn rất nhiều so với việc cố gắng xỏ chúng vào một số loại khác.
Blrfl

4
Câu hỏi này phụ thuộc nhiều vào trường hợp sử dụng. Nói chung, tất cả các lựa chọn thực hiện được liệt kê có vẻ phù hợp cho một số mục đích khác nhau, tại các thời điểm khác nhau.
rwong

2
Trong .NET bạn có thể sử dụng một boolean nullable. Hầu hết các cơ sở dữ liệu sẽ cho phép bạn lưu trữ một boolean (hoặc bit như thường được gọi) với trạng thái nullable. Bạn cũng có thể sử dụng char để lưu trữ. Char sẽ cho phép nhiều phòng hơn sau đó mà không phải thay đổi cơ chế lưu trữ.
Adam Zuckerman

1
Một con trỏ đến bool cũng có thể được sử dụng. Bool bị buộc về 0 và 1 và nếu con trỏ là NULL, bạn có trạng thái thứ ba. Tất nhiên phụ thuộc vào ngôn ngữ.
Devolus

Câu trả lời:


7

Ngoài một enum là cách rõ ràng và rõ ràng nhất để thể hiện điều này, hệ thống được sử dụng cho hệ thống có thể tương tác trong đó enum dành riêng cho ngôn ngữ không thể được biểu thị là tùy chọn -1/0/1.

Mặc dù vậy, bạn có thể muốn thử bitmask, trong đó 0 có nghĩa là 0, 1 có nghĩa là 'bit 2 set' và 2 có nghĩa là 'bit 3 set' (nghĩa là bạn có 3 bit có thể bật hoặc tắt. Miễn là bạn không xác định 3, hoặc bit 1 và 2 được đặt, sau đó bạn tốt. Tùy chọn này là tốt nhất nếu bạn nghĩ rằng bạn có thể cần 4 hoặc nhiều cờ trong tương lai vì 4, 8, 16 vv đặt các bit tiếp theo).

Tất cả những điều này phù hợp với một kiểu dữ liệu 8 bit duy nhất để không lãng phí bộ nhớ hoặc yêu cầu chuyển đổi (như một hệ thống dựa trên ký tự, đôi khi sử dụng ký tự 16 bit, đôi khi 8 bit tùy thuộc vào nền tảng của bạn).

Tôi sẽ không xem xét null trong mọi trường hợp. Có thể trong cơ sở dữ liệu, nhưng chỉ khi tôi có thể đảm bảo hệ thống có hỗ trợ riêng cho NULL và thậm chí sau đó có thể dễ bị lỗi nếu ai đó không phân biệt rõ ràng và kết thúc bằng 0 khi nó thực sự không có giá trị.


Câu trả lời tốt nhất ở đây IMO. NULL có thể là nó chưa được thêm vào DB, không phải trạng thái của nó là 'NULL' có -1,0,1 và có thể là NULL - null chỉ ra rằng trường không bao giờ được điền!
Ken

3

Tôi không có ý định viết một câu trả lời rõ ràng cho câu hỏi này trực tiếp; như tôi đã khen ở trên, câu hỏi này phụ thuộc rất nhiều vào trường hợp sử dụng. Nói chung, tất cả các lựa chọn thực hiện được liệt kê có vẻ phù hợp cho một số mục đích khác nhau, tại các thời điểm khác nhau.

Tuy nhiên, tôi muốn thu hút sự chú ý của bạn vào những nguyên tắc cơ bản và kiến ​​thức nền tảng này, để bạn có thể đưa ra quyết định sáng suốt của riêng mình.


Trên một ghi chú nhẹ hơn, cũng đọc câu nói đùa này: "Một doanh nhân hỏi một kế toán viên, hai cộng hai là gì?"

Xin lỗi tất cả các kế toán viên và người không kế toán. Việc tôi đề cập đến trò đùa này là nhằm làm nổi bật sự tự do của một cái gì đó chúng ta sẽ sớm xác định, và trách nhiệm và hậu quả (cả hai theo nghĩa logic) tiếp theo.


Câu hỏi: bảng chân lý của logic ba giá trị là gì?

Câu trả lời:

... đứng dậy khỏi ghế, đi đến cửa, đóng cửa, quay lại và ngồi xuống. Nghiêng người qua bàn,

... Và rút ra một biểu đồ vẽ tay trên một tờ giấy.

Hoạt động: Hợp lý và - Bảo mật - Dự thảo cho quý 3 năm 2014

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

... ông nói bằng một giọng thấp, " bao nhiêu những gì bạn sẽ giống như những giá trị ảo thuật được?"

Một nhà thiết kế đồ họa hỏi một lập trình viên, "Bạn có thể đưa ra một ví dụ về logic ba giá trị không?"

Lập trình viên trả lời: "Bạn có thể cho tôi hai màu, đó là đen và trắng như chúng có thể không?"

Nhà thiết kế đồ họa: "vậy ... đen và trắng?"

Lập trình viên: "chính xác. Bây giờ tôi sẽ đưa ra màu thứ ba - nhưng tôi sẽ phải chỉ định nó là số ARGB. Tôi hy vọng bạn không phiền."

Nhà thiết kế đồ họa: "tôi cũng làm việc với ARGB mỗi ngày ..."

Black#FF000000
White#FFFFFFFF
Nothing#00000000

Ghi chú. Ở trên, Đen và Trắng có màu đục hoàn toàn. Màu thứ ba, Không có gì, hoàn toàn trong suốt. Khi trộn lẫn với nhau theo nhiều tỷ lệ khác nhau, Đen và Trắng trộn lẫn thành nhiều màu xám khác nhau, nhưng trộn vào Không có gì thay đổi.


Tôi khá thích thú với việc sử dụng một bảng chân lý, Một lần nữa mở mắt ra ý nghĩa đằng sau những câu hỏi của riêng tôi.
ThorSummoner

1

Nếu ba trạng thái có thể có một số ý nghĩa vốn có, sử dụng một cái gì đó phù hợp với ý nghĩa vốn có. Ví dụ: các trạng thái có thể là 1, 2 hoặc 3 hoặc nếu chúng là 100, 200 và 300, hãy sử dụng một số nguyên. Nếu các trạng thái có thể là có, không hoặc không xác định, bạn có thể sử dụng một boolean tùy chọn hoặc một con trỏ tới một đối tượng boolean, với khả năng không có giá trị, giá trị "có" hoặc giá trị "không". Mặc dù một số người có thể không thích nó.

Nếu có một cách rõ ràng làm thế nào số nguyên có thể được hiểu là trạng thái có thể, bạn có thể sử dụng số nguyên. Nói một hàm so sánh có các trạng thái "ít hơn", "bằng", "lớn hơn" có thể sử dụng -1, 0 và +1. Mặc dù một số người có thể không tìm thấy rõ ràng những gì bạn thấy rõ ràng.

Nếu có một cách rõ ràng làm thế nào các chữ cái có thể được hiểu là trạng thái có thể, bạn có thể sử dụng một ký tự. Ví dụ: nếu trạng thái của bạn là "đỏ", "xanh" hoặc "xanh", bạn có thể sử dụng các chữ cái 'r', 'g' và 'b'. Một lần nữa, những gì rõ ràng với bạn ...

Một kiểu liệt kê luôn luôn là một khả năng. Một chuỗi luôn luôn là một khả năng, nhưng bạn mất kiểm tra kiểu trong hầu hết các ngôn ngữ.

Một số người sử dụng ba giá trị boolean để biểu thị "ở trạng thái 1", "ở trạng thái 2", "ở trạng thái 3".

Dù bạn làm gì, bạn nên được hướng dẫn bằng cách cố gắng sử dụng thứ gì đó rõ ràng và dễ hiểu, không khiến bạn gặp rắc rối nếu đột nhiên bạn có bốn trạng thái và hãy để trình biên dịch tìm ra lỗi sai nhiều nhất có thể.


0

Kiểu dữ liệu tốt nhất để lưu trữ một biến ba trạng thái là gì? Một cái gì đó có khả năng hoặc đại diện cho tích cực, trung lập và tiêu cực.

Điều này phụ thuộc rất lớn vào ngôn ngữ, những gì bạn đang làm, mức độ trừu tượng (cũng phụ thuộc vào ngôn ngữ và vv).

Tôi chủ yếu sử dụng C ++ và có rất nhiều sự lựa chọn ở đây. Đơn giản nhất là một enum tribool_state { false_val, true_val, undetermined_val }. Điều này là đủ nếu kịch bản sử dụng của bạn là một hàm duy nhất trả về loại giá trị này.

Tôi có thể sẽ sử dụng boost::optional<bool>nếu tôi muốn biểu thị một kết quả boolean mà có thể không thể nhận được (ví dụ: kiểm tra xem dữ liệu mạng đã nhận được chưa, sau đó xử lý giá trị boolean nếu đó là trường hợp).

Tôi sẽ sử dụng boost::triboolnếu tôi muốn thể hiện một kết quả boolean mờ mà được hỗ trợ đầy đủ tri-state logic boolean (ví dụ true || indetermined -> true, false && indetermined -> false, true && indetermined -> indeterminedvà vân vân).

Tương tự, trong python, tôi sẽ sử dụng một tập các hằng hoặc một lớp (một lần nữa, tùy thuộc vào loại ngữ nghĩa / hoạt động tôi sẽ cần trong mã máy khách):

Ví dụ: tôi sẽ sử dụng:

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

nếu tôi có một trường hợp đơn giản của một hàm trả về một trong ba kết quả.

Thay vào đó, nếu tôi có một thư viện đầy đủ yêu cầu logic boolean ba trạng thái, tôi sẽ triển khai kiểu giá trị dưới dạng một lớp.


0

Nếu bạn đang sử dụng Java, bạn có thể sử dụng một đối tượng Boolean: vì nó là một đối tượng và chứa một boolean, nó có thể giữ các giá trị true, false và null. Tôi không chắc chắn nếu đây là cách tốt nhất.


-6

Trong Microsoft.NET, có một loại "Tuple" có thể được sử dụng cho yêu cầu của bạn. Truy cập http://msdn.microsoft.com/en-us/l Library / system.tuple% 28v = vs.110% 29.aspx


Trên mỗi trang đó: Một tuple là một cấu trúc dữ liệu có số lượng và chuỗi các phần tử cụ thể. Một ví dụ về bộ dữ liệu là cấu trúc dữ liệu có ba yếu tố (được gọi là bộ ba hoặc bộ ba) được sử dụng để lưu trữ một mã định danh như tên của một người trong phần tử đầu tiên, một năm trong phần tử thứ hai và thu nhập của người đó cho năm đó trong yếu tố thứ ba. .NET Framework hỗ trợ trực tiếp các bộ dữ liệu với một đến bảy yếu tố. Ngoài ra, bạn có thể tạo các bộ dữ liệu gồm tám hoặc nhiều phần tử bằng cách lồng các đối tượng tuple trong thuộc tính Rest của một đối tượng Tuple <T1, T2, T3, T4, T5, T6, T7, TRest>.
Adam Zuckerman

1
Điều đó nói rằng một tuple có thể lưu trữ bất kỳ loại nào lên đến một quãng tám (8 chiều).
Adam Zuckerman


Python lựa chọn của tôi, Python, cũng chứa một kiểu dữ liệu tuple, mà một chút về cách đọc gợi ý, với tôi, dù sao đi nữa, các bộ dữ liệu đó phù hợp với dữ liệu ternary. Hoặc có khả năng giá trị của một chỉ số tuple sẽ là dữ liệu để lưu trữ cho trường hợp sử dụng và bộ dữ liệu sẽ giống như một hằng số. Một cái gì đó về việc tham chiếu các hằng số toàn cầu, hoặc thậm chí cục bộ theo chỉ số có vẻ như là thực tiễn kém đối với tôi, trừ khi bạn bị ràng buộc cấm những thứ xa xỉ.
ThorSummoner

2
Một tuple là một kiểu dữ liệu có thể lưu trữ nhiều phần tử, một cái gì đó giống như một cấu trúc, chỉ được xác định động. Vì vậy, nó sẽ lưu trữ 3 biến của loại OP muốn. Nó không phục vụ để cung cấp các hạn chế về nội dung anh ta muốn.
gbjbaanb
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.