Numeração de estrutura de especialização/generalização

7 respostas
Marcelo_Magalhaes

Caros amigos,

Estou desenvolvendo um sistema contábil e tenho uma estrutura de classe (especialização/generalização) que representa um planos de contas, por exemplo, no nível mais alto tenho CONTA depois duas especializações RESULTADO e PATRIMONIAL em RESULTADO  mais duas especializações DESPESA e RECEITA, etc. Esta estrutura tende a ficar maior. Por definição somente as "folhas" desta estrutura irão possuir instâncias (objetos), sendo assim todas as generalização de uma especialização serão abstratas.

 Neste cenário quero numerar os níveis e a folhas terão numeração composta dos seus níveis superiores + sequencial. Por exemplo.

CONTA = 1
RESULTADO = 1
PATRIMONIAL = 2
DESPESA = 1
RECEITA = 2

Um objeto do tipo DESPESA teria o seguinte numero: 1.1.1.seq. (CONTA.REULTADO.DESPESA.sequencial). Para o armazenamento penso ou retirar os pontos e usar este idenficador (que é unico, por definição contábil) como sendo a PK da tabela. Para isso terei de fixar a quantidade de dígitos em cada nível para que na retirada ou remontagem do número fique correto. Por exemplo no caso acima (com somoente 1 digito por nível), teria 1.1.1.1 na camade de negócio e no banco 1111, ou sjea, é bem fácil mudar de um para outro.

 A minha dúvida, na verdade é um pedido de sugestões, é como implementar isso. Pensei em criar um atributo estático de instância em cada classe que representa ser numero e na hora da construção de um objeto ir varendo esta numeração (pra cima) e montando o número do objeto. Por exemplo, ao instanciar um objeto A do tipo DESPESA o construtor de A iria pesquisar a numeração de seus "pais" e montaria o seu identificador 1.1.1.1 (os três primeiros dígitos são fixos, advindo do ramo que vai da folha a raiz e o quarto dígito é um sequencial do objeto).

 Alguém ai tem alguma sugestão?

Abraços.

7 Respostas

sergiotaborda

essa estrutura vai durar dois dias… Não use herança para representar todos os itens do seu sistema, o que vc está fazendo é equivalente a criar uma classe Cliente e uma classe para cada cliente. Isso não é um bom modelo.

Crie apenas Conta. Faça uma conta ter uma estrutura de arvore. Ela tem uma conta pai e tem n contas filhas.
E pronto. Se vc quiser muito mesmo classificar as contas crie uma classe TipoConta e faça cada conta ter um tipo.

Marcelo_Magalhaes

sergiotaborda:
essa estrutura vai durar dois dias… Não use herança para representar todos os itens do seu sistema, o que vc está fazendo é equivalente a criar uma classe Cliente e uma classe para cada cliente. Isso não é um bom modelo.

Crie apenas Conta. Faça uma conta ter uma estrutura de arvore. Ela tem uma conta pai e tem n contas filhas.
E pronto. Se vc quiser muito mesmo classificar as contas crie uma classe TipoConta e faça cada conta ter um tipo.

Não entendi pq vai durar dois dias??? Não acredito que a melhor saida seja colocar tudo em uma só classe. Cada tipo de conta de caracteríticas e comportamento diferenciado, ou seja, são vistos como objetos de negócio diferentes entre si.

E outra, não estou criando uma classe para cada objeto, como você ilustrou no caso do cliente. O que estou fazendo e orientação a objetos.

Sendo assim continuo aberto a sugestões.

Abraços a todos.

wolmirGarbin

Opa!
Cara isso é bem complicado para se trabalhar!
A minha sugestão é:
Trabalhe em uma logica que vc considerar mais facil mas deve se tomar cuidados como por exe:
Se o sistema começar a crescer sua logica vai saciar sua necessidade?
Trabalhe com essas questões, analise se é viavél, acredito que es um bom programador para estar desenvolvendo um sistema deste nivél.
Valeu!

sergiotaborda

Marcelo Magalh?s:
sergiotaborda:
essa estrutura vai durar dois dias… Não use herança para representar todos os itens do seu sistema, o que vc está fazendo é equivalente a criar uma classe Cliente e uma classe para cada cliente. Isso não é um bom modelo.

Crie apenas Conta. Faça uma conta ter uma estrutura de arvore. Ela tem uma conta pai e tem n contas filhas.
E pronto. Se vc quiser muito mesmo classificar as contas crie uma classe TipoConta e faça cada conta ter um tipo.

Não entendi pq vai durar dois dias??? Não acredito que a melhor saida seja colocar tudo em uma só classe. Cada tipo de conta de caracteríticas e comportamento diferenciado, ou seja, são vistos como objetos de negócio diferentes entre si.

Leia a sua frase. Vc mesmo já respondeu. “Cada tipo de conta”. A diferenciação do comportamento é pelo tipo da conta. Isto é o caso classico do padrão Strategy. A conta é apenas uma, mas conforme o tipo ela contém estratégias diferentes que para as mesmas operações retornam valores calculados de formas diferentes.

Tem a certeza ? Quantas contas Património vc terá ? Quantas contas Despesa e Receita terá ?

Lembre-se que num sistema contábil a definição das contas depende do contador e existem várias escolas. Engessar os tipos usados por uma escola não lhe trará beneficio.

Num sistema contábil vc quer poder atribuir eventos a contas, e estabelecer contas agregadoras como (Despesa e Receita). O modelo de Conta Contábil é por natureza em formato de arvore com uma certa recursividade agregadora.

Repare que o modelo em arvore resolve facilmente o problema na numeração. Contas sem pai são o primeiro nivel( numeradas 1, 2, 3…) , contas com um pai têm o numero do pai, mais o numero delas (1.1, 2.1 , 2.3… ). Contas netas têm o numero do avo seguindo pelo do pai e depois os delas ( 1.2.1, 3.1.2,…). É um mecanismo recursivo.

Marcelo_Magalhaes

Caro sergiotaborda,

Inúmeras com certeza. Acredito que não tenha entendido o problema, por exemplo, eu vou para as especializações na conta DESPESA, dai pra frente usarei um classificador para discriminar os diversos tipos de despesas (luz, gás, telefone, etc…). Nãou vou criar uma classe LUZ ou GAS, até poderia visto que isso é um modelo do negócio, na implementação criaria um classificador, caso fosse o certo.

A estrutura básica que estou montando é 99,9% usada e ensianda no mercado. Como não vou modelar os tiops de despesas ou receitas ou quaisquer outros o usuário é quem criará as contas dentro desta estrutura.

Não concordo com esta cituação de recursividade agregadora. Um planos de contas é uma estrutara hieráquica top-down, você não pode junto em um gupo qualquer uma conta despesa e uma conta receita, isso seria possível quando você diz que esta estrutura em árvore tem uma certa recursividade agregadora.

É exatamente isso que eu coloquei no meu exemplo. O que quero é uma sugestão de como implementar isso.

Abraços.

mario.fts

Eu concordo com o Sérgio nesse ponto. Se o contador quiser mudar o plano de contas, e as contas tiverem seu tipo definido hierarquicamente no código, usando herança, isto não será possivel.

vou tentar dar um exemplo

1 ATIVO
1.1 ATIVO CIRCULANTE
1.1.1 Caixa
1.1.1.01 Caixa Geral

2 PASSIVO
2.1 CIRCULANTE
2.1.1 Impostos e Contribuições a Recolher
2.1.1.01 Simples a Recolher

3 CUSTOS E DESPESAS
3.1 Custos dos Produtos Vendidos
3.1.1 Custos dos Materiais
3.1.1.01 Custos dos Materiais Aplicados
3.1.2 Custos da Mão-de-Obra
3.1.2.01 Salários

4 RECEITAS
4.1 Receita Líquida
4.1.1 Receita Bruta de Vendas
4.1.1.01 De Mercadorias
4.1.1.02 De Produtos

e por ai vai.

Nesse caso, vc criaria a Conta, ContaAtivo, ContaPassivo, ContaDespesas e ContaReceitas. e um monte de subclasses para os tipos mais especificos (ReceitaBruta, Circulante, etc).

e se o contatos chegar e falar

-preciso criar um novo tipo de conta, a 5.0, VARIAÇÕES PASSIVAS e a 6.0, VARIAÇÕES ATIVAS.

O que q vc vai fazer? abrir o código e criar esses novos tipos de classe?

Pelo menos foi isso q eu entendi. e por isso não daria certo. A sua implementação deve ser mais genérica a ponto de permitir mudanças no plano de contas, sem impactos ou necessidades de mudanças no sistema.

Se eu tiver entendido errado, posta ai sua solução, talvez seja apenas um problema de comunicação.

Marcelo_Magalhaes

Caros amigos,

Depois de um tempo estou retomando este assunto. Pelo que percebi acredito que me entenderam mal. Na nossa contabilidade somente existem dois tipos de conta, as contas patrimoniais e as contas de resultado. Todas as outras contras derivam de um destes dois tipos. O seu plano de contas Mario, todas estas contas ou são contas de patrimonio ou de resultado e é neste aspecto que estava falando no meu post inicial.

 Sendo assim, com estes dois tipos de conta, as outras contas serão criadas como sendo do tipo patrimonial ou de resultado, o problema é que muitas vezes nós criamos níveis de hierarquia no plano de contas, conforme seu exemplo Mario. Este nível é numerado da forma já explicada. Neste caso o que estou planejando é um padrão composite para cada um destes dois tipos e ambos os tipos herdariam de uma classe mais genérica possível somente por questões da associação com os lançamentos e de atributos que possam vir a ser comuns. O que vocês acham?

 E ainda como fazer esta numeração estruturada?

Abraços.

Criado 1 de março de 2010
Ultima resposta 13 de abr. de 2010
Respostas 7
Participantes 4