Passagem de parâmetro

Sempre me deparo com esta dúvida. Quando devemos passar para um método um objeto ou simplemente o item em questão. Explico:
Tenho minha classe pessoa:

public Pessoa(){
   private String cpf;
   private String nome;
   private String rg;
}

Meu método que recebe ela ficaria assim:

public IList<Pessoa> buscar(String cpf, String rg){
//Implementação
}

Ou poderia ser:

public IList<Pessoa> buscar(Pessoa p){
//Implementação
}

Normalmente você passa os itens que quer procurar, a menos que você tenha de procurar por muitas chaves. Nesse caso, crie uma outra classe que serve para procurar o tal item.

E a propósito, porque é que está retornando um IList? Você está programando em C#?

[quote=entanglement]Normalmente você passa os itens que quer procurar, a menos que você tenha de procurar por muitas chaves. Nesse caso, crie uma outra classe que serve para procurar o tal item.

E a propósito, porque é que está retornando um IList? Você está programando em C#?
[/quote]

É. Estou programando em C#. E realmente tem muitas chaves pra passar no objeto.

Então o mais viável seria criar objetos próprios pra passar como parâmetros? Não posso usar objetos que já existem e que já tenham as informações que necessito?

Sei que ficar realmente estranho, pois por exemplo as vezes passo valores que estão em objetos que são propriedades do que estou passando. Deixa mostrar como (isto é só um exemplo):

public Funcionario(){
&nbsp;&nbsp;&nbsp;private Pessoa pessoa;
&nbsp;&nbsp;&nbsp;private String funcional;
&nbsp;&nbsp;&nbsp;private Filial filial;
}

Daí passo para o método:

public IList<Pessoa> busca(Funcional)

Sendo que só preciso no método do cpf da classe Pessoa, da funcional e do id da Filia.

Bem Vindo ao forum !

Porem antes de postar verifique se a mesma esta correta , exemplo a classe Pessoa esta errada, deveria ficar assim

class Pessoa{
   private String cpf;
   private String nome;
   private String rg;
   
   //get and setters 

}

O uso de , chamamos de Generics , ou seja eu posso passar para determinado método somente aquele tipo !

Pelo que entendi vc pode esta em duvida referente a passagem de parâmetros , vc pode passar da maneira que achar necessario , eu aconselho sempre
usar objetos , usando acessos gets e sets , mas isto vc se acostuma com o tempo
Bom Estudo !!


Ps : Nao se esqueça este eh um fórum referente a JAVA .
[i][u]

[quote=edmarr]Bem Vindo ao forum !

Porem antes de postar verifique se a mesma esta correta , exemplo a classe Pessoa esta errada, deveria ficar assim

class Pessoa{
   private String cpf;
   private String nome;
   private String rg;
   
   //get and setters 

}

O uso de , chamamos de Generics , ou seja eu posso passar para determinado método somente aquele tipo !

Pelo que entendi vc pode esta em duvida referente a passagem de parâmetros , vc pode passar da maneira que achar necessario , eu aconselho sempre
usar objetos , usando acessos gets e sets , mas isto vc se acostuma com o tempo
Bom Estudo !!


Ps : Nao se esqueça este eh um fórum referente a JAVA .
[i][u][/quote]

Não fiz diferente disto. Só esqueci do class:

public Pessoa(){  
    private String cpf;  
    private String nome;  
    private String rg;  
}

[quote=entanglement]Normalmente você passa os itens que quer procurar, a menos que você tenha de procurar por muitas chaves. Nesse caso, crie uma outra classe que serve para procurar o tal item.

E a propósito, porque é que está retornando um IList? Você está programando em C#?
[/quote]

Entendi o que você quer fazer: você quer passar um objeto incompleto do tipo Pessoa, para achar as Pessoas que se enquadram nesse padrão.
Isso é OK desde que o tal objeto Pessoa não tenha validações internas que não permitam seu uso “incompleto”, e que você saiba o que está fazendo (ou seja, documente adequadamente seu uso).
(Eu realmente não gosto disso, em um projeto em C++ que tive de manter, o cara fez exatamente isso (passar para um método um objeto incompleto, para a rotina de busca preenchê-lo) e foi um “parto” reformá-lo para que os parâmetros de busca fossem passados por parâmetros - não gosto de ficar com esse padrão de “objetos incompletos”, até porque para cada tipo de “incompletude” que há em um objeto você acaba tendo, muitas vezes, de criar uma query diferente para cada um - e nesse caso ainda prefiro ter um método separado para cada um.

[quote=entanglement][quote=entanglement]Normalmente você passa os itens que quer procurar, a menos que você tenha de procurar por muitas chaves. Nesse caso, crie uma outra classe que serve para procurar o tal item.

E a propósito, porque é que está retornando um IList? Você está programando em C#?
[/quote]

Entendi o que você quer fazer: você quer passar um objeto incompleto do tipo Pessoa, para achar as Pessoas que se enquadram nesse padrão.
Isso é OK desde que o tal objeto Pessoa não tenha validações internas que não permitam seu uso “incompleto”, e que você saiba o que está fazendo (ou seja, documente adequadamente seu uso).
(Eu realmente não gosto disso, em um projeto em C++ que tive de manter, o cara fez exatamente isso (passar para um método um objeto incompleto, para a rotina de busca preenchê-lo) e foi um “parto” reformá-lo para que os parâmetros de busca fossem passados por parâmetros - não gosto de ficar com esse padrão de “objetos incompletos”, até porque para cada tipo de “incompletude” que há em um objeto você acaba tendo, muitas vezes, de criar uma query diferente para cada um - e nesse caso ainda prefiro ter um método separado para cada um.
[/quote]

Não é que eu queira fazer desta forma. Busco formas melhores. Pois se passo os parâmetros direto, a lista fica as vezer enorme e não fica visualmente legal. Já o objeto incompleto, para quem passa o parâmetro fica um incógnita do que passar.

Pois é. No C# há parâmetros opcionais ou nomeados? Não sei se isso já existe ou só vai entrar no C# 4.0 (Visual Studio 2010).

IList<Pessoa> familiaSilva = obj.achar (sobrenome := "Silva");

IList<Pessoa> joaoSilva = obj.achar (cpf := "104.456.678-90");

Acho que isso é um trabalho para o LINQ + SQL.

Eu não sou muito fã de passar tipos primitivos e objetos básicos da linguagem, prefiro passar algo com mais contexto:

[code]List buscar(CPF cpf) {
// implementação
}

List buscar(RG rg) {
// implementação
}

List buscar(Pessoa pessoa) {
// implementação
}[/code]A vantagem é que o código fica bem mais limpo, há um reaproveitamento muito maior dos objetos com composição, agregação, além desses objetos poderem assumir outros papéis, como formatar seus próprios números.
A desvantagem é que aumenta o número de classes a serem escritas no sistema.

[quote=Bruno Laturner]Eu não sou muito fã de passar tipos primitivos e objetos básicos da linguagem, prefiro passar algo com mais contexto:

[code]List buscar(CPF cpf) {
// implementação
}

List buscar(RG rg) {
// implementação
}

List buscar(Pessoa pessoa) {
// implementação
}[/code]A vantagem é que o código fica bem mais limpo, há um reaproveitamento muito maior dos objetos com composição, agregação, além desses objetos poderem assumir outros papéis, como formatar seus próprios números.
A desvantagem é que aumenta o número de classes a serem escritas no sistema.[/quote]

isso nao tem nenhuma desvantagem , ter muitas classes escritas ? isso nao é para se preocupar.
Tem é vantagem codigo legivel e bem mais limpo o que facilita bastante na manuntenção para quem o fizer. O problema nao é apenas fazer funcionar é mesmo manter o funcionamento da coisa.