{"id":1189,"date":"2017-07-27T17:28:14","date_gmt":"2017-07-27T20:28:14","guid":{"rendered":"http:\/\/gianfratti.com\/?p=1189"},"modified":"2017-07-27T18:26:51","modified_gmt":"2017-07-27T21:26:51","slug":"definindo-a-arquitetura-de-um-projeto-de-software","status":"publish","type":"post","link":"http:\/\/gianfratti.com\/index.php\/definindo-a-arquitetura-de-um-projeto-de-software\/","title":{"rendered":"Definindo a arquitetura de um projeto de software"},"content":{"rendered":"<div>\n<div id=\"wrapper\">\n<div class=\"wrapper-content\">\n<div class=\"single single-articles\">\n<div class=\"container single-content\">\n<article id=\"content\">\n<div class=\"single-the-content\">\n<p>Se voc\u00ea trabalha com desenvolvimento de software, por experi\u00eancia pr\u00f3pria, deve saber que a \u00fanica constante no processo de desenvolvimento \u00e9 a mudan\u00e7a.<\/p>\n<p>Mas por que isso ocorre? Com o desenvolvimento tecnol\u00f3gico obtidos nos \u00faltimos tempos a \u00e1rea da tecnologia da informa\u00e7\u00e3o foi impactada por dois fatores importantes:<\/p>\n<ol>\n<li>O aumento do tamanho e da complexidade dos sistemas de software;<\/li>\n<li>A redu\u00e7\u00e3o do tempo e custo de desenvolvimento e manuten\u00e7\u00e3o do software.<\/li>\n<\/ol>\n<p><!--more--><\/p>\n<p>Assim, os sistemas ficaram mais complexos e maiores e o tempo e o or\u00e7amento para desenvolver tais sistemas diminuiu. E o neg\u00f3cio n\u00e3o pode parar\u2026<\/p>\n<p>Um software \u00e9 um produto que foi criado para atender uma necessidade de neg\u00f3cio, e os requisitos de neg\u00f3cio mudam a todo instante com base nas prioridades do mesmo, logo o software tem que ser alterado para dar suporte a tais mudan\u00e7as. Dessa forma, um software que n\u00e3o foi bem projetado para dar suporte \u00e0s constantes mudan\u00e7as ir\u00e1 se tornar obsoleto e n\u00e3o vai mais cumprir o seu objetivo afetando os neg\u00f3cios.<\/p>\n<p>Ent\u00e3o \u2018o neg\u00f3cio\u2019 \u00e9 projetar um software que seja f\u00e1cil de ajustar e barato de manter. Parece simples n\u00e3o \u00e9 mesmo? Tudo come\u00e7a com a defini\u00e7\u00e3o da arquitetura de software a ser adotada. Uma das tarefas fundamentais no processo de cria\u00e7\u00e3o de um software \u00e9 a defini\u00e7\u00e3o da arquitetura do projeto de software pois uma arquitetura consistente e bem definida se torna fundamental para que o projeto seja implementado com efici\u00eancia.<\/p>\n<p>A arquitetura de software desempenha um papel fundamental para gerenciar a complexidade inerente ao software a ser criado. Uma boa arquitetura possibilita que um sistema satisfa\u00e7a \u00e0s exig\u00eancias principais de um projeto, tais como: desempenho, confiabilidade, portabilidade, manutenibilidade, interoperabilidade e etc.<\/p>\n<p>Uma m\u00e1 arquitetura simplesmente far\u00e1 com que o software seja um fracasso.<\/p>\n<h2>O que \u00e9 arquitetura de software ?<\/h2>\n<p>Existem muitas defini\u00e7\u00f5es de arquitetura de software:<\/p>\n<blockquote><p>\u201cUma arquitetura de software envolve a descri\u00e7\u00e3o de elementos arquiteturais dos quais os sistemas ser\u00e3o constru\u00eddos, intera\u00e7\u00f5es entre esses elementos, padr\u00f5es que guiam suas composi\u00e7\u00f5es e restri\u00e7\u00f5es sobre estes padr\u00f5es\u201d. GARLAN, 2000<\/p>\n<p>\u201cA arquitetura de software define o que \u00e9 o sistema em termos de componentes computacionais e os relacionamentos entre estes componentes\u201d. VAROTO, 2002<\/p>\n<p>\u201cA arquitetura de software de um sistema consiste na defini\u00e7\u00e3o dos componentes de software, suas propriedades externas, e seus relacionamentos com outros softwares. O termo tamb\u00e9m se refere \u00e0 documenta\u00e7\u00e3o da arquitetura de software do sistema. A documenta\u00e7\u00e3o da arquitetura do software facilita: a comunica\u00e7\u00e3o entre os stakeholders, registra as decis\u00f5es iniciais acerca do projeto de alto-n\u00edvel, e permite o reuso do projeto dos componentes e padr\u00f5es entre projetos\u201d. <a href=\"http:\/\/pt.wikipedia.org\/wiki\/Arquitetura_de_software\">http:\/\/pt.wikipedia.org\/wiki\/Arquitetura_de_software<\/a>, acessado em 2012<\/p><\/blockquote>\n<p><strong>Obs<\/strong>: Stakeholder \u00e9 qualquer pessoa ou organiza\u00e7\u00e3o que tenha interesse, ou seja afetado pelo projeto. (Stake: interesse, participa\u00e7\u00e3o, risco \/ Holder: aquele que possui)<\/p>\n<p>Assim, a arquitetura de um sistema deve definir os elementos que ir\u00e3o compor o software. Tais elementos definem como o software \u00e9 particionado em peda\u00e7os menores e, assim, definem como o software \u00e9 entendido.<\/p>\n<h2>Como definir uma boa arquitetura?<\/h2>\n<p>Segundo o RUP \u2013 Rational Unified Process, a arquitetura de um software envolve o conjunto de decis\u00f5es que definem a organiza\u00e7\u00e3o do sistema e devem cumprir os seguintes objetivos:<\/p>\n<ul>\n<li>Definir os elementos estruturais e suas interfaces de modo a estabelecer a composi\u00e7\u00e3o do sistema;<\/li>\n<li>Estabelecer o comportamento pela colabora\u00e7\u00e3o entre estes elementos;<\/li>\n<li>Compor estes elementos estruturais e comportamentais em subsistemas (agrega\u00e7\u00e3o).<\/li>\n<\/ul>\n<p>Diversos fatores influenciam a defini\u00e7\u00e3o da arquitetura como por exemplo:<\/p>\n<ul>\n<li>Arquitetura do hardware;<\/li>\n<li>Sistema operacional utilizado;<\/li>\n<li>Sistema Gerenciador de Banco de dados adotado;<\/li>\n<li>Protocolos de rede;<\/li>\n<li>A linguagem de programa\u00e7\u00e3o;<\/li>\n<li>O ambiente de interface gr\u00e1fica;<\/li>\n<li>As bibliotecas de fun\u00e7\u00f5es dispon\u00edveis;<\/li>\n<li>Os sistemas legados envolvidos;<\/li>\n<li>As necessidades de desempenho, portabilidade, usabilidade, disponibilidade, etc;<\/li>\n<li>Documenta\u00e7\u00e3o.<\/li>\n<\/ul>\n<p>Levando em conta esses fatores e sendo bem objetivo e pr\u00e1tico, como podemos definir uma arquitetura b\u00e1sica que possa ser implementada em sistemas de pequeno \u00e9 m\u00e9dio porte?<\/p>\n<h2>Por onde come\u00e7ar?<\/h2>\n<p>Comece pelo come\u00e7o\u2026<\/p>\n<h3>1. Defina os requisitos do sistema<\/h3>\n<p>Definir de forma sistem\u00e1tica os requisitos do sistema envolvendo todos os stackholders (interessados) no projeto de forma a ter o maior n\u00famero poss\u00edvel de requisitos definidos de forma clara e objetiva;<\/p>\n<p>Os requisitos expressam as caracter\u00edsticas e restri\u00e7\u00f5es do produto de software do ponto de vista de satisfa\u00e7\u00e3o das necessidades do usu\u00e1rio, e, em geral independem da tecnologia empregada na constru\u00e7\u00e3o da solu\u00e7\u00e3o sendo a parte mais cr\u00edtica e propensa a erros no desenvolvimento de software.<\/p>\n<p>Requisitos s\u00e3o objetivos ou restri\u00e7\u00f5es estabelecidas por clientes e usu\u00e1rios do sistema que definem as diversas propriedades do sistema. Os requisitos\u00a0 de software s\u00e3o, obviamente, aqueles dentre os requisitos de sistema que dizem respeito a propriedades do software.<\/p>\n<p>A necessidade de se estabelecer os requisitos de maneira de forma precisa \u00e9 cr\u00edtica na medida que o tamanho e a complexidade do software aumentam. Os requisitos exercem influ\u00eancia uns sobre os outros. Por exemplo, o requisito de que o software de ter grande portabilidade (por exemplo, ser implementado em Java) pode implicar em que o requisito desempenho n\u00e3o seja satisfeito (programas em Java s\u00e3o, em geral, mais lentos).<\/p>\n<p>Uma boa especifica\u00e7\u00e3o de requisitos deve ser:<\/p>\n<ul>\n<li>Clara e n\u00e3o amb\u00edgua;<\/li>\n<li>Completa;<\/li>\n<li>Correta;<\/li>\n<li>Compreens\u00edvel;<\/li>\n<li>Consistente;<\/li>\n<li>Concisa;<\/li>\n<li>Confi\u00e1vel;.De acordo com <a href=\"http:\/\/www.dimap.ufrn.br\/~jair\/ES\/home.html#biblio\"> Farley<\/a>, um documento de especifica\u00e7\u00e3o de requisitos deve possui as seguintes se\u00e7\u00f5es:<\/li>\n<\/ul>\n<ul>\n<li>Vis\u00e3o geral do produto e sum\u00e1rio;<\/li>\n<li>Ambientes de desenvolvimento, opera\u00e7\u00e3o e manuten\u00e7\u00e3o;<\/li>\n<li>Interfaces externas e fluxo de dados;<\/li>\n<li>Requisitos funcionais;<\/li>\n<li>Requisitos de desempenho;<\/li>\n<li>Tratamento de exce\u00e7\u00f5es;<\/li>\n<li>Prioridades de implementa\u00e7\u00e3o;<\/li>\n<li>Antecipa\u00e7\u00e3o de mudan\u00e7as e extens\u00f5es;<\/li>\n<li>Dicas e diretrizes de design;<\/li>\n<li>Crit\u00e9rios de aceita\u00e7\u00e3o;<\/li>\n<li>\u00cdndice remissivo;<\/li>\n<li>Gloss\u00e1rio.<\/li>\n<\/ul>\n<h3>2. Definir uma ferramenta ORM<\/h3>\n<p>De forma geral, voc\u00ea pode escolher uma ferramenta ORM para ajud\u00e1-lo a criar os objetos com base no seu dom\u00ednio e a partir deles gerar o banco de dados usado pela aplica\u00e7\u00e3o.<\/p>\n<p>Existem dezenas de ferramentas ORMs dispon\u00edveis no mercado. Abaixo uma rela\u00e7\u00e3o das mais importantes para a plataforma .NET:<br \/>\n(fonte: <a href=\"http:\/\/en.wikipedia.org\/wiki\/List_of_object-relational_mapping_software\">http:\/\/en.wikipedia.org\/wiki\/List_of_object-relational_mapping_software<\/a>)<\/p>\n<ul>\n<li><a title=\"ADO.NET Entity Framework\" href=\"http:\/\/en.wikipedia.org\/wiki\/ADO.NET_Entity_Framework\">ADO.NET Entity Framework<\/a>, included in .NET Framework 3.5 SP1 and above<\/li>\n<li><a title=\"AgileFx\" href=\"http:\/\/en.wikipedia.org\/wiki\/AgileFx\">AgileFx<\/a>, open source<\/li>\n<li><a title=\"Base One Foundation Component Library\" href=\"http:\/\/en.wikipedia.org\/wiki\/Base_One_Foundation_Component_Library\">Base One Foundation Component Library<\/a>, free or commercial<\/li>\n<li><a title=\"Devart (company)\" href=\"http:\/\/en.wikipedia.org\/wiki\/Devart_%28company%29\">Devart<\/a> LinqConnect, commercial, an ORM solution for <a title=\"Oracle Database\" href=\"http:\/\/en.wikipedia.org\/wiki\/Oracle_Database\">Oracle<\/a>, <a title=\"MySQL\" href=\"http:\/\/en.wikipedia.org\/wiki\/MySQL\">MySQL<\/a>, <a title=\"PostgreSQL\" href=\"http:\/\/en.wikipedia.org\/wiki\/PostgreSQL\">PostgreSQL<\/a>, and <a title=\"SQLite\" href=\"http:\/\/en.wikipedia.org\/wiki\/SQLite\">SQLite<\/a><\/li>\n<li><a title=\"Castle ActiveRecord\" href=\"http:\/\/en.wikipedia.org\/wiki\/Castle_ActiveRecord\">Castle ActiveRecord<\/a>, ActiveRecord for .NET, open source<\/li>\n<li><a title=\"DatabaseObjects\" href=\"http:\/\/en.wikipedia.org\/wiki\/DatabaseObjects\">DatabaseObjects<\/a> .NET, open source<\/li>\n<li><a title=\"DataObjects.NET\" href=\"http:\/\/en.wikipedia.org\/wiki\/DataObjects.NET\">DataObjects.NET<\/a>, commercial<\/li>\n<li><a title=\"ECO (Domain Driven Design)\" href=\"http:\/\/en.wikipedia.org\/wiki\/ECO_%28Domain_Driven_Design%29\">ECO<\/a>, commercial but free use for up to 12 classes<\/li>\n<li><a title=\"EntitySpaces\" href=\"http:\/\/en.wikipedia.org\/wiki\/EntitySpaces\">EntitySpaces<\/a>, commercial<\/li>\n<li><a title=\"Habanero.NET\" href=\"http:\/\/en.wikipedia.org\/wiki\/Habanero.NET\">Habanero<\/a>, free open source enterprise application framework with a free code generating tool<\/li>\n<li><a title=\"MyBatis\" href=\"http:\/\/en.wikipedia.org\/wiki\/MyBatis\">MyBatis<\/a>, free open source, formerly named iBATIS<\/li>\n<li><a title=\"IBATIS\" href=\"http:\/\/en.wikipedia.org\/wiki\/IBATIS\">iBATIS<\/a>, free open source, maintained by <a title=\"Apache Software Foundation\" href=\"http:\/\/en.wikipedia.org\/wiki\/Apache_Software_Foundation\">ASF<\/a> but now inactive.<\/li>\n<li><a title=\"Language Integrated Query\" href=\"http:\/\/en.wikipedia.org\/wiki\/Language_Integrated_Query#LINQ_to_SQL\">LINQ to SQL<\/a>, included in .NET Framework 3.5<\/li>\n<li><a title=\"LLBLGen Pro\" href=\"http:\/\/en.wikipedia.org\/wiki\/LLBLGen_Pro\">LLBLGen Pro<\/a>, commercial<\/li>\n<li><a title=\"Neo (object-relational toolset)\" href=\"http:\/\/en.wikipedia.org\/wiki\/Neo_%28object-relational_toolset%29\">Neo<\/a>, open source but now inactive.<\/li>\n<li><a title=\"NHibernate\" href=\"http:\/\/en.wikipedia.org\/wiki\/NHibernate\">NHibernate<\/a>, open source<\/li>\n<li><a title=\"NHydrate\" href=\"http:\/\/en.wikipedia.org\/wiki\/NHydrate\">nHydrate<\/a>, open source<\/li>\n<li><a title=\"OpenAccess ORM\" href=\"http:\/\/en.wikipedia.org\/wiki\/OpenAccess_ORM\">OpenAccess ORM<\/a>, by Telerik free or commercial<\/li>\n<li><a title=\"Persistor.NET\" href=\"http:\/\/en.wikipedia.org\/wiki\/Persistor.NET\">Persistor.NET<\/a>, free or commercial<\/li>\n<li><a title=\"Quick Objects\" href=\"http:\/\/en.wikipedia.org\/wiki\/Quick_Objects\">Quick Objects<\/a>, free or commercial<\/li>\n<li><a title=\"Signum Framework\" href=\"http:\/\/en.wikipedia.org\/wiki\/Signum_Framework\">Signum Framework<\/a>, open source<\/li>\n<li><a title=\"SubSonic (software)\" href=\"http:\/\/en.wikipedia.org\/wiki\/SubSonic_%28software%29\">SubSonic<\/a>, open source<\/li>\n<li><a title=\"Symbiotic (software)\" href=\"http:\/\/en.wikipedia.org\/wiki\/Symbiotic_%28software%29\">Symbiotic<\/a>, by Frozen Elephant Inc.<\/li>\n<li><a title=\"XPO\" href=\"http:\/\/en.wikipedia.org\/wiki\/XPO\">XPO<\/a>, commercial, by DevExpress<\/li>\n<\/ul>\n<h3>3. Aplique a separa\u00e7\u00e3o das responsabilidades ao seu projeto de software<\/h3>\n<p>A defini\u00e7\u00e3o da separa\u00e7\u00e3o em camadas estimula a organiza\u00e7\u00e3o da arquitetura do sistema em um conjunto de camadas coesas com fraco acoplamento entre elas onde cada camada possui um prop\u00f3sito bem definido.<\/p>\n<p>Principais camadas:<\/p>\n<ul>\n<li>UI(camada de apresenta\u00e7\u00e3o): agrega as classes do sistema com as quais os usu\u00e1rios interagem;<\/li>\n<li>Neg\u00f3cio: mant\u00e9m as classes do sistema respons\u00e1veis pelos servi\u00e7os e regras do neg\u00f3cio;<\/li>\n<li>Dados: camada respons\u00e1vel pelo armazenamento e recupera\u00e7\u00e3o dos dados persistentes do sistema;<\/li>\n<li>Comunica\u00e7\u00e3o: respons\u00e1vel pela distribui\u00e7\u00e3o do sistema em v\u00e1rias m\u00e1quinas.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1194\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/07\/net_arq4.gif\" alt=\"\" width=\"580\" height=\"241\" \/><\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>Considera\u00e7\u00f5es:<\/p>\n<ul>\n<li>Seja expl\u00edcito sobre como as camadas se comunicam entre si \u2013 Permitir que todas as camadas em um aplicativo se comuniquem ou tenham depend\u00eancias sobre todas as outras camadas resultar\u00e1 em uma solu\u00e7\u00e3o que \u00e9 mais dif\u00edcil de entender e gerenciar;<\/li>\n<li>Use a abstra\u00e7\u00e3o para implementar o acoplamento fraco entre as camadas \u2013 Isto pode ser conseguido atrav\u00e9s da defini\u00e7\u00e3o de componentes de interface, tais como uma Facade com entradas e sa\u00eddas bem conhecidos que traduzem os pedidos para um formato compreendido por componentes no interior da camada;<\/li>\n<li>N\u00e3o misture tipos diferentes de componentes na mesma camada l\u00f3gica \u2013 Comece por identificar diferentes \u00e1reas de interesse e, em seguida agrupe os componentes associados a cada \u00e1rea de interesse em camadas l\u00f3gicas. Por exemplo, a camada de interface do usu\u00e1rio n\u00e3o deve conter componentes de processamento de neg\u00f3cios, mas deve conter componentes usados para manipular a entrada do usu\u00e1rio e solicita\u00e7\u00f5es dos usu\u00e1rios do processo;<\/li>\n<li>Mantenha o formato de dados consistente dentro de uma camada ou componente \u2013 Misturar formatos de dados ir\u00e1 tornar a aplica\u00e7\u00e3o mais dif\u00edcil de implementar, ampliar e manter. Toda vez que voc\u00ea precisar converter dados de um formato para outro, voc\u00ea \u00e9 obrigado a implementar o c\u00f3digo de tradu\u00e7\u00e3o para executar a opera\u00e7\u00e3o e incorrendo em uma sobrecarga de processamento.<\/li>\n<\/ul>\n<h3>4. Utilize padr\u00f5es de projeto de forma a obter um c\u00f3digo robusto e obter a reutiliza\u00e7\u00e3o de c\u00f3digo<\/h3>\n<ul>\n<li>Mantenha os padr\u00f5es de projeto consistentes dentro de cada camada \u2013 Dentro de uma camada l\u00f3gica, sempre que poss\u00edvel, o design de componentes deve ser consistente para uma determinada opera\u00e7\u00e3o;<\/li>\n<li>N\u00e3o duplique a funcionalidade de um aplicativo \u2013 Deve haver apenas um componente proporcionando uma funcionalidade e esta funcionalidade espec\u00edfica n\u00e3o deve ser repetida em qualquer outro componente. Isso faz com que seus componentes coesos e torna mais f\u00e1cil otimizar os componentes se uma determinada fun\u00e7\u00e3o ou funcionalidade sofrer altera\u00e7\u00f5es;<\/li>\n<li>Estabele\u00e7a uma conven\u00e7\u00e3o de estilo de codifica\u00e7\u00e3o e nomea\u00e7\u00e3o para o desenvolvimento \u2013 Verifique se a organiza\u00e7\u00e3o estabeleceu o estilo de codifica\u00e7\u00e3o e padr\u00f5es de nomenclatura.<\/li>\n<\/ul>\n<h3>5. Adote princ\u00edpios b\u00e1sicos de projeto de software<\/h3>\n<ul>\n<li>Separa\u00e7\u00e3o de Responsabilidades \u2013 Divida sua aplica\u00e7\u00e3o em recursos distintos com a menor sobreposi\u00e7\u00e3o de funcionalidade poss\u00edvel. O fator importante \u00e9 a minimiza\u00e7\u00e3o dos pontos de intera\u00e7\u00e3o para alcan\u00e7ar alta coes\u00e3o e baixo acoplamento;<\/li>\n<li>Princ\u00edpio da responsabilidade individual- Cada componente ou m\u00f3dulo deve ser respons\u00e1vel por apenas uma caracter\u00edstica espec\u00edfica ou funcionalidade, ou agrega\u00e7\u00e3o de funcionalidade coesa;<\/li>\n<li>Princ\u00edpio da menor conhecimento \u2013 (tamb\u00e9m conhecida como Lei de Dem\u00e9ter ou LoD). Um componente ou objeto n\u00e3o deve saber sobre detalhes internos de outros componentes ou objetos;<\/li>\n<li>N\u00e3o repita voc\u00ea mesmo (DRY) \u2013 Voc\u00ea s\u00f3 precisa especificar a inten\u00e7\u00e3o em um s\u00f3 lugar. Por exemplo, em termos de projeto da aplica\u00e7\u00e3o, a funcionalidade espec\u00edfica deve ser implementada em apenas um componente; a funcionalidade n\u00e3o deve ser repetida em qualquer outro componente;<\/li>\n<li>Minimizar projeto inicial \u2013 Projete apenas o necess\u00e1rio. Em alguns casos, voc\u00ea pode requerer um projeto inicial abrangente com realiza\u00e7\u00e3o de testes para verificar se o custo de desenvolvimento ou uma falha no projeto ser\u00e1 muito alto. Em outros casos, especialmente para desenvolvimento \u00e1gil, voc\u00ea pode evitar antecipadamente um projeto grande. Se os requisitos da aplica\u00e7\u00e3o n\u00e3o s\u00e3o claros, ou se existe a possibilidade do projeto evoluir ao longo do tempo, evite fazer um esfor\u00e7o grande prematuramente. Este princ\u00edpio \u00e9 conhecido como YAGNI (\u201cVoc\u00ea n\u00e3o vai precisar dele\u201d \u2013 You ain\u2019t gonna need it);<\/li>\n<li>Considere a opera\u00e7\u00e3o de sua aplica\u00e7\u00e3o \u2013 Determine quais m\u00e9tricas e dados operacionais s\u00e3o exigidos pela infraestrutura de TI para garantir a implanta\u00e7\u00e3o e opera\u00e7\u00e3o eficiente de sua aplica\u00e7\u00e3o.<\/li>\n<\/ul>\n<h3>6. Determinar o tipo de aplica\u00e7\u00e3o<\/h3>\n<p>Escolher o tipo de aplica\u00e7\u00e3o adequada \u00e9 a pe\u00e7a chave do processo de concep\u00e7\u00e3o de uma aplica\u00e7\u00e3o. Sua escolha \u00e9 governado por suas necessidades e limita\u00e7\u00f5es espec\u00edficas de infraestrutura. Muitas aplica\u00e7\u00f5es devem suportar v\u00e1rios tipos de cliente, e podem fazer uso de mais do que um dos arqu\u00e9tipos b\u00e1sicos:<\/p>\n<ul>\n<li>As aplica\u00e7\u00f5es concebidas para dispositivos m\u00f3veis;<\/li>\n<li>Aplica\u00e7\u00f5es rich client projetadas para funcionar primeiramente em um PC cliente;<\/li>\n<li>Aplica\u00e7\u00f5es ricas da Internet projetadas para serem implantadas a partir da Internet, que suportam interface rica e cen\u00e1rios de m\u00eddia;<\/li>\n<li>Aplica\u00e7\u00f5es de servi\u00e7os projetados para suportar a comunica\u00e7\u00e3o entre os componentes fracamente acoplados;<\/li>\n<li>Aplicativos da Web concebidos para serem executados principalmente no servidor em cen\u00e1rios totalmente conectados.<\/li>\n<\/ul>\n<h3>7. Determinar a estrat\u00e9gia de distribui\u00e7\u00e3o<\/h3>\n<p>O aplicativo pode ser implantado em uma variedade de ambientes, cada um com seu pr\u00f3prio conjunto espec\u00edfico de restri\u00e7\u00f5es, como a separa\u00e7\u00e3o f\u00edsica dos componentes em diferentes servidores, uma limita\u00e7\u00e3o em protocolos de rede, configura\u00e7\u00f5es de firewall e roteador e muito mais.<\/p>\n<p>Existem v\u00e1rios padr\u00f5es comuns de implanta\u00e7\u00e3o, que descrevem os benef\u00edcios e as considera\u00e7\u00f5es para uma s\u00e9rie de cen\u00e1rios distribu\u00eddos e n\u00e3o distribu\u00eddos. Voc\u00ea deve equilibrar as necessidades da aplica\u00e7\u00e3o com os padr\u00f5es apropriados que hardware pode suportar, e as restri\u00e7\u00f5es que o ambiente exerce sobre as op\u00e7\u00f5es de implanta\u00e7\u00e3o. Estes fatores ir\u00e3o influenciar o seu projeto de arquitetura.<\/p>\n<h3>8. Determinar os atributos de qualidade desejados<\/h3>\n<p>Os atributos de qualidade, tais como seguran\u00e7a, desempenho e usabilidade podem ser usados para focar o seu pensamento sobre os problemas cr\u00edticos que seu projeto deve resolver. Dependendo de suas necessidades, voc\u00ea pode ter que considerar todos os atributos de qualidade, ou talvez voc\u00ea s\u00f3 precise considerar um subconjunto. Por exemplo, cada projeto de software deve considerar sempre a seguran\u00e7a e o desempenho, mas o projeto talvez n\u00e3o precise considerar os atributos interoperabilidade e escalabilidade.<\/p>\n<h3>9. Determine um processo bem definido de desenvolvimento de software<\/h3>\n<p>Um exemplo muito usado a ser considerado \u00e9 o Processo Unificado da Rational (RUP) que foi constru\u00eddo envolvendo as seis melhores pr\u00e1ticas para fornecer um processo bem definido e foi baseado nas boas pr\u00e1ticas de desenvolvimento de software.<\/p>\n<p>O RUP \u00e9 um processo de desenvolvimento de software que assegura a produ\u00e7\u00e3o de software de qualidade de forma repetida e previs\u00edvel, com isso, se ganha tempo e facilita no desenvolvimento do projeto, visto que as tarefas s\u00e3o divididas de formas iterativas.<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1191\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/07\/net_arq1.gif\" alt=\"\" width=\"551\" height=\"285\" \/><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1192\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/07\/net_arq2.gif\" alt=\"\" width=\"494\" height=\"574\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>O modelo do RUP \u00e9 interativo e incremental onde temos que em cada itera\u00e7\u00e3o:<\/p>\n<ul>\n<li>S\u00e3o identificados e especificados os casos de uso mais relevantes;<\/li>\n<li>E feita a an\u00e1lise e projeto dos casos de uso, usando-se a arquitetura como guia;<\/li>\n<li>S\u00e3o implementados componentes que realizam o que foi projetado;<\/li>\n<li>Verifica-se se os componentes satisfazem os casos de uso escolhidos.<\/li>\n<\/ul>\n<p>Os casos de uso s\u00e3o usados no planejamento e acompanhamento das itera\u00e7\u00f5es:<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1193\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/07\/net_arq3.gif\" alt=\"\" width=\"580\" height=\"203\" \/><\/p>\n<p>&nbsp;<\/p>\n<p>A arquitetura serve para organizar o desenvolvimento, estruturar a solu\u00e7\u00e3o e identificar oportunidades de reuso enquanto que os casos de uso dizem o que deve ser feito.<\/p>\n<p>Dessa forma, podemos resumir o processo de desenvolvimento de software em cinco etapas:<img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1195\" src=\"http:\/\/gianfratti.com\/wp-content\/uploads\/2017\/07\/net_arq5.gif\" alt=\"\" width=\"402\" height=\"668\" \/><\/p>\n<\/div>\n<p>Fonte: <a href=\"https:\/\/imasters.com.br\/framework\/dotnet\/net-definindo-a-arquitetura-de-um-projeto-de-software\/?trace=1519021197&amp;source=single\" target=\"_blank\" rel=\"noopener\">Imasters<br \/>\n<\/a><\/p>\n<\/article>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Se voc\u00ea trabalha com desenvolvimento de software, por experi\u00eancia pr\u00f3pria, deve saber que a \u00fanica constante no processo de desenvolvimento \u00e9 a mudan\u00e7a. Mas por que isso ocorre? Com o desenvolvimento tecnol\u00f3gico obtidos nos \u00faltimos tempos a \u00e1rea da tecnologia da informa\u00e7\u00e3o foi impactada por dois fatores importantes: O aumento do tamanho e da complexidade <span class=\"ellipsis\">&hellip;<\/span> <span class=\"more-link-wrap\"><a href=\"http:\/\/gianfratti.com\/index.php\/definindo-a-arquitetura-de-um-projeto-de-software\/\" class=\"more-link\"><span>Read More &rarr;<\/span><\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[170,171],"tags":[154],"class_list":["post-1189","post","type-post","status-publish","format-standard","hentry","category-arquitetura","category-definindo","tag-arquitetura"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/1189","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/comments?post=1189"}],"version-history":[{"count":5,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/1189\/revisions"}],"predecessor-version":[{"id":1199,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/posts\/1189\/revisions\/1199"}],"wp:attachment":[{"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/media?parent=1189"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/categories?post=1189"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/gianfratti.com\/index.php\/wp-json\/wp\/v2\/tags?post=1189"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}