Programação modular - Modular programming

A programação modular é uma técnica de design de software que enfatiza a separação da funcionalidade de um programa em módulos independentes e intercambiáveis , de modo que cada um contenha tudo o que é necessário para executar apenas um aspecto da funcionalidade desejada.

Uma interface de módulo expressa os elementos que são fornecidos e exigidos pelo módulo. Os elementos definidos na interface são detectáveis ​​por outros módulos. A implementação contém o código de trabalho que corresponde aos elementos declarados na interface. A programação modular está intimamente relacionada à programação estruturada e à programação orientada a objetos , todas com o mesmo objetivo de facilitar a construção de grandes programas de software e sistemas por decomposição em partes menores, e todas originadas por volta da década de 1960. Embora o uso histórico desses termos tenha sido inconsistente, "programação modular" agora se refere à decomposição de alto nível do código de um programa inteiro em partes: programação estruturada para o uso de código de baixo nível de fluxo de controle estruturado e objeto programação orientada a dados uso de objetos , uma espécie de estrutura de dados .

Na programação orientada a objetos, o uso de interfaces como um padrão arquitetônico para construir módulos é conhecido como programação baseada em interface .

Terminologia

O termo assembly (como em linguagens .NET como C # , F # ou Visual Basic .NET ) ou pacote (como em Dart , Go ou Java ) às vezes é usado em vez de módulo . Em outras implementações, esses são conceitos distintos; em Python, um pacote é uma coleção de módulos, enquanto em Java 9 foi implementada a introdução do novo conceito de módulo (uma coleção de pacotes com controle de acesso aprimorado).

Além disso, o termo "pacote" tem outros usos em software (por exemplo, pacotes .NET NuGet ). Um componente é um conceito semelhante, mas normalmente se refere a um nível superior; um componente é uma parte de um sistema completo , enquanto um módulo é uma parte de um programa individual. A escala do termo "módulo" varia significativamente entre os idiomas; em Python é uma escala muito pequena e cada arquivo é um módulo, enquanto em Java 9 é planejado para ser em grande escala, onde um módulo é uma coleção de pacotes, que por sua vez são coleções de arquivos.

Outros termos para módulos incluem unidade , usada em dialetos Pascal .

Suporte de linguas

As linguagens que suportam formalmente o conceito de módulo incluem Ada , Algol , BlitzMax , C ++ , C # , Clojure , COBOL , Common_Lisp , D , Dart , eC , Erlang , Elixir , Elm , F , F # , Fortran , Go , Haskell , IBM / 360 Assembler , Control Language (CL), IBM RPG , Java , MATLAB , ML , Modula , Modula-2 , Modula-3 , Morpho, NEWP , Oberon , Oberon-2 , Objective-C , OCaml , vários derivados de Pascal ( Component Pascal , Object Pascal , Turbo Pascal , UCSD Pascal ), Perl , PL / I , PureBasic , Python , R , Ruby , Rust , JavaScript , Visual Basic .NET e WebDNA .

Exemplos conspícuos de linguagens que não têm suporte para módulos são C e foram C ++ e Pascal em sua forma original; C e C ++ , entretanto, permitem compilação separada e interfaces declarativas a serem especificadas usando arquivos de cabeçalho . Módulos foram adicionados ao Objective-C no iOS 7 (2013); para C ++ com C ++ 20 , e Pascal foi substituído por Modula e Oberon, que incluiu módulos desde o início e vários derivados que incluíram módulos. JavaScript tem módulos nativos desde ECMAScript 2015.

A programação modular pode ser realizada mesmo quando a linguagem de programação não possui recursos sintáticos explícitos para oferecer suporte a módulos nomeados, como, por exemplo, em C. Isso é feito usando recursos de linguagem existentes, juntamente com, por exemplo, convenções de codificação , idiomas de programação e o físico estrutura de código. O IBM i também usa módulos ao programar no Integrated Language Environment (ILE).

Aspectos chaves

Com a programação modular, os interesses são separados de forma que os módulos executem funções logicamente discretas, interagindo por meio de interfaces bem definidas. Freqüentemente, os módulos formam um gráfico acíclico direcionado (DAG); neste caso, uma dependência cíclica entre os módulos é vista como uma indicação de que eles devem ser um único módulo. No caso em que os módulos formam um DAG, eles podem ser organizados como uma hierarquia, onde os módulos de nível inferior são independentes, não dependendo de nenhum outro módulo, e os módulos de nível superior dependem dos de nível inferior. Um determinado programa ou biblioteca é um módulo de nível superior de sua própria hierarquia, mas pode, por sua vez, ser visto como um módulo de nível inferior de um programa, biblioteca ou sistema de nível superior.

Ao criar um sistema modular, em vez de criar um aplicativo monolítico (onde o menor componente é o todo), vários módulos menores são escritos separadamente, portanto, quando são compostos juntos, eles constroem o programa de aplicativo executável. Normalmente, eles também são compilados separadamente, por meio de compilação separada , e depois vinculados por um vinculador . Um compilador just-in-time pode executar parte dessa construção "on-the-fly" em tempo de execução .

Essas funções independentes são comumente classificadas como funções de controle de programa ou funções de tarefa específicas. As funções de controle do programa são projetadas para funcionar para um programa. As funções de tarefas específicas são preparadas de perto para serem aplicáveis ​​a vários programas.

Isso torna os sistemas de design modular, se construídos corretamente, muito mais reutilizáveis ​​do que um design monolítico tradicional, uma vez que todos (ou muitos) desses módulos podem ser reutilizados (sem alteração) em outros projetos. Isso também facilita a "divisão" de projetos em vários projetos menores. Teoricamente, um projeto de software modularizado será mais facilmente montado por grandes equipes, uma vez que nenhum membro da equipe está criando o sistema inteiro, ou mesmo precisa saber sobre o sistema como um todo. Eles podem se concentrar apenas na tarefa menor atribuída.

História

A programação modular, na forma de subsistemas (particularmente para E / S) e bibliotecas de software, data dos primeiros sistemas de software, onde era usada para reutilização de código . A programação modular em si, com o objetivo de modularidade, desenvolvida no final dos anos 1960 e 1970, como um análogo em larga escala do conceito de programação estruturada (1960). O termo "programação modular" data pelo menos do Simpósio Nacional de Programação Modular, organizado no Information and Systems Institute em julho de 1968 por Larry Constantine ; outros conceitos-chave foram ocultação de informações (1972) e separação de interesses (SoC, 1974).

Módulos não foram incluídos na especificação original para ALGOL 68 (1968), mas foram incluídos como extensões em implementações anteriores, ALGOL 68-R (1970) e ALGOL 68C (1970), e posteriormente formalizados. Uma das primeiras línguas projetados desde o início para programação modular foi o viveu de curto Modula (1975), por Niklaus Wirth . Outra linguagem modular inicial foi Mesa (1970), da Xerox PARC , e Wirth utilizou Mesa, bem como o Modula original em seu sucessor, Modula-2 (1978), que influenciou linguagens posteriores, particularmente através de seu sucessor, Modula-3 ( 1980). O uso de Modula de nomes qualificados por ponto , como M.apara se referir a objeto ade módulo M, coincide com notação para acessar um campo de um registro (e da mesma forma para atributos ou métodos de objetos), e agora é generalizado, visto em C #, Dart, Go, Java e Python, entre outros. A programação modular se espalhou a partir da década de 1980: a linguagem Pascal original (1970) não incluía módulos, mas versões posteriores, notavelmente UCSD Pascal (1978) e Turbo Pascal (1983) os incluíram na forma de "unidades", assim como o Pascal -influenced Ada (1980). O padrão Extended Pascal ISO 10206: 1990 manteve-se próximo ao Modula2 em seu suporte modular. Standard ML (1984) possui um dos mais completos sistemas de módulos, incluindo functores (módulos parametrizados) para mapeamento entre módulos.

Nas décadas de 1980 e 1990, a programação modular foi ofuscada e frequentemente confundida com a programação orientada a objetos , principalmente devido à popularidade de C ++ e Java. Por exemplo, a família C de línguas tinha suporte para os objectos e as classes em C ++ (originalmente C com classes , 1980) e Objective-C (1983), que suportam apenas módulos de 30 anos ou mais posteriores. Java (1995) oferece suporte a módulos na forma de pacotes, embora a unidade primária de organização do código seja uma classe. No entanto, Python (1991) usou proeminentemente módulos e objetos desde o início, usando módulos como a unidade primária de organização de código e "pacotes" como uma unidade em maior escala; e Perl 5 (1994) inclui suporte para módulos e objetos, com uma vasta gama de módulos disponíveis no CPAN (1993).

A programação modular agora é amplamente difundida e encontrada em praticamente todas as principais linguagens desenvolvidas desde a década de 1990. A importância relativa dos módulos varia entre as linguagens e, nas linguagens orientadas a objetos baseadas em classes, ainda há sobreposição e confusão com as classes como uma unidade de organização e encapsulamento, mas ambos são conceitos bem estabelecidos e distintos.

Veja também

Notas

Referências

links externos