terça-feira, 25 de novembro de 2008

Princípios de padrões de projeto

Definição de Padrão de Desenho
Os padrões de projeto de software ou padrões de desenho de software, também muito conhecido pelo termo original em inglês: Design Patterns, descrevem soluções para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos. Um padrão de projeto estabelece um nome e define o problema, a solução, quando aplicar esta solução e suas conseqüências.
Referência: http://pt.wikipedia.org/wiki/Padrões_de_projeto_de_software


Princípios de Design (Design Principles)
Design Principles ou princípios de design representam um conjunto de orientações que nos ajuda a evitar uma concepção do desenho.

Abaixo uma lista com 3 características importantes de uma má concepção que devem ser evitadas:

Rigidez: É difícil mudar, porque cada mudança afeta muitas outras partes do sistema;
Fragilidade: Quando faz uma mudança inesperadamente partes do sistema começam a falhar;
Imobilidade: É difícil reutilizar o componente em outro aplicativo;

Alguns princípios são descritos abaixo:


Princípio Aberto Fechado (Open Close Principle):
Definição: “Entidades de software como classes, módulos e funções devem ser abertas para expansão, mas fechadas para modificações”;

OPC é um princípio gernérico Quando se refere às classes o princípio Aberto Fechado pode ser assegurado através da utilização de classes abstratas e concretas para implementar alguns comportamentos. Alguns padrões que refletem esse princípio são Template Pattern e Strategy Pattern.


Princípio Inversão de Dependência (Dependency Inversion Principle)
Definição:

“Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.”;

“Abstrações não deve depender de detalhes. Detalhes devem depender abstrações.”.

Inversão de dependência ou de controle são termos relativos e são as melhores maneiras pela quais as dependências são realizadas. Na forma clássica, quando um módulo de software (classe, framerwork, ...) precisam de algum outro módulo, que inicializa e possui uma referência direta a ela, isso os tornará acoplados. A fim de separar o primeiro módulo do segundo e fornecer um gancho (propriedade, parâmetro, ...) um módulo externo controlando as dependências irá injetar uma referência ao segundo. Factory Pattern e Abstract Factories Pattern refletem esse princípio.


Princípio Segregação de Interfaces (Interface Segregation Principle)
Definição: “Os clientes não devem depender de interfaces que eles não usam”.

Este princípio nos ensina a cuidar da forma que escrevemos nossas interfaces. Quando escrevemos as nossas interfaces, deve-se ter o cuidado de só acrescentar métodos que deveriam estar lá. Se acrescentamos métodos que não deveriam estar lá as classes que à implementam teram que implementar esses métodos. Por exemplo, se vamos criar uma interface chamada Trabalho e adicionar um método de intervalo para o almoço, todos os trabalhadores terão de implementá-lo. E se o trabalhador é um robô?

Interfaces contendo métodos que não são específicas para isso são chamadas poluídas ou de gorduras interfaces. Devemos evitá-los.


Princípio Programe para uma interface, e não para uma implementação.
Este princípio é realmente sobre a dependência das relações que têm de ser cuidadosamente geridas de uma grande aplicação. É fácil adicionar uma dependência de uma classe, basta adicionar uma declaração de importação. Curiosamente o inverso não é tão fácil assim e se livrar de uma indesejada dependência pode dar muito trabalho. Por isso você tem que desenvolver com os olhos abertos quando se trata a introdução de dependências. Este princípio nos diz que, depender de uma interface é muitas vezes vantajoso.
Referência: Erich Gamma.

segunda-feira, 24 de novembro de 2008

Design usando arquitetura ágil

Olá pessoal, 

Eu tenho acompanhado os posts do pessoal da Microsoft envolvidos com o portal patterns and practices e agora eles lançaram um "How to" sobre desenho de arquitetura ágil.
Para aqueles que estão estudando desenvolvimento com metodologias ágeis como XP ou Scrum vale a pena dar uma olhada nesse material.


Abraços,

quarta-feira, 12 de novembro de 2008

Acesso a pastas ou arquivos de outra máquina

O código abaixo demonstra como exibir arquivos ou pastas de uma outra máquina que não seja a máquina na qual se encontra a aplicação.

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Diagnostics; 
using System.IO; 
using System.Net; 
using System.Security.Principal; 
using System.Runtime.InteropServices;

namespace Cronos.Testes 
{ 
    class Program 
    {

        [DllImport("advapi32.dll", SetLastError = true)] 
        private static extern bool LogonUser(string lpszUsername 
                                            , string lpszDomain 
                                            , string lpszPassword 
                                            , int dwLogonType 
                                            , int dwLogonProvider 
                                            , ref IntPtr phToken);

        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        private static extern bool CloseHandle(IntPtr handle);

        [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)] 
        public extern static bool DuplicateToken(IntPtr existingTokenHandle 
                                                , int SECURITY_IMPERSONATION_LEVEL 
                                                , ref IntPtr duplicateTokenHandle);


        // logon types 
        const int LOGON32_LOGON_INTERACTIVE = 2; 
        const int LOGON32_LOGON_NETWORK = 3; 
        const int LOGON32_LOGON_NEW_CREDENTIALS = 9;

        // logon providers 
        const int LOGON32_PROVIDER_DEFAULT = 0; 
        const int LOGON32_PROVIDER_WINNT50 = 3; 
        const int LOGON32_PROVIDER_WINNT40 = 2; 
        const int LOGON32_PROVIDER_WINNT35 = 1;

        static void Main(string[] args) 
        { 
            IntPtr token = IntPtr.Zero; 
            IntPtr dupToken = IntPtr.Zero;

            bool isSuccess = LogonUser("[myUser]" 
                                        , @"[myDomain]" 
                                        , @"[myPass]" 
                                        , LOGON32_LOGON_NEW_CREDENTIALS 
                                        , LOGON32_PROVIDER_DEFAULT 
                                        , ref token);

            WindowsIdentity newIdentity = new WindowsIdentity(token); 
            WindowsImpersonationContext impersonatedUser = newIdentity.Impersonate();

            DirectoryInfo dirInfo = new DirectoryInfo(@"\\[caminho ou ip da outra máquina]\C$\"); 
            FileInfo[] files = dirInfo.GetFiles();


            for (int i = 0; i <> 
            { 
                Console.WriteLine(files[i].Name); 
            }

            Console.Read(); 
        } 
    } 
}

Créditos: Luiz Fernando.

quarta-feira, 5 de novembro de 2008

Utilitário - Cronos Creation Db Files

Olá pessoal, 

Eu criei (copiei - o sql scripter faz a mesma coisa além de outros recursos, só que agora é pago!!) um utilitário que gera arquivos em format *.sql para geração / atualização de registros em banco de dados SQL Server.

Pretendo disponibilizar esse mesmo utilitário para trabalhar com outros bancos de dados, mas ainda não tenho uma previsão, mas em todo caso vale a pena conferir.

Aguardo sugestões de todos ok?