Princípio da Completude de tipo em C#

16 respostas
R

C# utiliza valores de segunda classe(valores que são usados com restrições)? Se utilizar ele viola o princípio da completude de tipo que diz que

Nenhuma construção de linguagem deve ser arbitrariamente restringida pelo tipo dos valores envolvidos na mesma

E ai? oq vcs acham?

16 Respostas

M

cara, aqui é um forum de Java, vai no site da msdn que talvez eles te ajudam!

boa sorte!

R

Já tentei la velho… não acho nada relacionado… eu sei q eh forum java… mas eu postei a duvida no fórum de outras linguagens

T

Ele está se referindo a isto aqui:
http://www.cs.jcu.edu.au/Subjects/cp2003/1997/foils/moreTypes/moreTypes.html

Se for isso, tanto C# quanto Java não têm valores de segunda classe, porque structs, classes e tipos primitivos podem ser passados de/para métodos, etc.

Como a tal página é velha (1997), então ela não considerou a evolução das linguagens. O exemplo dado (Pascal não poder retornar em um método um “record”) não vale mais.

W

hahahaha engracado que se alguem pergunta alguma coisa sobre C ia ter 20 nego respondendo.
Como eh C# sempre aparece alguem “reclamando” que aqui eh forum de Java :smiley:

P

mcbarsotti:
cara, aqui é um forum de Java, vai no site da msdn que talvez eles te ajudam!

boa sorte!

Não senhor, esse aqui é o forum “Outras linguagens”, que fica na seção de mesmo nome que abriga também o forum de Ruby. E mesmo antes de existir essa seção específica o GUJ sempre foi aberto à praticamente qualquer assunto referente ao desenvolvimento de software.

L

E ai? oq vcs acham?

Tipos escalares suportam as mesmas operações que tipos por referência. Poderia citar exemplos de quais operações são restritas? Conheço a CLR razoavelmente bem e não tenho um exemplo disso. Não é o caso dos tipos primitivos do Java, por exemplo.

R

Bem galera… vlw pela ajuda ai!

Pesquisando um pouquinho e lendo um livro aqui sobre Paradigmas de Linguagens de Programação cheguei a seguinte conclusao

Em C# temos valores de segunda classe como por exemplo no código abaixo, uma abstração de procedimento.

public void oiMundo() { Console.write("oiMundo"); }

Onde viola o princípio da completude de tipo pois uma abstração de procedimento não pode ser um argumento para um abstração de função.

R

Eu desconehcia esse principio:
Lendo mais cheguei nesse afirmação:

Se nenhuma operação nao deve ser restringida pelo tipo de valores envolvidos em Java a sobrecarga d metodos não violaria esse principio?
Tipo:

System.out.println(double value) , System.out.println(boolean value) , System.out.println(int value)

Ou entendi errado?.. :roll:

R

Acho que falei a besteira qnto a sobrecarga.
A sobrecarga de metodos é um caracteristica da Orietancao a Objetos.

Mas mudando o tipo da pergunta linguagens orientada a objetos que suportam a sobrecarga não violaria esse principio?

B

Eu entendi nenhuma construção da linguagem.

Por exemplo, o switch do Java é restrito a tipos primitivos e enums. Obedecer esse princípio significaria que Strings, BigDecimals e qqr outro objeto que implemente comparações poderia ser usado no switch.

É a minha opinião.

T

Em C# é possível, mas com um pouco de trabalho, receber e retornar referências a métodos também.
Este código foi testado com o Visual Studio 2008.

// Requer .NET Framework 3.5 (Visual Studio 2008) para rodar
    class Exemplo
    {
        // Teste para procedimentos
        public void oiMundo()
        {
            Console.WriteLine("Oi, mundo!");
        }
        public void adeusMundoCruel() 
        {
            Console.WriteLine("Adeus, mundo cruel!");
        }
        public Action retornaAcao(int n)
        {
            switch (n)
            {
                case 1: return oiMundo;
                case 2: return adeusMundoCruel;
                default: return null;
            }
        }
        public void executaAcao(Action act)
        {
            act();
        }

        // Teste para funções
        public int max(int x, int y)
        {
            return x > y ? x : y;
        }
        Func<int, int, int> min = (x, y) => x < y ? x : y;
        public int executaFuncao(Func<int, int, int> f, int x, int y)
        {
            return f(x, y);
        }


        public Exemplo()
        {
            retornaAcao(1)();
            executaAcao(retornaAcao(2));

            Console.WriteLine("Maximo de 10 e 20 eh " + executaFuncao(max, 10, 20));
            Console.WriteLine("Minimo de 10 e 20 eh " + executaFuncao(min, 10, 20));
        }
    }
R

Em C# é possível, mas com um pouco de trabalho, receber e retornar referências a métodos também.
Este código foi testado com o Visual Studio 2008.

Qual o problema disso? Se tem algum

T

Só falei “um pouco de trabalho” porque não é intuitivo.

O tipo de uma variável ou parâmetro que recebe uma referência a um método sem parâmetros e que não retorna nada é Action.

O tipo de uma variável ou parâmetro que recebe uma referência a um um método com parâmetros (int, short) e que não retorna nada é Action<int,short>

O tipo de uma variável ou parâmetro que recebe uma referência a um um método sem parâmetros e que retorna um double é Func<double>

O tipo de uma variável ou parâmetro que recebe uma referência a um um método com parâmetros (string, long, decimal) e que retorna um DateTime é Func<string,long,decimal,DateTime>

Veja o programa de exemplo que preparei acima.

A saída esperada dele, se você instanciar um elemento da classe Exemplo, é

Oi, mundo!
Adeus, mundo cruel!
Maximo de 10 e 20 eh 20
Minimo de 10 e 20 eh 10

L

raffccc:
Bem galera… vlw pela ajuda ai!

Pesquisando um pouquinho e lendo um livro aqui sobre Paradigmas de Linguagens de Programação cheguei a seguinte conclusao

Em C# temos valores de segunda classe como por exemplo no código abaixo, uma abstração de procedimento.

public void oiMundo() { Console.write("oiMundo"); }

Onde viola o princípio da completude de tipo pois uma abstração de procedimento não pode ser um argumento para um abstração de função.

Em C# 3.0 é possível converter qualquer expressão em dados:

static void If (Func<bool> cond, Action then, Action else_) {
		if (cond())
			then();
		else 
			else_();			
	}


	static void Main () {
		If (()=> true , ()=> Console.WriteLine ("Oi Mundo"), ()=> Console.WriteLine ("Nada no else") );
	}

C# 3.0 tem closures, ainda não existe conversão automática de código em closures, mas isso é outra história.

M

pcalcado:
mcbarsotti:
cara, aqui é um forum de Java, vai no site da msdn que talvez eles te ajudam!

boa sorte!

Não senhor, esse aqui é o forum “Outras linguagens”, que fica na seção de mesmo nome que abriga também o forum de Ruby. E mesmo antes de existir essa seção específica o GUJ sempre foi aberto à praticamente qualquer assunto referente ao desenvolvimento de software.

opaa, é a força do habito!! :lol:
mas se a idéia é abragir qualquer assunto relacionado ao desenvolvimento, não deveriam trocar o slogan do guj “e o maior forum brasileiro sobre Java” por “e o maior forum brasileiro sobre Desenvolvimento e Java” ou algo do tipo :roll:

abraços!

P

Continuamos sendo o maior forum sobre Java. O slogan nao diz que o forum eh somente sobre Java :wink:

Criado 15 de maio de 2008
Ultima resposta 15 de mai. de 2008
Respostas 16
Participantes 8