quinta-feira, 29 de julho de 2010

Dificuldades na migração para POO

Quem não está acostumado à POO, ou programou muito tempo de maneira estruturada, orientada a eventos ou de forma sequencial/batch ("linguiçal" ) tem dificuldades para
aprender um novo paradigma, por exemplo a Programação Orientada a Objetos. (Novo? POO é anterior ao meu nascimento.... )

O que gera bastante dúvida e dificuldades para quem que mudar de paradigma é que tem várias "escolas/linhas de pensamento" diferentes. Não adianta, embora programação
tenha uma afinidade e até uma intimidade com a matemática, no lado das exatas, a programação é uma arte. Por mais que se inventem padrões e metodologias, sempre faverá
n+1 maneiras de se chegar à um pensamento abstrato ou uma lógica ou um algoritmo que faça a mesma coisa.

Quem ensina costuma misturar a análise orientada a objeto e a programação orientada a objeto tudo na mesma panela, junto com UML.
"E não é a mesma coisa?" você pode estar se perguntando. Não, não é. Algumas autoridades no assunto podem me crucificar por isso, mas é minha opinião profissional.
Agente sabe que, embora a análise mande criar apenas objetos que possam ser representações de objetos físicos no mundo real, na programação acabam surgindo objetos
artificiais simplesmente para envelopar ou empacotar dados, ou facilitar e automatizar tarefas. É esse que é o meu foco.

Alguns professores de POO pura/análise OO rejeitam os padrões de projeto, porque são classes que não tem representatividade no mundo real
(singleton, builder, Abstract Factory), além de violar conceitos de divisão de responsabilidade e encapsulamento.... anyway....
Depois que eu li o livro Padrões de Projeto, aprendi muito,
e prefiro 1000 vezes criar um programa orientado a objetos usando 80% menos linhas de código e com um acoplamento menor e menor cópia de conceitos abstratos
que violam a Análise OO do que ficar sem saber onde colocar códigos de validação, interface ou persistencia em banco de dados simplesmente porque a Análise OO
não trata desses assuntos, mas lida somente com as classes de negócio. Livros de análise OO enfatizam muito as classes de negócio, mas consideram
que o banco de dados e a interface com o usuário não são objetos "reais", representáveis no mundo físico.

Sempre ouço profissionais das linguagens antigas dizer que não é necessário ter uma linguagem com recursos OO para programar
sob este paradigma. Programadores do antigo C, Pascal e até Clipper podiam simular POO criando estruturas e records escondidos para encapsular dados publicos, funções para
inicializar ou retornar esses dados, simulando construtores, membros de records como ponteiros para funções, simulando métodos. Tudo o que deveria ser privado ou encapsulado
poderia ser precedido de um prefixo, como __ (2 underlines), para que fossem um tanto quanto "invisíveis" por outros programadores ou unidades, e colocando-as na seção de
implementação, se por exemplo estiver usando Pascal.

Na verdade, o fato de você praticar a separação de conceitos, separação de responsabilidades, fragmentar métodos gigantes macarrônicos em pequenos métodos que
fazem pouca coisa, ou que façam algo pouco significativo ou mais abstrato, já é meio caminho andado para chegar a programar orientado a objetos.

Isso mostra que a programação orientada a objetos, e qualquer outro paradigma, está mais relacionada com a maneira de pensar do que com a programação ou ferramenta em si. E POO não é o único
paradigma "novo". Existem ainda outros mais novos e pouco explorados, como a programação orientada a serviços, a programação orientada a aspectos (AOP) e uma nova
febre de programação funcional, que surgiu com novas reciclagens de linguagens funcionais como o F#.

A programação funcional, por exemplo, é muito semelhante à matemática, com suas noções de funções, conjuntos etc... Para um matemático, será muito fácil aprender programação
funcional já que ele já tem afinidade com essa maneira de pensar.

Voltando à POO, o paradigma por si só não é garantia de software de qualidade. Já vi muitos programadores criarem programas com classes, herança, etc... e mesmo assim não ser um programa
orientado a objeto. (estaria mais para programa orientado a classes).
Muita programação (Des)estruturada ou macarrônica se faz em linguagens orientadas a objeto.

O melhor modo de aprender POO é treinar. A qualidade do software, independente do paradigma, vai ser assegurada por:
  1. Nunca use copiar-colar de código
  2. Separe os conceitos
  3. Separe as responsabilidades
  4. Crie estruturas únicas para juntar dados que fazem parte de um mesmo todo
  5. Variáveis de tipos primitivos são permitidas apenas dentro de funções/procedimentos
  6. Cada função/procedimento deve fazer o mínimo possível, porém ter um nome que indique exatamente o que ela faz
  7. Variáveis globais apenas para singletons, e quando realmente forem necessárias no escopo do programa inteiro
  8. Variáveis globais deveriam ser somente leitura, e apenas um único método é que poderia modificá-las
  9. Prefira referenciar indiretamente tudo o que for referenciado. (sempre cabe um intermediário entre duas partes que conversam). Isso pode ajudar a evitar acoplamentos desnecessários, principalmente entre módulos importantes do projeto

Eu tinha dificuldade para entender interfaces, até o dia que eu peguei o Livrão de Delphi (Delphi ### A Bíblia, ou Dominando o Delphi ###. A Bíblia, de Marco Cantù) e todas as revistas que falavam do assunto e li tudo de uma vez, fucei nos exemplos e talz. 

Muitos explicam as interfaces como contratos, mas isso gera muita confusão. E o proprio nome interface gera confusão. Eu prefiro enxergá-las como peças de lego,
roupas, e, a grosso modo, classes que só tem o nome do método, mas não tem implementação.

Você pode fazer um exercício: sempre que precisar fazer uma classe, faça uma interface antes da classe. Todo método público que você gostaria que tivesse na classe deve ter na interface primeiro. Aí você faz a classe implementando a interface. Ela se aproxima muito do diagrama de classes da UML, que não tem implementação, é praticamente um desenho da classe em código. Encare uma interface como uma wish list, ela deve conter os métodos que você deseja que a classe tenha, até porque se a classe implementa a interface, o compilador irá te obrigar a implementar todos os métodos.
Outro treino é o seguinte: sempre que você precisar que duas partes do sistema se comuniquem, sejam trocadas ou que cada um dos programadores desenvolva uma classe respeitando um padrão, para que elas possam se comunicar depois, você cria a interface e manda pros programadores implementarem. Pronto, sempre que precisar trocar um objeto de negócio no programa inteiro, pra mudar um comportamento, você pode escrever outra classe que implemente a interface em questão, sem que tenha nenhum grau de parentesco.

Quem está começando a fazer a verdadeira POO agora (não arrastar e colar componente em formulário) vai encontrar um longo caminho a trilhar. Eu mesmo confesso que só andei por 10% desse caminho. Ainda tenho  formulários com regras de negócio em botões e aquele evendo OnClick que faz tudo.

Desejo boa sorte e boas vindas para quem estiver entrando por esse caminho.

Have Fun ;)

quarta-feira, 28 de julho de 2010

Mais recursos para o seu blog

O blogspot está evoluindo. Está agregando alguns recursos novos e quem sabe um dia fique pau a pau com o wordpress.

Um novo recurso interessante é colocar páginas estáticas no seu blog. Esse link mostra como fazer isso.

Se você quer algo mais avançado que um simples blog, ou um blog mais profissional, você precisará de um CMS. Joomla e Wordpress são apenas dois dos milhares de CMS's que tem por aí. Quem sabe com o tempo faremos alguns posts analizando CMS's.

Esse post faz uma comparação entre joomla e wordpress.

Mas o verdadeiro motivo dos posts tagueados com Site aos Pedaços é mostrar os recursos de "penduricalhos". Aqueles scripts interessantes que agregam funcionalidades de terceiros no seu blog. Dessa vez mostrarei como agregar seu perfil no linked-in. Ideal para quem quer fazer um networking profissional, já que o linked-in é mais importante do que um currículo hoje em dia.

Vá no seu linkedIn, clique em profile - edit public profile settings e clique no link customized buttons.
Clique no link Customized Buttons

Escolha um tipo de botão e agregue o código no seu blog.
Escolha o botão que mais lhe agrade

o botão que eu escolhi foi este:
View Vitor Rubio's profile on LinkedIn

Legalzinho para colocar nos cantos ;)

Você pode usar o gadjet de HTML e Javascript para colocar o botão em uma lateral
Clique em "adicionar um gadget"
Escolha o "HTML/Javascript "

Coloque o código que você copiou do linkedIn

Arrume um lugarzinho para ele ;)


ou editar o xml do template e depois fazer o upload dele para colocar em uma posição personalizada.

Espero que as imagens estejam claras.

Have fun ;)

Mais um golpe por e-mail tendo como alvo correntistas do Bradesco

Vários golpoes novos desses aparecem por dia, então nem tem sentido postar sobre esse assunto. Mas a questão é que alguns tios e tias desavisados clicam nos links desses golpes, principalmente quando eles afirmam se tratar de atualizações de segurança.

O texto abaixo é um golpe, se você receber um e-mail semelhante classifique-o como spam imediatamente.


Bradesco S/A
ID do Cliente:
BR008953

Prezado Cliente
,
Por motivos de seguranca comunicamos a todos os clientes que, visando barrar o constante aumento de fraudes no Internet Banking Bradesco sera obrigatorio
realizar a Atualizacao do seu Cartao de Chaves de Seguranca.

Caso nao Incrementar os dados necessarios, o acesso via Caixas-Eletronicos
e Internet-Banking sera suspenso.

Utilize o botao abaixo para efetuar a atualizacao:

Incrementar Dados
Agora


Atencao: A Atualizacao obrigatoria e de responsabilidade do cliente. O Banco Bradesco S/A nao se responsabilizara por danos sofridos caso as chaves nao sejam atualizadas.
| Bradesco Noticias | Fale Conosco | Oportunidades de Carreira | Politica de Qualidade | Politica de RH | Rede de Atendimento |


Bom, tá avisado.

sexta-feira, 16 de julho de 2010

Outra camiseteria interessante: Chico Rei

Quer me presentear? Segue wish list.

http://www.chicorei.com.br/delivery/produtos_descricao.asp?lang=pt_BR&codigo_produto=546
http://www.chicorei.com.br/delivery/produtos_descricao.asp?lang=pt_BR&codigo_produto=494
http://www.chicorei.com.br/delivery/produtos_descricao.asp?lang=pt_BR&codigo_produto=389
http://www.chicorei.com.br/delivery/produtos_descricao.asp?lang=pt_BR&codigo_produto=375

terça-feira, 13 de julho de 2010

Smash Bros Brawl

Aew Pessoal, quem quiser jogar uma partidinha de Smash Bros Brawl comigo basta adicionar meu Friend Code:

3395-7927-2098


Dica: Todos os personagens secretos podem ser abertos pelo modo solo, pelo novo mode de aventura mas também jogando várias vezes no modo versus.

Por exemplo, para abrir o Nes basta jogar 5 vezes no Brawl. Para abrir o luigi basta terminar o modo solo sem usar continues ou jogar 22 vezes no Brawl.

Tendo jogado 500 vezes no modo versus você já terá todos os personagens secretos abertos.

Have fun :)

segunda-feira, 12 de julho de 2010

Capturar janelas, classes e textos com o lazarus

No meu artigo sobre a api do windows eu já mencionei sobre a importância de um programinha que identifique as janelas, handles e clases do windows.

Muitos programas nos "baixaki" da vida fazem isso, e alguns debuggers e cheaters para games também. Mas a maior utilidade que vejo para um programinha assim é poder identificar nomes de classes e handles de janelas não feitas por você, para interagir com sua aplicação.

Seja para colocar uma janela externa como child da sua, seja para capturar o conteudo de um textbox em outra janela, esse tipo de aplicação pode ser útil.

Eu usei muito para descobrir quais eram as classes por trás de alguns editores de propriedade e / ou editores de componentes não documentados do Delphi 7 para fazer meus próprios.

Hoje vamos fazer uma aplicaçãozinha dessas em lazarus.

Primeiro de tudo baixe a última versão do lazarus no site oficial.

Depois de instalado, a instalação é bem simples, inicie um novo projeto e crie uma janela como a da figura 1.

figura 1: uma janela fina, com um botão que não faz nada, só de teste, um label, e um timer

Colocamos nessa janela apenas um botão, um label, chamado lblHandle e um timer. O timer conterá toda a lógica do programa.

O botão servirá apenas como um teste dentro da propria janela, mas o objetivo do programa é que funcione para qualquer janela feita com a api do windows.

Janelas feitas com outras api's gráficas, como gtk, não funcionarão.

O objetivo do programa é mostrar o handle, o nome de classe e o texto de qualquer janela ou controle "windowed" de qualquer programa pelo qual estivermos passando a seta do mouse em um dado momento.

figura 2: o programa em funcionamento mostra o handle do visor da calculadora do windows

Para isso digite o código da listagem abaixo no evento onTimer do timer.


procedure TForm1.Timer1Timer(Sender: TObject);
var
   //criamos dois pchars, um para o nome da classe (c) e outro para o texto da janelas (t)
   t,c: pchar;
   //para obter um handle (na verdade um handle é um inteiro de 4 bytes sem sinal)
   h: Thandle;
   //usaremos um ponteiro para a estrutura POINT para obter a posição da seta do mouse
   p: PPOINT;
begin

     try
        try

           //vamos alocar memoria para o nosso PPoint com new, visto que é uma estrutura simples
           new(p);
           //para c e t usaremos getmem porque trata-se de vetores/strings. Limitaremos a 255 caracteres neste exemplo.
           GetMem(t, 255);
           GetMem(c, 255);

           //preenchemos todo o conteudo da memória alocada com #0 para que strings menores que 255 caracteres possam terminar com um #0 no seu final sem concatenar com lixo randomico de memória
           FillChar(c^, 255, #0);
           FillChar(t^, 255, #0);

           //obtemos a posição do cursor
           GetCursorPos(p);

           //obtemos o handle nesse ponto
           h := WindowFromPoint(p^);

           //obtemos o texto dessa janela (handle)
           GetWindowText(h, t, 255);

           //e o nome da classe (no caso de programas feitos em Delphi, há a vantagem de o nome da classe na api ser igual ao nome da classe na sua unit.pas)
           GetClassName(h, c, 255);

           //mostramos as informações no handle
           lbHandle.Caption := 'Handle: ' + IntToStr(h) + ' - Texto: ' + string(t) + ' - Classe: ' + string(c);

        except

        end;
     finally

            //desalocamos a memória
            dispose(p);
            Freemem(t);
            Freemem(c);

     end;

end;    
  

Veja que é importante desalocar a memória dentro de um bloco finally para garantir que não ocorram leaks (vazamentos de memória).

Você pode baxar os fontes aqui.

Espero que seja útil para vocês quanto foi para mim.

Amanhã teremos mais dicas do Lazarus.

Have Fun ;)

idg now as vezes faz umas matérias bobas, com cara de década de 80

Primeiro leia a matéria. http://idgnow.uol.com.br/blog/plural/2010/07/12/o-lado-obscuro-das-midias-sociais/

Essa foi só mais uma das várias babaquices que rolou hoje, 12/07/2010. Sei lá. As vezes o idg now parece que é o melhor canal para notícias de TI imparciais, e as vezes parece que apela para o fanatismo e sensacionalismo do senso cumum.

Acredito que quando eram pouquíssimas as pessoas que tinham acesso a internet e a redes sociais o cenário era outro. Expor informações pessoais dessas pessoas geraria um risco de sequestro mais pelo fato de que quem tinha acesso a internet era a elite. 
Agora, com tantas pessoas acessando a internet, o risco de um estuprador ou sequestrador escolher você dentre tantos usuários é o mesmo de ele escolher você dentre tantos transeuntes na praça da Sé.
Qualquer bandido pode descobrir seu endereço, exatamente onde você mora, e se você tem filhos e onde eles estudam e como molestá-los simplesmente por dar algumas voltas no seu quarteirão e observar os horários que  você entra ou sai. 
Mais uma vez o bom senso fala mais alto. Para um usuário que é freelance, como um web designer, é importante que ele divulgue sim o que faz, como faz, com o que trabalha, onde trabalha. O risco é o mesmo de ele ter um pequeno comércio, digamos, uma lojinha, com a porta aberta o dia inteiro. Quem entrar pode ser cliente ou pode ser assaltante, mas creio que o retorno financeiro possa compensar o risco.
Se quem acessa as redes sociais é um blogueiro profissional, jornalista, colunista, escritor, cronista ou fotógrafo, mais importante do que o dinheiro é o próprio feedback e reconhecimento da comunidade para a qual ele escreve, que não tem preço. 
Isso sem contar o que ele pode ganhar em anúncios.

quarta-feira, 7 de julho de 2010

Twitter das editoras

Sempre fui apaixonado por livros. Tanto que hoje trabalho em uma editora.

Seguir as editoras no Twitter pode ser interessante tanto para receber notícias como para saber em primeira mão sobre lançamentos de livros.

Abaixo segue uma lista do tweeter de algumas editoras. Se conhecerem outras, por favor postem que eu complemento a lista.


Cosac Naify – @cosacnaify
Mundo Cristão – @mundocristao
L&PM Editores – @LePM_Editores
Bookess – @Bookess
Editora Novitas – @Editoranovitas
Editora Europa – @editoraeuropa
Bookman Editora – @BookmanEditora
Intrínseca – @intrinseca
Conrad Editora – @conradeditora
Editora Saraiva – @editorasaraiva
Jorge Zahar Editor – @JZahar
2AB Editora – @2ABEditora
Companhia das Letras – @cialetras
W4 Editora – @w4editora
Editora Contexto – @editoracontexto
Galera Record – @galerarecord
Edições Rosari – @EdicoesRosari
Suma de Letras – @Suma_BR
Editora Sextante – @sextante
Editora Planeta – A_Planeta
Globo Livros – @GloboLivros
Não Editora  - @naoeditora
Novatec Editora – @novateceditora
Editora Emt – @editoraemt
Editorial Record – @editora_record
Editora Degustar – @degustar
Ficções Editora – @FiccoesEditora
Editora Gente – @EditoraGente
Martins Editora – @martinseditora
Editora Hedra – @hedraonline
MOJO Books – @mojobooks
Abril Coleções – @abrilcolecoes
Elsevier Editora – @CampusElsevier
Editora Vida e Consciência – @vidaconsciencia
Bertrand Brasil – @EditoraBertrand
Editora Nova Fronteira – @ednovafronteira
Editora Aleph – @editora_aleph
Editora As Américas – @as_americas
Thomas Nelson Brasil – @blogdoseditores
Arraes Editores – @arraeseditores
Global Editora – @globaleditora
Editora Alta Books – @alta_books
Realejo Livros – @realejolivros
Editora Mauad X – @EditoraMauadX
Editora Ex Libris – @exlibrisbooks
Autêntica Editora – @autentica_ed
Editora Agir – @agireditora
Editora Universitária UNEB – @EDUNEB
Editora Leopoldianum – @Leopoldianum
Pallas Editora – @pallaseditora
Editora PUC-Rio – @editorapucrio
Editora da Universidade Federal da Bahia – @EDUFBA
Editora Leya -  @EditoraLeya
Editora Nobel – @editoranobel
Editora Porto de Ideias – @portodeideias
Editora Garamond – @EditoraGaramond
Papirus Editora – @PapirusEditora
Editora Plus – @editoraplus
Editora Vozes – @Editora_Vozes
Terceiro Nome – @TerceiroNome
Bom Texto Editora – @bomtextoeditora
Ícone Editora – @iconeeditora
Editora da Universidade do Estado do Rio de Janeiro – @EdUERJ
Primavera Editorial – @primaveraeditor
Editora Manole – @editoramanole
Sá Editora – @saeditora
BEI Editora – @beieditora
Editora Devir – @DEVIR_LIVRARIA
Editora Draco – @editoradraco
Editora Letras e Magia – @letrasemagia
Editora Paz e Terra – @pazeterra
Editora Casa da Palavra – @edcasadapalavra

segunda-feira, 5 de julho de 2010

BizInformation - Veja quanto vale o seu site

Para blogs técnicos, sites pessoais e portfólios pode ser muito atraente mostrar quanto o seu site vale.
Melhor ainda para sites de comércio ou serviços, que podem ser "vendidos".
Além de mostrar um valor "tangível" para o site, a informação pode servir tanto para quem está avaliando o site como para quem está avaliando  o profissional.
O site http://bizinformation.org/br/ provê esse serviço de, baseado em estatísticas de visitantes, calcular o valor estimado de um site.
O serviço ainda provê um selo que pode ser adicionado ao seu site mostrando quanto ele vale aproximadamente.
Uma limitação é que o valor no selo não se atualiza automaticamente com o tempo, mediante scripts no servidor, mas é estático.
Com a adição do script será visualizado um selo como este:



My site is worth

$2,515.4


Your website value?





Have fun \(^^)/

Postagens populares

Marcadores

delphi (60) C# (31) poo (21) Lazarus (19) Site aos Pedaços (15) sql (13) Reflexões (10) .Net (9) Humor (9) javascript (9) ASp.Net (8) api (8) Básico (6) Programação (6) ms sql server (5) Web (4) banco de dados (4) HTML (3) PHP (3) Python (3) design patterns (3) jQuery (3) livros (3) metaprogramação (3) Ajax (2) Debug (2) Dicas Básicas Windows (2) Pascal (2) games (2) linguagem (2) música (2) singleton (2) tecnologia (2) Anime (1) Api do Windows (1) Assembly (1) Eventos (1) Experts (1) GNU (1) Inglês (1) JSON (1) SO (1) datas (1) developers (1) dicas (1) easter egg (1) firebird (1) interfaces (1) introspecção (1) memo (1) oracle (1) reflexão (1)