Programação modular

Da Wikipédia, a enciclopédia livre
Ir para a navegação Saltar para pesquisar

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 requeridos 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çãoem pedaços menores, e todos originados 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 programação orientada ao uso de dados de objetos , uma espécie de estrutura de dados .

Na programação orientada a objetos, o uso de interfaces como um padrão de arquitetura para construir módulos é conhecido como programação baseada em interface . [ citação necessária ]

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 module . 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 inteiro , enquanto um módulo é uma parte de um programa individual. A escala do termo "módulo" varia significativamente entre os idiomas; em Python é muito pequena e cada arquivo é um módulo, enquanto em Java 9 está 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 unit , usado em dialetos Pascal .

Suporte a idiomas

As linguagens que suportam formalmente o conceito do 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 , Linguagem de Controle (CL), IBM RPG , Java, [a] 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 , [2] Rust ,JavaScript , [3] 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++ , no entanto, permitem a 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 , [4] e Pascal foi substituído por Modula e Oberon , que incluíam módulos desde o início, e vários derivados que incluíam módulos. JavaScript tem módulos nativos desde ECMAScript 2015.

A programação modular pode ser executada mesmo quando a linguagem de programação não possui recursos sintáticos explícitos para suportar 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 estrutura de código. O IBM i também usa módulos ao programar no Integrated Language Environment (ILE).

Aspectos chave

Com a programação modular, as preocupações são separadas para 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 módulos é vista como indicando que estes 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 mais baixo 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, ao invés de criar um aplicativo monolítico (onde o menor componente é o todo), vários módulos menores são escritos separadamente para que, quando compostos juntos, eles construam o programa aplicativo executável. Normalmente, eles também são compilados separadamente, por meio de compilação separada e, em seguida, vinculados por um vinculador . Um compilador just-in-time pode executar algumas dessas construções "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 tarefas específicas. As funções de controle de 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 projetados modulares, se construídos corretamente, muito mais reutilizáveis ​​do que um projeto monolítico tradicional, uma vez que todos (ou muitos) desses módulos podem ser reutilizados (sem alterações) 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, já que nenhum membro da equipe está criando todo o sistema, ou mesmo precisa conhecer 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 . Programação modular per se, com o objetivo de modularidade, desenvolvida no final dos anos 1960 e 1970, como um análogo em maior 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).

Os módulos não foram incluídos na especificação original do ALGOL 68 (1968), mas foram incluídos como extensões nas primeiras implementações, ALGOL 68-R (1970) e ALGOL 68C (1970), e posteriormente formalizados. [5] Uma das primeiras linguagens projetadas desde o início para programação modular foi a Modula de curta duração (1975), de Niklaus Wirth . Outra linguagem modular inicial foi Mesa (1970), por Xerox PARC , e Wirth baseou-se no Mesa, bem como no Modula original em seu sucessor, Modula-2 (1978), que influenciou linguagens posteriores, particularmente através de seu sucessor, Modula-3(década de 1980). O uso do Modula de nomes qualificados por ponto , como M.ase referir ao objeto ado módulo M, coincide com a notação para acessar um campo de um registro (e similarmente para atributos ou métodos de objetos), e agora é difundido, visto em C#, Dart, Go, Java e Python, entre outros. A programação modular tornou-se difundida a partir da década de 1980: a linguagem Pascal original (1970) não incluía módulos, mas versões posteriores, notadamente UCSD Pascal (1978) e Turbo Pascal (1983) os incluíam na forma de "unidades", assim como o Pascal -influenciou Ada (1980). O padrão Extended Pascal ISO 10206:1990 manteve-se mais próximo do Modula2 em seu suporte modular. ML padrão (1984)[6] 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 muitas vezes confundida com a programação orientada a objetos , particularmente devido à popularidade de C++ e Java. Por exemplo, a família de linguagens C tinha suporte para objetos e classes em C++ (originalmente C com Classes , 1980) e Objective-C (1983), suportando apenas módulos 30 anos ou mais depois. Java (1995) suporta módulos na forma de pacotes, embora a unidade primária de organização de 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 de maior escala; e Perl 5 (1994) inclui suporte para módulos e objetos, com uma vasta gama de módulos disponíveis a partir deCPAN (1993).

A programação modular é agora 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 em linguagens orientadas a objetos baseadas em classes ainda há sobreposição e confusão com classes como uma unidade de organização e encapsulamento, mas ambos estão bem estabelecidos como conceitos distintos.

Veja também

Notas

  1. ^ O termo "pacote" é usado para o análogo de módulos no JLS; [1] — veja o pacote Java . " Módulos ", uma espécie de coleção de pacotes, estão planejados para Java 9 como parte do Projeto Jigsaw ; estes foram anteriormente chamados de "superpacotes" e planejados para Java 7.

Referências

  1. James Gosling, Bill Joy, Guy Steele, Gilad Bracha, The Java Language Specification, Third Edition , ISBN  0-321-24678-0 , 2005. Na introdução, afirma-se que "o capítulo 7 descreve a estrutura de um programa, que está organizado em pacotes semelhantes aos módulos do Modula." A palavra "módulo" não tem significado especial em Java.
  2. ^ "Classe: Módulo (Ruby 2.0.0)" .
  3. ^ Especificação de linguagem ECMAScript® 2015, 15.2 Módulos
  4. ^ "N4720: Rascunho de Trabalho, Extensões para C++ para Módulos" (PDF) .
  5. ^ Lindsey, Charles H. (fevereiro de 1976). "Proposta de Instalação de Módulos em ALGOL 68" (PDF) . Boletim ALGOL (39): 20–29. Arquivado a partir do original (PDF) em 2016-03-03 . Recuperado 2014-12-01 .
  6. ^ David MacQueen (agosto de 1984). "Modules for Standard ML, LFP '84 Proceedings of the 1984 ACM Symposium on LISP e programação funcional": 198–207. {{cite journal}}:Cite journal requer |journal=( ajuda )

Links externos