Por que não há um booleano para valores x de uma variável? [duplicado]

4

Bem, antes de mais nada, eu não sou programador, sou engenheiro civil que faz alguma programação e aproveito bastante.

Segunda e segunda mais, eu gostaria de reivindicar direitos para esta incrível invenção e chamá-lo de TROLLEAN ou DASSOUKIEAN.

Brincadeiras à parte, várias vezes eu me deparo com variáveis que podem conter apenas três valores (vamos chamá-las como True, False e Other.

Por exemplo, faça uma interseção de tráfego. Ele pode ser sinalizado, não sinalizado ou não controlado (também conhecido como sem sinais de parada e sem sinais de trânsito). seria dnice definir TROLLEAN traffic_light = Other Other neste caso representa interseções não controladas. Em vez disso, encontro-me escrevendo uma sequência de código para definir isso.

    
por dassouki 28.07.2011 / 21:32
fonte

6 respostas

16

Eu posso estar entendendo mal a sua pergunta, mas eu acho que um Enum seria suficiente aqui. No caso da sua analogia do semáforo:

Enum TrafficLights
{
    Signalised,
    un-signalised,
    non-controller
}
    
por 28.07.2011 / 21:36
fonte
5

Você teria que ter um tipo diferente para cada valor, o que, embora possível e fiel ao espírito de digitação strong, provavelmente é um exagero para a maioria das finalidades.

É muito mais simples usar uma enumeração geral ou até mesmo um valor inteiro que pode ter tantos valores diferentes quanto você precisar. Isso satisfaz 99,9% dos casos do mundo real (que é o que devemos nos preocupar aqui).

Na verdade, os idiomas têm valores de três vias com o conceito de booleano anulável que pode ser null (para undefined), true ou false - embora, obviamente, não funcione para o exemplo que você dado onde um enum seria a melhor solução.

    
por 28.07.2011 / 21:37
fonte
3

Em C # você pode usar um booleano anulável se quiser evitar o enum. Algo como:

bool? IsTrue = true;
bool? IsFalse = false;
bool? IsMaybe = null;
    
por 28.07.2011 / 21:45
fonte
2

Este conceito existe. Ele é chamado de enum . Uma variável enum pode ser um dos n estados listados na declaração do tipo enum.

    
por 28.07.2011 / 21:37
fonte
2

Um termo comumente usado é 'tri-state' e geralmente é implementado de duas maneiras:

  • Usando uma enumeração especialmente criada para esse fim, por exemplo:

    enum Tristate { TRISTATE_TRUE, TRISTATE_FALSE, TRISTATE_UNDECIDED };

  • Uso de booleano anulável, por exemplo (em c #) bool? tristate; . Um booleano anulável pode conter um valor booleano regular (verdadeiro ou falso) ou null , que pode ser interpretado como 'sem valor' ou 'indeciso'.

Tristates são bastante comuns para botões de opção GUI: um botão de opção pode ser verificado, desmarcado ou acinzentado.

    
por 28.07.2011 / 22:24
fonte
1

Todas as respostas até agora praticamente o têm.

Tão recentemente quanto C ++, as linguagens nem sequer tinham um tipo "booleano". Se tal tipo fosse necessário, um enum ou um typedef int era usado para fazer o bool parecer com um tipo. Foi somente quando surgiu a próxima geração de linguagens orientadas para web e Windows, como VB, Java e C #, que o "bool" era considerado importante o suficiente para incluir como um tipo "interno".

O valor de um valor "trileano" pode ser muito dependente do contexto. "Verdadeiro" e "Falso" são muito gerais, e podem ser facilmente traduzidos na mente do programador para "sim" e "não" ou simplesmente "ligado" e "desligado". Os programadores pensam assim; eles precisam, porque é assim que o computador pensa. Sob todas as camadas de abstração são bilhões e bilhões de dígitos binários, que são representados pela continuidade dos circuitos microscópicos na CPU e em outros hardwares; ligado ou desligado, sem intermediários.

Adicionando esta terceira roda confunde as coisas. Qual o terceiro valor? Nulo? Não especificado? Desconhecido? Outro (e o que mais poderia haver em um espaço de resposta com "on" e "off")? Esse terceiro valor se torna MUITO dependente do contexto e, por esse motivo, "trileans" não são internos.

Assim como os booleanos simples antes de serem incorporados, você sempre pode criar os tipos de que precisa em praticamente qualquer idioma strongmente tipado. Um "trileano" seria criado usando um Enum com "verdadeiro", "falso" e qualquer que seja seu terceiro valor. No .NET, você poderia usar um bool anulável, onde null seria seu terceiro "valor". Ou, há vários tipos "tri-state" enumerados nas bibliotecas do Framework; DataGridViewTriState é grande, e seus valores são simplesmente True, False e NotSet, o que funcionaria em um grande número de casos.

    
por 29.07.2011 / 00:30
fonte