7.4 Reusabilidade
Como vimos ao longo deste trabalho, nos paradigmas procedimental, funcional e orientado a objetos podemos escrever funções e / ou subrotinas, e por meio dessas encapsular uma determinada ação ou processo do sistema, bastando apenas chamá-la quando necessário; o que nos evita ter de reescrever o código em todos os lugares onde aquela ação se faz presente, aumentando assim altamente a reusabilidade em um projeto de software. Uma vez que já temos várias funções escritas, ainda podemos, a partir dessas, criar bibliotecas de funções, possibilitando assim a reusabilidade de código não apenas em várias partes de um mesmo sistema, mas também entre vários sistemas. No caso do paradigma lógico a ideia de reusabilidade é similar, sendo predicados os correspondentes a funções e criação de um banco de dados a parte com os predicados que serão reutilizáveis, correspondendo às bibliotecas.
O conceito de polimorfismo paramétrico adotado pelos paradigmas funcional e orientado a objeto também colaboram consideravelmente para uma maior reusabilidade durante o desenvolvimento de um projeto, pois é possível definir funções que aceitam mais de um tipo como parâmetro, o que nos permite escrever uma função genérica e usá-la para diversos tipos, ao invés de termos que reescrever o código para todos os tipos necessários.
Ainda no paradigma funcional o conceito de funções como objetos de primeira classe e funções de ordem superior também permitem aumentar em muito a reusabilidade de código, pois graças a essas é possível abstrair sobre ações e definir funções como map e filter, que além de extremamente úteis, permitem ao o programador, por exemplo, definir um filtro genérico e receber a função principal como parâmetro, ao invés de obrigá-lo a implementar uma versão especifica para cada tipo de filtro.
Já no paradigma orientado a objetos, além do polimorfismo, podemos destacar o conceito de herança, que tem como objetivo justamente definir novas classes a partir de outras já implementadas, herdando todas as características (atributos, métodos, formas de construção, etc.) da classe mãe, evitando assim que o programador tenha reescrever toda a estrutura mais genérica para cada nova especialização.