ORIENTACAO A OBJETOS - CONCEITO

KERPLUNK 25/09/2013 14:26:05
#429268
Ressaltando o quão [Ô]outdated[Ô] está o framework 2.0, o suporte à ele já está extinto desde abril de 2011. A versão de framework mais antiga ainda com suporte é a 3.5 SP1 confira aqui
AUGUSTOGODO 02/10/2013 16:28:10
#429510
Alguem pode me ajudar??
Eu não sei quase nada sobre VBA mas eu gostaria de fazer um formulário com 4 campos para digitar mas que eles só habilitem se for clicado no botão de opção [Ô]sim[Ô] como mostrado no arquivo em anexo.
KERPLUNK 02/10/2013 17:01:55
#429511
Citação:

:
Alguem pode me ajudar??
Eu não sei quase nada sobre VBA mas eu gostaria de fazer um formulário com 4 campos para digitar mas que eles só habilitem se for clicado no botão de opção [Ô]sim[Ô] como mostrado no arquivo em anexo.


Crie um tópico a parte pare isso...
AUGUSTOGODO 03/10/2013 15:47:17
#429537
Hahahaha eu não soube abrir um eu improvisei mal
FFCOUTO 10/10/2013 10:41:55
#429817
Estou numa situação que não consigo enxergar uma solução razoável.

Veja o meu cenário:
Minhas entidades são: Planet, Star, Sun, Moon e Object. Cada uma delas possuem suas próprias características, contudo, todas são do mesmo tipo SkyObject. O único atributo em comum é o Nome e também o método CarregarImagem.

Mas preciso fazer uma lista onde eu possa adicionar cada entidade e depois exibir seus atributos independente do tipo que é. Sei que tenho de usar poliformismo e talvez o uso de interface. Mas não tenho a mínima idéia de como relacionar isso.

O meu resultado final tem de certo algo do tipo:

List<SkyObject> o = new List<SkyObject>();

o.Add(new Planet());
o.Add(new Star());
o.Add(new Sun());
o.Add(new Moon());
o.Add(new Object([Ô]galaxy[Ô]));

foreach (ISkyObject p in o)
{
// para Planet listar todos os atributos
// e para os outros objetos a mesma situação
}


O que não quero é ter de ficar fazendo cast para cada tipo, preciso de algo dinâmico.

Espero que tenham entendido o que preciso.

Grato pela ajuda.


KERPLUNK 10/10/2013 17:59:49
#429860
FFCOUTO,

Nesse caso, eu usaria uma propriedade especificando o tipo de objeto e não um tipo específico. Se precisar que seja um tipo específico, você terá que usar List<object>, pois List<T> é que nem highlander, só pode haver um tipo.
FFCOUTO 16/10/2013 10:31:05
#430068
Kerplunk,

Transformei a interface SkyObject para uma classe abstrata possuindo apenas os atributos em comuns as outras entidades. Para usar o List fiz dessa forma List<SkyObject>. Como todas as classes filhas herdam dessa classe passou numa boa e dessa forma posso usar o .GetType() num foreach para mostrar os atributos.

Aproveitando o post, consegui resolver também a lentidão ao usar o Reflection para listar um volume grande de dados, ficou excelente o desempenho. Naquele seu exemplo, basta adicionar o método abaixo.

public virtual List<T> ToEntityList(IDataReader dr)
{
Type entityType = typeof(T);
List<T> entitys = new List<T>();
Hashtable hashtable = new Hashtable();
PropertyInfo[] properties = entityType.GetProperties();
List<Field> fields = GetFields();

foreach (PropertyInfo info in properties)
{
Field field = null;
field = (Field)info.GetCustomAttributes(true).ToList().FirstOrDefault(a => a.GetType() == typeof(Field));

if (field != null)
hashtable[field.TableFieldName.ToLower()] = info;
}

while (dr.Read())
{
T newObject = new T();

try
{
for (int index = 0; index < fields.Count; index++)
{
Field field = fields[index];
PropertyInfo info = (PropertyInfo)hashtable[field.TableFieldName.ToLower()];
object valor = dr.GetValue(dr.GetOrdinal(field.TableFieldName));

if (field.TableFieldName != [Ô][Ô] && info.CanWrite)
{
if (valor == DBNull.Value || valor == null)
info.SetValue(newObject, null, null);
else
info.SetValue(newObject, valor, null);
}
}

entitys.Add(newObject);
}
catch (Exception ex)
{
System.Diagnostics.Debug.Write(ex.Message);
}
}

dr.Close();
return entitys;
}


Abraços,

KERPLUNK 16/10/2013 12:39:08
#430073
FFCOUTO,

Fico feliz em poder ter ajudado. Agora é hora de aprimorar isso, colocando na classe base(a que contém os métodos genéricos como o [Ô]ToEntityList[Ô]) também os métodos para inserção, deleção e atualização. Também aconselhável, métodos genéricos para serializar/desserializar os objetos herdados, isso é uma mão na roda para log e debug. Outra funcionalidade interessante, é colocar [Ô]nomes de exibição[Ô] para cada campo, buscando esse valor de uma outra classe ou mesmo do banco, usando as decorações de propriedade. Isso padronizaria a visualização dos dados e poderia até mesmo ser usado para relatórios. Ou seja, você teria os nomes usados para cada campo e cada tabela em um local diferente, editável sem precisar de compilação e podendo até mesmo ser usado com nomenclaturas diferentes para cada cliente. Cliente XXX chama o campo [Ô]Descrição[Ô] de [Ô]Nome da peça[Ô] mas cliente YYY chama de [Ô]Descrição produto[Ô], por exemplo. Tem muita coisa que pode ser feita com isso, bastando usar a criatividade.
Outra coisa interessante, é deixar o acesso aos dados ainda mais genérico usando as interfaces de leitura do mesmo modo como está usando, dessa forma, tornando seu sistema multi-banco, ou seja, tanto faz usar oracle, sql server, mysql, ou qualquer outro, o seu sistema está pronto para usar qualquer um deles, desde que a estrutura seja a mesma, não terá problema algum.
Implementação de log genérico também é um plus que você pode implementar, depois que fizer os métodos genéricos de CRUD, dispensando assim qualquer outra maneira de logar alterações, inclusive logando os dados utilizados em formato XML, usando também as funções genéricas de serialização, tendo com isso uma base de auditoria bem consistente e confiável
FFCOUTO 16/10/2013 15:15:49
#430088
Kerplunk,

Eu é que tenho a agradecer a sua colaboração neste tópico. Se não for abusar da tua vontade, poderia me ajudar num outro tópico que postei aqui sobre a conversão de um componente feito em VB6 para .NET (até te enviei uma MP), não faço idéia de como fazer.

Sobre o uso do CRUD esse eu já fiz, e inclusive criei um método para fazer pesquisas .

Serializar/desserializar XML ainda não usei e as dúvidas são todas. Tem algum exemplo de uso, facilitaria o raciocínio.

é possível usar as decorações vindas de um arquivo, podendo assim utilizar multi-idiomas? Como fazer?

Em tempo, as interfaces eu ainda tenho de aprimorar o conceito, que realmente pra quem é iniciante, é um tanto complicado. Tem algum material que possa indicar.

E usando tudo isso para o log de acessos, como implementar essa auditoria nas rotinas mais importantes como exclusão de registro. Aqui a coisa complicou.

Novamente, agradeço pela ajuda.

Abraços,

P.S.: Assim que terminar essa classe vou postar o código completo aqui, assim você poderia dar uma olhada e todos poderiam usufruir dos conceitos.

FFCOUTO 21/11/2013 08:58:08
#431321
Bom dia amigos,

Após esse tempo, estive estudando os conceitos SOLID para implementar no meu sistema de modo a simplificar as manutenções e implementações futuras.

No entanto, estou com certa dificuldade em por isso em prática. Todos os exemplos que pesquisei não foram suficientes para clarear as minhas idéias.

Como ficaria na prática o uso para um simples cadastro de clientes? A minha dúvida maior reside no transporte entre as camadas e o acesso ao banco usando esses paradigmas.

Grato pela ajuda.
Página 12 de 14 [136 registro(s)]
Faça seu login para responder