Bạn có thấy bất kỳ việc sử dụng Trilean nào (Đúng, Sai, ??) [đã đóng]


22

Đôi khi tôi có một hàm nên trả về đúng hoặc sai. Nhưng đôi khi ba giá trị có thể sẽ có ý nghĩa hơn.

Trong một số ngôn ngữ, các trường hợp sẽ được xử lý bằng số nguyên hoặc ngoại lệ.

Ví dụ, bạn muốn xử lý tuổi của người dùng nếu anh ta trên 18 tuổi. Và bạn có một chức năng như thế này.

if(user.isAdult(country_code)){
     //Go On
}else{
     // Block access or do nothing
}

Nhưng trong một số trường hợp tùy thuộc vào cách ứng dụng của bạn được xây dựng, tôi có thể thấy trường hợp trường sinh nhật không đầy đủ. Sau đó, chức năng này sẽ trả lại một cái gì đó không xác định.

switch(user.isAdult()){
    case true:
        // go on
        break;
    case undetermined:
        //Inform user birthday is incomplete
    case false:
        //Block access
}

Như tôi đã nói, chúng ta có thể xử lý điều đó với Exceptions và Int, nhưng tôi sẽ thấy khá gợi cảm khi có một sự thật, sai, không xác định được nhúng trong ngôn ngữ thay vì sử dụng một số hằng định nghĩa tại nhà.


15
Liên kết TDWTF bắt buộc: thed Dailywtf.com/Articles/What_Is_Truth_0x3f_.aspx :)
Adam Lear

2
@Anna Lear: Chết tiệt, bạn đánh tôi với nó. ^^
gablin

3
gablin: Chết tiệt, bạn thậm chí đánh tôi để phàn nàn về Anna.
user281377

1
Ugh, tôi cũng muốn lấy T, F, FNF! lắc nắm đấm
Mike M.

4
@gablin, @ammoQ, @Mike M.: Xin lỗi. :)
Adam Lear

Câu trả lời:


33

Điều này có thể được xử lý bằng enum, số nguyên, ký hiệu (ví dụ: Lisp, Ruby), loại nullable (sử dụng null làm trạng thái không xác định), loại tùy chọn (ví dụ ML) hoặc một số cấu trúc tương tự - tùy thuộc vào ngôn ngữ của bạn.

Vì vậy, trong khi ví dụ và lý do của bạn là âm thanh, tôi không thể thấy nó nằm trong danh sách ưu tiên của các tính năng ngôn ngữ để phát triển.


null trong C / C ++ được coi là bằng sai. Trong những trường hợp này, bạn phải trả về -1. Tôi nghĩ trạng thái không xác định là khá thường xuyên nhưng luôn bị đối xử khác nhau vì cú pháp này không thực sự tồn tại. Trong java, hàm boolean không thể trả về bất cứ thứ gì khác ngoài true hoặc false cho hàm boolean. Vì vậy, bạn buộc phải sử dụng một loại khác và tài liệu tốt giá trị trả về.
Loïc Faure-Lacroix

@Sybiam - không có gì sai khi sử dụng một loại khác khi thích hợp . Như tôi đã nói, tôi có thể thấy một đối số cho loại hình nhị phân, nhưng tôi không thể thấy nó được thêm vào các ngôn ngữ hiện tại bất cứ lúc nào.
ChrisF

6
@Sybiam: Trong Java, bạn có thể trả về Boolean, có thể là null. Trong C / C ++, bạn có thể trả về một enum.
Macneil

đây là sự điên rồ
Loïc Faure-Lacroix

2
@Macneil có lẽ là Sparta?
syockit

5

Tôi chưa thấy trường hợp nào là cần thiết. Trong ví dụ bạn đã đưa ra, nếu trường đó là cần thiết thì nó đã được xác nhận ở nơi khác. isAdult()vốn dĩ là một phương pháp hai trạng thái: Bạn có hoặc không. Không cần phải làm gì ngoài việc trả về false nếu gặp dữ liệu mà nó không thể xử lý. Ví dụ:

switch(user.isAdult()){
   case true:
      // go on
      break;
   default:
      // Block access.
}

2
Nếu dữ liệu không hợp lệ, nó có thể yêu cầu người dùng sửa nó khác với tuổi vị thành niên mà bạn không yêu cầu người đó nhập tuổi mới. Đây là 2 hành vi khác nhau. Ví dụ, một số trang xã hội cho phép bạn nhập ngày sinh nhật không đầy đủ để bảo mật.
Loïc Faure-Lacroix

2
Tôi nghĩ rằng việc xác nhận nên được thực hiện trong một khu vực / phần mã khác. Xác thực dữ liệu trước, và sau đó vận hành trên nó.
Michael K

1
@Sybiam: Nói chung, các ứng dụng không yêu cầu dữ liệu trên cơ sở hỗn loạn, khi họ cần. Bạn có thể .isAdult()truy vấn chính người dùng, nếu đó thực sự là những gì bạn muốn và điều đó sẽ hoạt động tốt hơn.
David Thornley

5

đúng, sai, không rõ

vâng, không, có lẽ

trong C #, bạn có thể sử dụng một bool nullable (bây giờ bạn có thể giật mình trong nỗi kinh hoàng)

trong MS-SQL, bạn có thể sử dụng trường bit nullable (ditto)


2
Vấn đề với các booleans nullable không phải là chúng có null, vì hầu hết mọi người (bao gồm cả tôi) không biết gì về logic ba giá trị. Cái nào, dành cho người mới bắt đầu: Scienceopia.org/bloss/goodmath/2010/08/24/ trên
Frank Shearar

Đúng / Sai / Không có.
Lennart Regebro

2
Điều thú vị là, rất nhiều người hiểu nhị phân, bát phân và hex, nhưng không thể bao bọc tâm trí của họ xung quanh ternary. Tại sao vậy? điều tương tự, chỉ cần cơ sở ba ... sẽ giải quyết vấn đề logic ba giá trị.
Michael K

5
Hầu hết mọi người chỉ có một nỗi sợ hãi của unknown.
dan04

2

Trong C ++, điều này có thể được xử lý với loại không booltrả về hoặc bằng cách ném một ngoại lệ. Nếu bạn muốn loại trả về ba giá trị, sử dụng một enum. Nó không phải là gợi cảm, nhưng nó hoạt động, và điều quan trọng hơn bạn có thể làm điều đó mà không làm rối ngôn ngữ cho phần còn lại của chúng tôi.

boolba giá trị sẽ gây ra vấn đề. Làm thế nào để bạn xử lý bool foo; ... if (foo)..., giả sử foocó thể có bất kỳ trong ba giá trị? Có những lợi thế để có boolcác biến sao cho chính xác một trong số đó foo!fooluôn luôn đúng. Nó giúp lý do về các chương trình.

Kiểm tra những gì mọi người làm trong xử lý số khi họ có thể có được NaNgiá trị. Nó phức tạp lắm. Tôi thà không phải trải qua nó để xử lý boolean thông thường.

Nếu bạn muốn .isAdult()xử lý thông tin không đầy đủ, hãy yêu cầu nội bộ thực hiện điều đó và sau đó trả lại truehoặc false. Mặt khác, mỗi khi bạn sử dụng nó, bạn cần kiểm tra mã trả về trước khi làm bất cứ điều gì khác và đưa ra cách xử lý. Điều đó có nghĩa là bạn phải kiểm tra các tài liệu để xem liệu một hàm có thực sự làm đúng như tên gọi của nó không, và đó sẽ là một thảm họa cho khả năng đọc.


2

Ý tưởng khá hữu ích. Có cả một lĩnh vực dành cho việc đối phó với sự không chắc chắn được gọi là Logic Mờ .

May mắn cho các lập trình viên của chúng tôi, bạn có thể thực hiện logic mờ với các tính năng ngôn ngữ tiêu chuẩn.

Chẳng hạn, trong trường hợp bạn đưa ra, thông tin không chắc chắn có thể dễ dàng xác định bằng cách hỏi người dùng. Vì vậy, một enum ba trạng thái như bạn mô tả sẽ hoạt động tốt.

Có tất cả các cách khác để không chắc chắn. Những câu hỏi như vậy bao gồm:

  • Liệu mai có mưa không? Điều đó chưa xảy ra, vì vậy không ai có thể biết - nhưng bạn có thể đoán và đưa ra xác suất.
  • Có sự sống đa bào trên một hành tinh trong hệ mặt trời của ngôi sao Beta Pictoris? Nó có một câu trả lời chắc chắn có hoặc không, nhưng hiện tại chúng tôi không thể nói đó là gì.

Rất nhiều câu hỏi có thể được xử lý bằng cách sử dụng xác suất trong phạm vi 0,0 (sai) đến 1,0 (đúng) và áp dụng toán học dấu phẩy động.

Một nhà hóa học tính toán và nhà khoa học máy tính tên David E. Shaw đã áp dụng loại điều này cho Phố Wall và hiện trị giá khoảng 2,5 tỷ đô la. Vì vậy, có, nó hữu ích. :-)


1

Nhiều năm trước tôi đã chơi với một số thuật toán được đưa ra để gán niềm tin cho các giá trị. Là loại vui vẻ. Cuối cùng, những gì tôi đã đạt được từ nó là boolean thường là một sự phù hợp. Thực sự nó phải là một giá trị đúng / sai / khác. Trong thử nghiệm dường như dẫn đến mã "tốt nhất" cho tôi tại thời điểm đó. Kể từ đó, tôi đã trích dẫn và làm những gì người khác làm, trong khi suy nghĩ bên trong, nó CÓ THỂ đơn giản hơn bao nhiêu nếu chúng ta bỏ việc làm theo cách cũ ... :-)


0

Tuy nhiên, các câu lệnh Case hoặc Switch sẽ hoạt động tốt cho việc này bằng cách sử dụng các số nguyên để tùy ý xử lý chuyển đổi.

Ngoài ra, trong Ruby, trong khi 'nil' trả về là sai trong một số trường hợp, nếu bạn sử dụng toán tử đẳng thức, nil == falsetrả về false, vì vậy bạn có thể sử dụng ruby nilđể xử lý logic tạm thời.


0

Một lựa chọn khác trong trường hợp của bạn có thể là đảo ngược sự kiểm soát bằng cách áp dụng hiệu trưởng "nói không hỏi" và đổi nó thành (xin lỗi về từ trưởng thành, tắc nghẽn não):

user.isAdult(new OnlyAllowAdultsToLogin())

nơi OnlyAllowAdultsToLoginStrategythực hiện một giao diện:

interface UserAdultnessPolicy
{
   void userIsAdult();
   void userIsChild();
   void userAdultnessIsUnknown();
}

Không gì void userIsAdult()làm gì? Có lẽ bạn có ý nghĩa bool userIsAdult()?
Timwi

0

Con trai tôi đã hỏi tôi làm thế nào để thực hiện hiệu quả các xét nghiệm giống như thế này. Các cờ được kiểm tra chỉ đúng / sai, nhưng các que diêm có ba trạng thái (Nó phải đúng, nó phải sai hoặc tôi không quan tâm). Tất nhiên điều này có thể được thực hiện với cấu trúc dữ liệu 2 bit và một chút vặn vẹo, nhưng loại mã đó thực sự cần phải được nhận xét vì mục đích không dễ dàng nhận ra khi chỉ nhìn vào mã.


0

C có tính năng này được thực hiện trong hầu hết các chức năng của thư viện. vd .

Cách tiếp cận tương tự có thể được sử dụng ở nơi khác, + / 0 / - như trạng thái ba của bạn. Nó cũng cho phép bạn thực hiện logic boolean trên các giá trị nếu bạn biết 0 nếu sai và bất kỳ giá trị nào khác là đúng.


0

Đối với C ++, Boost thực sự triển khai Tribool được mô tả như sau:

Lớp tribool hoạt động giống như kiểu bool tích hợp, nhưng đối với logic boolean 3 trạng thái. Ba trạng thái là đúng, sai và không xác định, trong đó hai trạng thái đầu tiên tương đương với trạng thái của loại bool C ++ và trạng thái cuối cùng đại diện cho một giá trị boolean không xác định (có thể đúng hoặc sai, chúng tôi không biết).


-1

Hộp kiểm VB6 có khả năng này. Các giá trị hộp kiểm có thể là 0 = tắt, 1 = bật, 2 = xám

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.