20 de novembro de 2017


Nessa sequência de posts sobre boas práticas em programação modular, vimos uma série de recomendações para desenvolver códigos de programação de forma coerente com o intuito de alcançar organização, eficiência e manutenibilidade. Após estudar a programação modular, princípios, estilos e formas de refatorar, é possível criar uma espécie de checklist para descrever resumidamente o que não pode ser esquecido para se programar de forma modular e aplicar boas práticas de programação.

Os principais conceitos vistos até aqui se provaram necessários para a programação com o uso de boas práticas. Baseando-se em todos esses conceitos conheça os 21 mandamentos utilizados para aplicar boas práticas na programação modular em Java:

1.    Procure realizar o desenvolvimento com um alto grau de encapsulação e restrição ao acesso.
2.    Um módulo deve possuir baixo grau de acoplamento com outros módulos.
3.    Um módulo deve possuir alta coesão entre seus componentes internos.
4.    Utilize composição e herança de forma adequada para respeitar o Princípio da Escolha: Composição x Herança.
5.    Prefira programar para uma interface em vez de programar para uma implementação para respeitar o Princípio da Programação para a Interface.
6.    Ao construir uma classe garanta que ela será utilizada para um único objetivo para respeitar o Princípio da Responsabilidade Única.
7.    Construa módulos abertos para extensão e fechados para modificação para respeitar o Princípio do Aberto/Fechado.
8.    Na implementação de reúso, garanta que o código cliente cumpra o contrato de implementação para respeitar o Princípio da Substituição de Liskov.
9.    Prefira implementar interfaces específicas em vez de uma única interface geral para respeitar o Princípio da Segregação de Interfaces.
10.    Tenha cuidado para que módulos de alto nível não dependam de módulos de baixo nível para respeitar o Princípio da Inversão da Dependência. Os módulos devem depender de abstrações.
11.    Tenha cuidado com a existência de efeito colateral em uma função que possa prejudicar o raciocínio equacional.
12.    Em caso de operações mais complexas, é interessante implementar objetos como máquinas de estado.
13.    Escolha as abstrações corretas para construir um módulo ou um conjunto de módulos.
14.    Mantenha a consistência de estados e interfaces.
15.    Utilize o polimorfismo de forma correta cumprindo o contrato de implementação e tratando os campos de forma consistente - Uso de Polimorfismo de Inclusão.
16.    Nomeie de acordo com a convenção de nomes utilizada os atributos, métodos, classes e demais itens do código.
17.    Mantenha o código sempre organizado e corretamente endentado.
18.    Comente as partes mais complexas do código e obedeça aos critérios utilizados para comentar.
19.    Reduza ao máximo possível o escopo de variáveis utilizadas somente em pequenas partes do código.
20.    Estruture corretamente os laços de repetição.
21.    Verifique sempre durante ou após o desenvolvimento de um módulo se a ele é aplicável alguma atividade de refatoração necessária.



Referências:



ALMEIDA, H.M. Interface vs. Implementação Herança vs. Composição. Disponível em: <http://www2.lsd.ufcg.edu.br/~nazareno/ensino/si1/06.InterfacePolimorfismoHerancaComposicao.pdf> Acesso em: 01 nov. 2015.

BIGONHA, R.S.; BIGONHA, M. Programação Modular. Notas de Aula – DCC UFMG. Belo Horizonte: 2015.

BUSCHMANN, F. et al. Pattern-Oriented Software Architecture: A System of Patterns. 1. ed. New Jersey: John Wiley & Sons, 1996.

CADU. Entendendo Coesão e Acoplamento. Disponível em: <http://www.devmedia.com.br/entendendo-coesao-e-acoplamento/18538> Acesso em: 17 out. 2015.

CADU. Open Close Principle. Disponível em: < http://www.devmedia.com.br/open-close-principle/18970> Acesso em: 17 out. 2015.

CARDELLI, L.; WEGNER, P. On understanding types, data abstractions and
polimorphism
, ACM Computing Surveys, 17, 451-522. 1985. Disponível em
< http://lucacardelli.name/papers/onunderstanding.a4.pdf>. Acesso em: 24 jan.2016.

CARGILL, T. C++ Programming Style, Reading. 1. ed. Reading, MA: Addison-Welsey, 1992.

CASTILHO, R. Princípios SOLID: Princípio da Inversão de Dependência (DIP), 2013. Disponível em: <http://robsoncastilho.com.br/2013/05/01/principios-solid-principio-da-inversao-de-dependencia-dip/> Acesso em: 18 out. 2015.

CHAIM, M.L. Refatoração de Software. Disponível em
<http://www.ic.unicamp.br/~eliane/Cursos/Transparencias/Manutencao/Aula25-Refatoring.pdf>. Acesso em: 24 jan.2016.

CHIDAMBER, S. R. and KEMERER, C. F. (1994).  A metrics suite for object oriented design. IEEE Trans. Softw. Eng., 20:476–493.

COAD, P.; MAYFIELD, M.; KERN, J. Java Design: Building Better Apps and Applets. Yourdon Press Computing Series. 2. ed. New Jersey: Prentice Hall, 1999.

DEMARCO, T. Structured Analysis and System Specification. 1. ed. New Jersey: Prentice Hall, 1979.

FERREIRA, K.A.M. et al. Métricas de Coesão de Responsabilidade: A Utilidade de Métrica de Coesão na Identificação de Classes com Problemas Estruturais. Disponível em: <http://www.lbd.dcc.ufmg.br/colecoes/sbqs/2011/SBQS2011-TT01_82947_1.pdf> Acesso em: 01 fev. 2015.

FIGUEIREDO, E. Idiomas de Programação. Disponível em
<http://homepages.dcc.ufmg.br/~figueiredo/disciplinas/aulas/idiomas-java_v02.pdf>. Acesso em 20 set 2015.

FIGUEIREDO, E. Metrics for Object-Oriented Programs. Disponível em
< http://homepages.dcc.ufmg.br/~figueiredo/disciplinas/lectures/oo-metrics_v01.pdf>. Acesso em: 15 nov 2015.

FIGUEIREDO, E. Reengenharia, Refatoração e Bad Smell. Disponível em
<http://homepages.dcc.ufmg.br/~figueiredo/disciplinas/aulas/bad-smell-refactoring_v01.pdf>. Acesso em 20 set 2015.

FOWLER, M. Refactoring. Disponível em
< http://refactoring.com/>. Acesso em 05 set 2015.

FOWLER, M. Refactoring: Improving the Design of Existing Code. 1. ed. Boston: Addison- Wesley Professional, 1999.

LEMOS, H.D. Encapsulamento, Polimorfismo, Herança em Java. Disponível em: <http://www.devmedia.com.br/encapsulamento-polimorfismo-heranca-em-java/12991> Acesso em: 17 out. 2015.

LISKOV, B. Data Abstraction and Hierarchy, 1987. Laboratory for Computer Science, Cambridge University, Cambridge, 1987.

MARTIN, R.C.; MARTIN, M. Agile Principles, Patterns, and Practices in C#. 1. ed. New Jersey: Prentice Hall, 2006.

MEDEIROS, H. Herança versus Composição: qual utilizar? Disponível em:
<http://www.devmedia.com.br/heranca-versus-composicao-qual-utilizar/26145>. Acesso em: 17 out. 2015.

MEDINA, R.D. Flash utilizando Orientação a Objetos e a linguagem XML: Capítulo 1 - Introdução a Programação Orientação a Objetos. Disponível em <http://www-usr.inf.ufsm.br/~rose/curso3/cafe/cap1_Introducao.pdf> Acesso em: 17 out. 2015.

MEYER, B. Object-Oriented Software Construction. 2. ed. New Jersey: Prentice Hall, 1997.

MYERS, G. J. Composite/Structured Design. 1. ed. New York: Van Nostrand Reinhold, 1978.

ORACLE. Code Conventions for the Java Programming Language: Contents, 2016. Disponível em: http://www.oracle.com/technetwork/java/codeconvtoc-136057.html>. Acesso em: 23 jan.2016.

SCHACH, S.R. Engenharia de Software: Os Paradigmas Clássico e Orientado a Objetos. 7. ed. São Paulo: McGraw-Hill, 2009.

SOMMERVILLE, I.  Engenharia de Software, 8. ed. Boston: Pearson Education, 2007.

STAA, A.D. Programação Modular: Desenvolvendo Programas Complexos de Forma Organizada e Segura. 1. ed. MA: Rio de Janeiro: Campus, 2000.

STEVENS, W.; MYERS, G.; CONSTANTINE, L. Structured Design. IBM Systems Journal, 13 (2), 115-139, 1974.

Comentários:

Perfil

Formada em Sistemas de Informação e pós-graduada em Engenharia de Software.

Facebook

Views