Múltiplos parâmetros vs único parâmetro (objeto com múltiplas propriedades)

5

Eu tenho uma entidade Student com as seguintes propriedades - ( name , joinedOn , birthday , age , batch , etc.) e uma função fetchStudents(<params>) . Quero buscar alunos com base em vários filtros.

No meu método, tenho duas maneiras de passar filtros.

  1. Passar todos os filtros como parâmetros para o método
  2. Crie uma turma do StudentCriteria com filtros como campos e, em seguida, passe     o objeto dessa classe

Enquanto trabalho em java eu sempre uso a segunda opção, mas recentemente estou trabalhando em php e fui aconselhado a seguir o primeiro caminho. Eu sou incapaz de descobrir qual o caminho é melhor em manter o código, reutilização e desempenho sábio. Obrigado.

    
por Shwetanka 09.12.2012 / 19:12
fonte

3 respostas

4

Pessoalmente, não gosto de ter muitos argumentos opcionais, se puder sair ileso. Eu posso achar muito difícil de ler e quando você acaba passando coisas como

getOption($option1, "",0,"")

onde a declaração do método é realmente algo como (obviamente nomes de parâmetros reais seriam melhor nomeados)

getOption($myoption, $textStr, $numberOf, %description = "", $name = "", $typeOf = 0)

É difícil saber lendo exatamente o que são os valores e também o que você está definindo ou deixando de fora. Toda vez que quero chamar esse método, tenho que ter muito cuidado para definir os parâmetros corretos no lugar certo.

Uma alternativa possível é usar algo como o padrão Builder, no qual você está construindo os critérios que deseja adicionar explicitamente. Para aqueles parâmetros que são necessários, você faz parte do construtor. Para aqueles opcionais, você tem um método para adicionar.

Algo como:

class StudentEnrollmentCriteriaBuilder {
   function __construct($id) {
      // id is always required for this criteria
   }

   function getCriteria() {
      // return the built up criteria
   }

   function addNameFilter($name) {
      // add the name to the filter
      return $this;
   }

   function addSexFilter($sex) {
      // add sex type as a filter

      return $this;
   }

   // etc
}

Eu acho que você poderia usá-lo como

$criteria = new StudentEnrollmentCriteriaBuilder ($id);

$query = $criteria.addNameFilter('bob').addSexFilter('M').getCriteria();

// faz coisas

Cada método seria responsável por adicionar o filtro, se válido. Então, no caso do nome, se fosse um nome vazio, você não o adicionaria como um filtro, etc., como não era necessário, ou lançaria uma exceção, etc etc

Se chegou até ele, onde há muitas propriedades eu prefiro a opção de objeto. Se alguns são obrigados, pelo menos, torná-los parte do construtor. Se você, pelo menos, tiver feito o método opcional com base, poderá adicionar a verificação de validade aos dados nesse ponto ou deixar que o usuário faça o mesmo.

Apenas meus 1 1/2 centavos.

    
por 09.12.2012 / 20:32
fonte
1

Eu costumo usar os parâmetros optional e tenho alguns filtros de função para verificar apenas os parâmetros que eu passo para a função. Isso evitará o incômodo de ter uma classe StudentSearchCriteria , enquanto mantém as chamadas de função razoavelmente curtas.

    
por 09.12.2012 / 19:41
fonte
0

"Código limpo" diz que você tem dois com o menor número de parâmetros possível.

Eu uso até três parâmetros.

Eu recomendo que você use a classe StudentSearchCriteria .

    
por 09.12.2012 / 19:26
fonte