Como encontrar classes e atributos para o sistema?

7 respostas
poophp
G

Pessoal estou aprendendo a programar orientado a objetos, mas estou com o seguinte problema… Não consigo pensar em que classes e atributos meu sistema vai ter.

Tentei fazer um esquema para tentar achar as classes, métodos e atributos, mas não sei se este jeito está certo…

ps:Tentei imaginar que os atributos são dados que vão ser registrados no banco de dados.

1.Elaborar um layout do sistema.

2.Encontrar campos no layout que irão ser enviados para o banco de dados.(Aqui eu supostamente acharia os atributos)

3.Determinar a quem os atributos estão se referindo.(Assim posso achar as classes)

4.Encontrar as funções do sistema que estão expostas no layout e relacionar as classes encontradas

Bem estou fazendo isso, mas tenho quase certeza que não é o jeito certo, gostaria da ajuda de vocês para poder me fazer compreender melhor a elaboração de um sistema. Obrigado!

7 Respostas

T

Essa é uma etapa de análise e levantamento de requisitos, e é perfeitamente normal ficar em dúvida, ainda mais sendo iniciante.

Ponto importante: o layout do sistema deve ser a sua última preocupação. Defina primeiro atributos e classes.

Se a sua modelagem está sendo para um processo que já existe (por exemplo, uma empresa real), isso fica bem mais fácil, pois você pode ser basear no sistema atual ou mesmo em planilhas e em outras anotações que a empresa tenha. Se não, você pode tentar se basear no que encontra no Google para ter uma ideia do que precisa.

A modelagem básica pode seguir uma sequência como:

  • defina as informações que precisam ser mantidas (datas, endereços, nº da OS, valor, etc). Essas são grandes candidatas à serem atributos das classes;
  • defina como esse atributos se relacionam entre si. Esses relacionamentos podem indicar as classes necessárias;
  • defina o que precisa ou pode ser separado em mais classes. Por exemplo, se os clientes são repetidos entre ordens de serviço, uma classe de cliente como atributo da OS pode ser mais interessante do que ter cada um dos dados do cliente dentro de cada OS;
  • defina o que se repete dentro do contexto da OS. Por exemplo, uma OS pode ter um conjunto de serviços realizados, cada um com preço individual. Esse é um candidato a ser uma classe como “serviços da OS”.
  • faça um rascunho da interface (em um programa como o Pencil) para ter uma ideia de como ficariam as informações na tela, com base nas classes que você criou. Apresente ao seu cliente, se tiver um, para colher as opiniões dele a respeito e discutir particularidades;
  • repita do começo, refinando e ajustando conforme necessário

Só aí você, com as classes razoavelmente bem modeladas e coerentes, é que você pode fazer um protótipo funcional (permite inserir a OS, mas não grava no banco, por exemplo), para ver se é isso mesmo e apresentar ao cliente.

Abraço.

G

Obrigado, agora entendi perfeitamente!

D

Esse programa de prototipação de interface (ou seus concorrerntes) são mais rápidos e práticos para criar os protótipos da interface que fazê-los no Scene Builder do JavaFX ou no GUI Builder do Netbeans? É que eu sei que se fizer no Scene/GUI Builder você já poderá transformar na GUI final do projeto depois, mas não tenho familiaridade com essas ferramentas para saber qual seria melhor para prototipação da interface.

O

Eu prefiro outra abordagem:

  • escreva um teste para a funcionalidade desejada.

  • execute o teste e veja onde o mesmo falha.

  • corrija seu código conforme as necessidades DO TESTE.

  • refatore seu código e execute novamente o teste.

  • corrija em caso de falha ou crie um novo teste em caso de sucesso.

  • repita este processo até passar em todos os testes e até que não hajam mais pontos do código sem cobertura de testes.

D

Eu acredito que elaborar os Protótipos da Interface de Usuário (também chamados de mockups ou esquemas) seja algo muito interessante de se fazer antes mesmo de começar a codificar ou fazer o design de classes; porque os esquemas são uma forma muito fácil e rápida de idealizar todo o funcionamento do software e de verificar se ele atenderá ao seu cliente, é fácil mudá-los e eles podem ser feitos sem que código (que é mais difícil de mudar) tenha que ser implementado.

Os Esquemas são praticamente uma especificação bem detalhada dos Requisitos, você pode usá-los para se guiar ao definir a Arquitetura do Sistema (design de classes, pacotes/módulos, etc.) e ao codificar, pois você sabe que precisa simplesmente criar um Software que faça o que está nos Esquemas.

Esquemas também facilitam encontrar divergências nos Requisitos (requisitos conflitantes, sendo logicamente impossível atender a todos eles pois atender a um faz com que outro seja violado), que precisarão ser resolvidas antes de continuar.

Ao meu ver, é bem melhor esquematizar as telas do software antes de começar a criar classes.

Mas esquemas de GUI só são realmente úteis nos softwares baseados em GUI que simplesmente respondem ao que o usuário faz nela (a maioria dos softwares de gestão é assim); os esquemas de GUI não serão muito úteis em softwares que tem poucas Telas (ou nenhuma) mas fazem muita coisa (por exemplo, um software que Comprimi arquivos pode ter uma única Tela e um monte de código Complexo para fazer a melhor e mais rápida Compressão possível).

Você terá dificuldade em fazer os esquemas se não tiver noção dos Requisitos a serem atendidos, por isso, antes de fazer os esquemas pode ser necessário levantar os Requisitos em Alto Nível, com User Stories, diagramas de Caso de Uso, ou documentos de Texto que expliquem o que o Software precisa fazer. Esses Requisitos descritos em Texto (e possivelmente em tópicos e subtópicos) irão lhe guiar na criação dos esquemas de GUI, e, os esquemas de GUI (que poderão ser uma versão mais especificada dos mesmos Requisitos) poderão lhe guiar na Arquitetura do Software (Classes, Atributos, Métodos, Pacotes, etc.) e até na Modelagem do Banco de Dados.

Agora, sobre modelar a Arquitetura em O.O., você precisa tomar cuidados extras que não aparecem na esquematização e no levantamento de Requisitos em geral; você precisa verificar se sua Arquitetura será fácil de alterar e de crescer (estender), se é fácil de entendê-la, se é fácil e seguro de trabalhar com ela. Você pode estudar os príncipios SOLID, DRY, Programação para Interface, Injeção de Dependência, conhecer os Bad Smells, conhecer técnicas de Refatoração, Padrões de Projeto, TDD, etc., tudo isso existe pra te ajudar a entender como fazer uma Arquitetura que seja mais fácil de alterar depois e que seja capaz de crescer de forma sustentável e segura.

Uma Arquitetura ruim vai mostrar seus problemas ao crescer ou quando se tentar alterá-la, vai ser fácil surgirem Bugs (pois ela não é segura, pois não é seguro fazê-la crescer), vai ser fácil que coisas que funcionavam parem de funcionar (também por não ser segura, ou seja, não é seguro alterá-la), quando você visitar os códigos já feitos nem mesmo você terá a mínima ideia do que eles fazem e como fazem (códigos não claros em sua intenção, nomes ruins, métodos e classes fazendo muita coisa, um monte de ifs/loops aninhados, muito código num mesmo método/classe, falta de documentação, etc.), ficará cada vez mais difícil fazê-la crescer (adicionar uma coisa nova exige editar códigos em vários locais diferentes, que funcionavam antes de serem editados mas você não sabe se continuaram funcionando depois de serem editados, além do mais, se você esquecer de editar em um desses locais terá Bugs), e será mais fácil fazer o Software crescer criando gambiarras que só vão te trazer mais problemas como esses do que fazê-lo crescer simplesmente adicionando novas classes através de um Padrão bem estabelecido, que é claro e seguro.

Com uma boa Arquitetura, as coisas estarão bem organizadas, será fácil entender como as elas funcionam, será mais fácil alterar e estender o Software (o ideal é que você pudesse estender apenas adicionando Classes, e, talvez, tendo uma Classe “sempre aberta para edição” para instanciar e montar [popular] os Objetos, que te permitiria instanciar as novas Classes ou usar as Novas Classes no lugar das Antigas [afim de mudar comportamentos]). Com Testes automatizados, Interfaces que limitam o acesso somente ao necessário, e encapsulamento você conseguirá tornar o Software mais seguro contra Bugs, porque dificultará (ou impedirá) que sejam feitas gambiarras que iriam comprometer o Padrão que você criou para o crescimento do Software.

Mas dê enfase em manter o princípio DRY, procure mantê-lo na Documentação, na Arquitetura, e no Código dentro das Classes. Ficar violando esse princípio vai tornar seu Projeto extremamente inseguro (em relação a bugs e inconsistências) e difícil de crescer e de alterar.

T

Não diria mais rápidos (nem mais lentos), mas que atendem propósitos diferentes. Para interfaces simples, talvez não compense o retrabalho de fazer em duas ferramentas diferentes. Mas para algo mais complexo, pode ser útil ter um protótipo que pareça um rascunho a fim de discutir com o cliente e com os gestores (pessoas não técnicas) o layout e a funcionalidade sem precisar entrar muito na implementação.

Outro ponto importante (e que já me deparei mais de uma vez) é que os usuários tendem a ver uma tela pronta como um sistema pronto, o que pode te deixar em uma situação desconfortável numa apresentação. Se você apresenta uma tela completa, com botões, labels e tudo o mais, quem vê pode deduzir que já está tudo feito e funcionando, o que nem sempre é o caso. Usando ferramentas como essa, é possível apresentar a interface e o layout diminuindo esse problema.

TDD for the win! :grin:

Entendo os pontos que vocês (@Douglas-Silva e @orlandocn ) estão levantando e concordo, porém acredito que vocês estão levando o assunto um pouco além do necessário para esse tópico. O @George_Alexandre , pelo que entendi, está em dúvida quanto ao básico do sistema e de OO, e não está claro qual o nível de experiência dele em engenharia de software. Falar em TDD/cobertura de testes, SOLID, DRY e etc quando ele não pegou ainda o jeito de saber que informações (atributos) o sistema que ele quer construir necessita é ir muito além do que ele precisa no momento.

Abraços.

G

Obrigado mesmo pela ajuda pessoal, como o @TerraSkilll comentou, eu estou ainda entendendo na pratica as funcionalidades da POO. Eu realmente ainda tenho dificuldades em encontrar as classes e atributos do meu sistema, consegui me sentir um pouco mais confortavel tentando elaborar um esboço de como eu imagino um sistema que eu queria desenvolver e então com os campos que estao neste esboço eu consigo elaborar algumas classes e atributos necessarios. Bem, vou tentar analisar bem todos os comentarios para poder entender melhor a orientação a objetos na prática!

Muito obrigado!

Criado 19 de junho de 2017
Ultima resposta 20 de jun. de 2017
Respostas 7
Participantes 4