Dada a seguinte função

public static List<Produto> listProdutoOnlyCodigoNomeUnidadeMedida()
{
	ProdutoDAL db = new ProdutoDAL();

	db.select = $"{SqlField.get(() => db.tbl.Codigo)}, {SqlField.get(() => db.tbl.Nome)}, {SqlField.get(() => db.tbl.UnidadeVendaDR.Nome)}"; //SELECT codigo, nome, UnidadeVenda.nome
	
	db.join = $"{SqlJoin.join(SqlJoin.TIPO_JOIN.LEFT, db.tbl.UnidadeVendaDR.TABLE_ALIAS, () => UnidadeVenda__Ide, () => UnidadeVendaDR.Ide, tabelaAliasFrom: db.tbl.TABLE_ALIAS))}";
	
	db.where = $"{SqlFilter.notEqual(() => db.tbl.Status)}"; // WHERE status <> @status
	
	db.param.Add(SqldbParameter.create(SqlFilter.get(() => db.tbl.Status), SqlDbType.Int, Registro.Status.Apagado.toInt())) // @status = -1
	
	return db.listJoin(db.tbl.buildIndexProdutoOnlyCodigoNomeUnidadeMedida, db.tbl.fillProdutoOnlyCodigoNomeUnidadeMedida);
}

Queremos criar uma nova função, que retorne o mesmo tipo da função acima, mas com as seguintes modificações

  • Não queremos mais o join com a tabela UnidadeMedida

E aí? como vamos criar essa nova função? Copiar, colar e remover o join como o exemplo abaixo?

public static List<Produto> listProdutoOnlyCodigoNome()
{
	ProdutoDAL db = new ProdutoDAL();

	db.select = $"{SqlField.get(() => db.tbl.Codigo)}, {SqlField.get(() => db.tbl.Nome)}"; //SELECT codigo, nome
	
	db.where = $"{SqlFilter.notEqual(() => db.tbl.Status)}"; // WHERE status <> @status
	
	db.param.Add(SqldbParameter.create(SqlFilter.get(() => db.tbl.Status), SqlDbType.Int, Registro.Status.Apagado.toInt())) // @status = -1
	
	return db.list(db.tbl.buildIndexProdutoOnlyCodigoNome, db.tbl.fillProdutoOnlyCodigoNome);
}

Não! Por quê? Porquê a manutenção desse código pode ser custosa pra fazer. Se você precisar mudar algo na primeira função, você vai ter que mudar na segunda também

Temos uma técnica muito sinistra que se chama isolar e extrair elementos de uma função

Como funciona?

Seguindo o exemplo acima, vamos fazer as seguintes alterações

  1. Criar uma nova função, retornando o DAL
  2. Ajustar a primeira função
  3. Criar a segunda função

1. Criar uma nova função, retornando o DAL

Quais são as similaridades entre a função que já existe para a função que precisamos criar? Sabemos que:

  • A função original faz o join com a tabela UnidadeVenda o que não vamos precisar para criar a nossa segunda função
  • Fora isso, ela tem todas os filtros (db.where) e campos que desejamos para a nossa segunda função

Com essas informações em mãos, vamos extrair as informações em comum entre as duas funções (a original e a que iremos criar mais a frente) em uma nova função

Criando a nova função

private static ProdutoDAL createDal() // a função original não usa parâmetros, e a nova também não vai usar
{
	ProdutoDAL db = new ProdutoDAL();
	
	db.select = $"{SqlField.get(() => db.tbl.Codigo)}, {SqlField.get(() => db.tbl.Nome)}"; // buscando apenas o codigo e nome, ja que as duas funções usam esses campos
	db.where = $"{SqlFilter.notEqual(() => db.tbl.Status)}"; // WHERE status <> @status, utilizado nas funções
	db.param.Add(SqldbParameter.create(SqlFilter.get(() => db.tbl.Status), SqlDbType.Int, Registro.Status.Apagado.toInt())) // @status = -1 // utilizado nas duas funções
	return db; // retornando o nosso db já com os campos código e nome e com os filtros diretinho do forno
}

Essa função poderá ser aproveitada pelas duas funções

2. Ajustando a função original

A nossa função original faz join com a tabela UnidadeMedida. Como criamos uma função que já retorna algumas informações, vamos adaptar essa função original

public static List<Produto> listProdutoOnlyCodigoNomeUnidadeMedida()
{
	ProdutoDAL db = createDal(); // esse createDal() é o que criamos acima, e ele já retorna pra gente os campos código e nome, e já tem os filtros necessários
	
	db.select += $", {SqlField.get(() => db.tbl.UnidadeVendaDR.Nome)}"; // precisamos apenas incluir a unidadeMedida agora, ja que temos os outros campos quando chamamos a funcao createDal()
	
	db.join = $"{SqlJoin.join(SqlJoin.TIPO_JOIN.LEFT, db.tbl.UnidadeVendaDR.TABLE_ALIAS, () => UnidadeVenda__Ide, () => UnidadeVendaDR.Ide, tabelaAliasFrom: db.tbl.TABLE_ALIAS))}"; // incluindo o join, já que o createDal não tem esse join
	
	return db.listJoin(db.tbl.buildIndexProdutoOnlyCodigoNomeUnidadeMedida, db.tbl.fillProdutoOnlyCodigoNomeUnidadeMedida);
}

Dessa forma só precisamos criar o que restou da createDal()

3. Criando a segunda função

Agora precisamos criar a função que nos solicitaram. Essa função não precisa ter o join

public static List<Produto> listProdutoOnlyCodigoNome()
{
	ProdutoDAL db = createDal(); // esse createDal() ja busca o código e nome
	
	return db.list(db.tbl.buildIndexProdutoOnlyCodigoNome, db.tbl.fillProdutoOnlyCodigoNome); // nesse caso nem precisamos acrescentar outros campos porque a função já criou tudo que precisamos
}
Daegrickcriado em 30 set 2024 alterado em 02 out 2024

Base conhecimento VR System Desenvolvimento

82 | 0