Classes abstrata x interface

Parte I
Gostaria de uma opinião sobre uma modelagem:

Eu tenho uma classe item abstrata associada com uma classe fornecedor abstrata tb (um fornecedor tem n itens).

Item poderá ser algo como artigo, palestra, livros, vídeos, eventos, etc. Imaginei criar uma classe concreta para cada um desses tipos de item.

Mas entre esses itens existem comportamentos similares, gostaria de saber se aí se aplicaria interfaces. Por exemplo: poderia ter as interfaces PodeSerAgendado, PodeSerComentado, PodeSerComprado, aí teria Palestra, Artigo implementando PodeSerComentado. Livro implementa PodeSerComentado, PodeSerComentado e assim por diante, esse raciocínio está certo?

Alguns autores normalmente defendem o uso de um adjetivo terminado em “ável” para o nome dessas interfaces: Agendavel, Comentavel, Compravel (em inglês, que é de onde veio essa nomenclatura, usa-se “able”, como “Schedulable”, “Commentable”, “Buyable” - embora algumas dessas palavras, como você deve saber, não existam em inglês e/ou português).

Me parece correto. O problema é que se você precisar adicionar um novo tipo de Item, terá de criar uma classe nova. Ai será uma questão de modelagem do seu sistema, se ele vai se basear nos tipos ou em meta-tipos.

Também acho q fica melhor na maioria dos casos, o problema sempre são aqueles nomes que ficam muito esquisitos, como por exemplo PodeReceberInscricao que ficaria estranho, rs :wink: .

Nesse caso existe a possibilidade de novas classes virem a ser implementadas, é uma possibilidade bem real e na verdade a idéia dessa abordagem é facilitar esse processo.

Daniel, se eu entendi meta-tipo significaria que eu poderia criar um novo item, sem precisar criar uma nova classe, só defindo as propriedades, seria isso? (vc tem alguma referencia sobre isso, pois se for o que eu estou pensando tenho uma outra situação que seria bem vindo).

Isso mesmo. Usar meta-tipo e meta-dados, ao invés dos tipos e dados.
É como os sistemas de e-commerce são implementados, para suportar infinitos tipos de produtos.

Em vez de você ter itens como:

CD

  • Artista
  • Faixas
  • Valor

Livro

  • Autor
  • Titulo
  • Valor

DVD

  • Artista
  • Faixas
  • Valor

Você teria algo como:

Produto (1) —> (n) Propriedades

Sacou?

[quote=danieldestro]Isso mesmo. Usar meta-tipo e meta-dados, ao invés dos tipos e dados.
É como os sistemas de e-commerce são implementados, para suportar infinitos tipos de produtos.
Sacou?[/quote]

Sim, bem o q eu tinha imaginado!
Só uma dúvida, ou duas, nessa abordagem:

Tenho ali o Produto com n Propriedades, e o conceito de meta-dados, todo implementado, mas um determinado produto eu preciso fazer um tratamento especial por algum motivo, por exemplo prazo de validade. Seria o caso de usar desse jeito mesmo, ou extender uma classe, sei lá um exemplo Iogurte que extende de Produto só para tratar esse comportamento específico (validade)?

Resumindo, se vale a pena misturar as duas abordagens, no caso de existirem vários tipos de Produtos, com várias Propriedade (melhor usar meta-dados) e com alguns deles tendo um comportamento específico que tem de ser analisado (melhor usar classes específicas).

Bom, você pode ter Tipos de Propriedades, e a partir delas vc sabe como tratar aquela Propriedade específica do Produto.

Produto — Propriedade — TipoPropriedade

Basicamente é isso…

BTW, tem um pessoal muito bom em Illinois que pesquisou meta-modelos e afins no final dos anos 90:

http://www.adaptiveobjectmodel.com

Eu aprendi (e ainda estou aprendendo) bastante com o trabalho desse pessoal.

Abraços,

[quote=Edufa]como por exemplo PodeReceberInscricao que ficaria estranho, rs :wink: .
[/quote]

Inscrevível? :stuck_out_tongue:

[quote=pcalcado][quote=Edufa]como por exemplo PodeReceberInscricao que ficaria estranho, rs :wink: .
[/quote]

Inscrevível? :stuck_out_tongue: [/quote]

A palavra em português para “pode ser inscrito” é “inscritível”.
(Se você procurar por essa palavra no Google vai receber um monte de páginas de matemática - polígonos ou poliedros “inscritíveis”)

Uau, guj é cultura.

PodeSerInscrito ainda parece mais fácil de entender, mas realmente inscritível seria o mais correto.

Só para deixar claro os significados (Michaelis):

ins.cri.tí.vel adj (lat inscriptibile)
Que pode inscrever-se ou ser inscrito.

ins.cre.ver vtd (lat inscribere)
1 Escrever sobre, gravar, insculpir (inscrição ou letreiro): “Inscrever um epitáfio” (Laud. Freire). Inscrevera um título no alto da página. vtd e vpr 2 Assentar, escrever ou fazer escrever em lista, registro etc.: Inscreveu seu nome na lista de contribuintes. Inscrever-se-ia no abaixo-assinado. vtd 3 > Geom Traçar uma figura dentro de outra: “Inscrever umpentágono na circunferência” (Morais). vpr 4 Matricular-se: Inscreva-se na classe de doutrina social da Igreja. Inscreveu-se aluno. vtd 5 Assinalar, registrar, perpetuar: Inscrevera o nome na História.