Um assunto um tanto delicado, ainda nao debatido aqui no blog, e a respeito de SOA - Service Oriented Architecture. Tanto DDD quanto SOA sao assuntos relativamente novos. Porem, enquanto o primeiro esta bem definido e estabelecido na comunidade de desenvolvimento de software, o segundo ainda carece de alguns padroes que unifiquem as diferentes visoes que existem sobre a tecnica. Este post e o inicio da minha colaboracao (meus 2 cents).DefinicaoDefinir SOA e complicado. A maioria das definicoes e baseada na ideia de sistemas compostos por servicos independentes. Entretanto, o que exatamente constitui um servico nao esta claro. O que nao resta duvida e o fato de SOA ser uma forma arquitetural de se desenvolver software, forma guiada pela reutilizacao e compartilhamento entre aplicacoes e componentes. Nas palavras do mestre Udi Dahan:Specifically, SOA deals with systems or applications that are, or can be, distributed. The acknowledgment that distribution is a primary architectural issue is one of the underlying currents of SOA.O software que precisa rodar em um ambiente distribuido tem de ser projetado de forma diferenciada. As layers e tiers no mundo SOA sao unificadas em "servicos", que sao ao mesmo tempo unidades de design e de deployment. Enquanto que numa arquitetura tradicional nao ha restricao em como essas camadas irao se comunicar, em SOA os servicos devem se comunicar de acordo com padroes de mensagens definidos por um schema (ou contrato).O que e um Servico?Muito da literatura existente hoje foca em descrever propriedades (e principios) dos servicos em vez de definir o que um servico e de fato. Na essencia, sabemos que a classe que implementa determinado servico deve ser desacoplada dos clientes que evetivamente a consomem. Isso e bem diferente dos ambientes Java RMI, COM e .NET remoting, onde o cliente precisa explicitamente referenciar tipos especificos de plataforma. Vejamos entao os principios fundamentais de um servico: - Servicos sao autonomos: autonomia significa a capacidade de se autogovernar, um servico autonomo e aquele que independe de um elemento externo para executar sua logica.- Servicos tem fronteiras bem definidas: essa definicao esta lado a lado com o principio da autonomia; torna claro onde um servico termina e outro comeca.- Servicos abstraem a logica: servicos devem ser tratados como uma caixa preta, assim como componentes de um sistema. Assim sendo, a programacao neles inclusa pode ser substituida a qualquer momento, sem afetar aqueles que o consomem.- Servicos expoem schema e contratos, nao classes ou tipos: contratos sao documentos textuais que descrevem o que o servico faz, os padroes WSDL (Web Service Description Language), UDDI (Universal Description Discovery and Integration) e SOAP (Simple Object AccessProtocol) sao muito utilizados no dia a dia.- Servicos sao reutilizaveis: um servico reutilizavel e aquele que nao carrega particularidades tecnicas de uma implementacao ou regras de negocio especificas e e generico o suficiente para atender outros projetos. OO e SOASegundo Udi Dahan, apesar de muitos terem previsto que SOA seria a proxima geracao do desenvolvimento de aplicacoes - com a consequente substituicao do padrao OO atual - nada significativo realmente aconteceu. Na verdade, SOA e OO trabalham em diferentes