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
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
Seguindo o exemplo acima, vamos fazer as seguintes alterações
Quais são as similaridades entre a função que já existe para a função que precisamos criar? Sabemos que:
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
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
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()
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
}