Mεταβάλλον ὰναπαύεται
(Mesmo enquanto muda, permanece imóvel.)
—HeráclitoQuanto mais as coisas mudam, mais elas permanecem as mesmas.
—Alphonse Karr
Os capítulos anteriores introduziram os elementos básicos a partir dos quais os programas são feitos. Vimos como procedimentos primitivos e dados primitivos são combinados para construir entidades compostas, e aprendemos que a abstração é vital para nos ajudar a lidar com a complexidade de sistemas grandes. Mas essas ferramentas não são suficientes para projetar programas. A síntese eficaz de programas também requer princípios organizacionais que possam nos guiar na formulação do projeto geral de um programa. Em particular, precisamos de estratégias para nos ajudar a estruturar sistemas grandes de forma que sejam modulares, ou seja, que possam ser divididos “naturalmente” em partes coerentes que possam ser desenvolvidas e mantidas separadamente.
Uma poderosa estratégia de design, particularmente apropriada para a construção de programas que modelam sistemas físicos, é basear a estrutura de nossos programas na estrutura do sistema que está sendo modelado. Para cada objeto no sistema, construímos um objeto computacional correspondente. Para cada ação do sistema, definimos uma operação simbólica em nosso modelo computacional. Nossa esperança ao usar essa estratégia é que a extensão do modelo para acomodar novos objetos ou novas ações não exija mudanças estratégicas no programa, apenas a adição dos novos análogos simbólicos desses objetos ou ações. Se tivermos sido bem-sucedidos em nossa organização do sistema, então, para adicionar um novo recurso ou depurar um antigo, precisaremos trabalhar apenas em uma parte localizada do sistema.
Em grande medida, a forma como organizamos um programa grande é ditada por nossa percepção do sistema a ser modelado. Neste capítulo, investigaremos duas estratégias organizacionais proeminentes que surgem de duas visões de mundo bastante diferentes sobre a estrutura dos sistemas. A primeira estratégia organizacional se concentra em objetos, vendo um sistema grande como uma coleção de objetos distintos cujos comportamentos podem mudar ao longo do tempo. Uma estratégia organizacional alternativa se concentra nos fluxos de informação que fluem no sistema, assim como um engenheiro elétrico vê um sistema de processamento de sinais.
Tanto a abordagem baseada em objetos quanto a abordagem de processamento de fluxos levantam questões linguísticas significativas na programação. Com objetos, devemos nos preocupar com como um objeto computacional pode mudar e ainda manter sua identidade. Isso nos forçará a abandonar nosso antigo modelo de substituição de computação (1.1.5) em favor de um modelo mais mecânico, mas menos teoricamente tratável, o modelo de ambiente de computação. As dificuldades de lidar com objetos, mudança e identidade são uma consequência fundamental da necessidade de lidar com o tempo em nossos modelos computacionais. Essas dificuldades se tornam ainda maiores quando permitimos a possibilidade de execução concorrente de programas. A abordagem de fluxos pode ser mais plenamente explorada quando desacoplamos o tempo simulado em nosso modelo da ordem dos eventos que ocorrem no computador durante a avaliação. Conseguiremos isso usando uma técnica conhecida como avaliação preguiçosa.