terça-feira, 14 de outubro de 2008
Poster C#
Muito bom! Vale a pena dar uma lida!
http://www.microsoft.com/downloads/details.aspx?familyid=E5F902A8-5BB5-4CC6-907E-472809749973&displaylang=en
sábado, 4 de outubro de 2008
Princípio da Segregação de Interface
Princípio da inversão de dependências
Princípios da Substituição de Liskov
quarta-feira, 1 de outubro de 2008
Princípio Aberto / Fechado (Open/Closed Principle - OCP)
Nomeando Classes, Estruturas, Interfaces, Métodos e Membros.
- Utilize nomes simples e fáceis de serem compreendidos em tipos que serão utilizados com mais freqüência.
terça-feira, 30 de setembro de 2008
Regras de nomeação de Namespaces
Regras de nomeação de Assemblies / Dlls
- Na escolha do nome físico de seus arquivos “.dll”, tente escolher algo bem abrangente, que descreva o propósito de suas funcionalidades. Ex. System.Data
- Se precisar de algum padrão, considere o seguinte:
[Empresa].[Componente].dll – onde [componente] pode ser conter mais de um nome. Ex. Microsoft.VisualBasic.Vsa.dll
- Também faz sentido nomear o arquivo seguindo o nome da Namespace nele implementada.
segunda-feira, 29 de setembro de 2008
Princípio da Divisão de Responsabilidades (Single-Responsibility Principle)
A classe somente terá mais de um motivo para ser modificada se a mesma for responsável pelas ações às quais ela foi definida e por outras fora de seu escopo. No contexto do princípio da divisão de responsabilidades, responsabilidade é definida como razão para mudanças. Se for possível imaginar mais de um motivo para modificar a classe, logo esta classe possui mais de uma responsabilidade.
No exemplo a seguir foi definida uma interface “Modem” onde as funções declaradas parecem corretas dentro do contexto das funcionalidades que um modem deve exercer.
Ilustração 1 - Interface Modem
Porém, analisando detalhadamente a iliustração 1 é possível identificar que a classe possui duas responsabilidades: conexão e comunicação. As funções “Dial” e “Hangup” controlam a conexão e as funções “Send” e “Recv” controlam a comunicação.
Se os requisitos da aplicação mudassem de modo a afetar mais frequentemente as funções de conexão, o design demonstraria rigidez, um dos odores de decomposição do software. A aplicação seria rígida porque ao alterar algo na conexão seria necessário compilar e distribuir novamente toda a parte de comunicação sem necessidade alguma.
A ilustração 2 demonstra como ficaria o design ao separar as responsabilidades.
Ilustração 2 - Interface modem separada
Para separar as responsabilidades da interface modem de modo que a aplicação não sofra de rigidez, foi necessário aumentar a complexidade do sistema. Todavia deve-se tomar muito cuidado ao aplicar o princípio, pois se os requisitos da aplicação fossem tais que sempre alterariam ambas as responsabilidades, conexão e comunicação, o novo design seria incorreto devido ao fato de ter gerado complexidade desnecessária à aplicação, outro odor da decomposição do software. Portanto a aplicação do princípio de divisão de responsabilidades, ou outro qualquer, deve ser feito de modo cuidadoso e inteligente. Só se deve utilizá-los se o design estiver exalando algum dos odores de decomposição do software.
Design Ágil
O design pode ser representado por diversas maneiras, mas no fim das contas, o código fonte é a principal fonte de design. Um design mal feito, consequentemente um código mal desenvolvido, pode acelerar o processo de decomposição do software, sendo que a velocidade de decomposição de um software está diretamente ligada à sua qualidade, ou seja, quanto maior a velocidade de decomposição do software, menor é a qualidade. Para evitar tal decomposição, deve-se ficar atento aos sintomas ou odores que o software exala.
Desenvolvedores ágeis se dedicam para manter o design coeso, limpo, e livre de sintomas ou odores sempre que possível. Eles sabem como fazer isso porque sempre seguem alguns passos antes de escrever qualquer linha de código:
1. Eles acham o problema seguindo praticas ágeis;
2. Eles analisam o problema aplicando princípios de design;
3. Eles resolvem o problema aplicando o modelo de design apropriado ao caso.
Rigidez: Rigidez ocorre quando é necessário um grande esforço para alterá-lo, mesmo quando a alteração é pequena.
Fragilidade: Fragilidade é a tendência que o programa tem para dar problema em diversos pontos quando uma única alteração é feita.
Imobilidade: Imobilidade ocorre quando o software contém muitas partes que podem ser reaproveitadas em outros softwares, mas para reutilizar essas partes é necessário um grande esforço junto com um alto risco, pois não foram planejadas para ser reutilizadas. Logo, uma grande parte do sistema terá que ser levada junto sem necessidade nenhuma.
Viscosidade: Um projeto viscoso é aquele que quando uma alteração é necessária, devido ao seu design não planejado para trabalhar de forma componentizada, fica difícil fazer a alteração do modo correto, gerando desvios para que a alteração seja mais fácil e mais rápida de programar.
Complexidade desnecessária: Acontece quando o design do sistema é superdimensionado e implementado para prever situações que nem sequer foram especificadas. Isso torna o software complexo demais e difícil de entender.
Redundância desnecessária: Acontece muito quando o programador necessita do mesmo código utilizado em outra função para resolver um problema, porém com algumas alterações. Acontece que isso acaba gerando redundância de código tornando a manutenção difícil e trabalhosa já que o erro deve ser corrigido em todas as repetições de código.
Opacidade: Opacidade é a falta de clareza na hora de escrever o código fonte. Muitas vezes o código é legível apenas para quem o programou. Isso pode ser evitado utilizando padrões na hora de escrever o código e fazendo com que outras pessoas revisem o código.
Todos esses odores são pontos extremamente importantes que devem ser considerados ao desenvolver um software. Em ambientes não ágeis, o design de um sistema degrada pois os requisitos mudam de uma forma que o design inicial não previa causando a mudança do design original, tornando-o desorganizado e ineficaz.
Um time ágil investe um pouco a mais no design inicial para tornar o sistema resistente a mudanças evitando que ele apodreça.
Regras gerais de nomeação de identificadores
PascalCasing e camelCasing
Para a nomeação de identificadores, existem duas formas mais apropriadas: PascalCasing e camelCasing.
- PascalCasing: É utilizado para em Namespaces, tipos, e variáveis que possuem mais de uma palavra. Consiste em capitalizar a primeira letra de cada palavra.
Ex: NomeDoFuncionário
No caso de siglas composta por 2 letras, ambas as letras devem ser capitalizadas.
Ex: IOStream onde IO é uma sigla para input/output.
- camelCasing: É utilizado apenas para parâmetros. Consiste em capitalizar a primeira letra de cada palavra com exceção da primeira palavra.
Ex: nomeDoFuncionário
No caso de siglas composta por 2 letras, ambas as letras devem ser minúsculas.
Ex: ioStream onde IO é uma sigla para input/output.
Maiores informações em:.NET Framework Developer's Guide - Capitalization Conventions
Naming Guidelines
Bom, são diretrizes para nomear as coisas... hum, essa não foi muito boa. Vamos mergulhar mais fundo então.
Um ex-professor sempre me dizia: "O que custa reservar um tempo para inventar um bom nome? Lembre-se que sua mãe demorou 9 meses para te dar um!"
Para entender a importância dos nomes, imagine um sistema com 26 variáveis cujo padrão de nomenclatura utilizado foi o de "A" a "Z", ou seja, a primeira variável tem o nome de "A" e a última de "Z"
Agora imagine se der algum problema na variável "K", quanto tempo demoraria para lembrar que a variável "K" armazena o nome do funcionário?
Agora um pesadelo, imagine que o sistema foi feito por um colega de trabalho que já saiu da empresa e que o escolhido para dar manutenção neste sistema foi você!
Acho que já deu pra ter uma idéia da importância de se adotar um conjunto consistente de diretrizes de nomenclatura no desenvolvimento de um software. Essas diretrizes possuem um propósito muito importante quando falamos de usabilidade e manutenibilidade do software.
Tentarei passar nos próximos posts algumas técnicas de nomenclatura de identificadores e como utilizá-las.
Abraços,
Livro: Agile Principles, Patterns, and Practices in C# (Robert C. Martin Series)
Agile Principles, Patterns, and Practices in C# (Robert C. Martin Series)
Hello World!
Seja bem vindo ao meu novo blog!
Decidi criar este blog para compartilhar os meus conhecimentos com todos, já que grande parte do que conheço aprendi em blogs como este.
Meu objetivo aqui neste blog é expor informações sobre Arquitetura de Software, Melhores Práticas, testes, desenvolvimento entre outras informações que utilizam a tecnologia Microsoft.Net.
Espero que gostem!
Denis Yomura