<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6561618565030895032</id><updated>2024-08-28T21:43:31.373-03:00</updated><category term="desenvolvimento em camadas"/><title type='text'>El Pablón</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>9</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-8031241007559727770</id><published>2016-02-18T14:26:00.000-02:00</published><updated>2016-02-18T14:26:55.318-02:00</updated><title type='text'>Equalizar tabelas tomando como base um banco de dados</title><content type='html'>Olá a todos!&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Já deve ter acontecido contigo: precisar mandar um script de BD para algum cliente mas ninguém faz idéia da versão que o banco de dados do cliente está.&lt;/div&gt;
&lt;div&gt;
Enfim, já passei por isso diversas vezes e tinha que assumir que o banco de homologação interno da empresa seria o correto. Então eu fiz esse script para tentar simplificar (um pouco) a minha vida ao equalizar tabelas de clientes. Segue abaixo o código:&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;pre  style=&quot;font-family:arial;font-size:12px;border:1px dashed #CCCCCC;width:99%;height:auto;overflow:auto;background:#f0f0f0;;background-image:URL(https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiFcs150ww_Y3E9WTrbcOM2Nj3LPZ1fNAK4msyG9zyFAXokFWrk9nBLGkB0Gr8U07SMP1A0IfSVcaOH9rDrlVTukivSqT7Z2MuYSMwjMv8dk_JKhWpyltTdBM18fWW8RojeJ1tevg18s4Ct/s320/codebg.gif);padding:0px;color:#000000;text-align:left;line-height:20px;&quot;&gt;&lt;code style=&quot;color:#000000;word-wrap:normal;&quot;&gt; /******************************************************************************  
 Objective...: Gerar um script de equalização tomando como base um database.  
 Author......: Paulo E. Scatena  
 Date........: 2015-04-05  
 *******************************************************************************/  
 /*Prefixo de tabelas - para gerar script somente de um range específico de tabelas   
 (por nome de objeto)*/  
 DECLARE @PREFIXO VARCHAR(10) = &#39;&#39;  
 SET NOCOUNT ON  
 DECLARE @T_NAME VARCHAR(255),  
           @C_NAME VARCHAR(255),  
           @C_TYPE VARCHAR(255),  
           @C_ISNL VARCHAR(3),  
           @C_LENC INT,  
           @C_LENN     INT,  
           @C_LENP     INT,  
           @C_DEF VARCHAR(255),  
           @C_COLL VARCHAR(255),   
           @U_TBL VARCHAR(255) = &#39;&#39;,  
           @C_1ST BIT = 1,   
           @LINE_SEM_DF VARCHAR(MAX),  
           @IDT BIT = 0  
 CREATE TABLE #T_T (L BIGINT IDENTITY(1,1), LINE VARCHAR(5000))  
 CREATE TABLE #T_C (L BIGINT IDENTITY(1,1), TBL VARCHAR(255), LINE VARCHAR(5000))  
 DECLARE CUR_COLUMNS CURSOR FAST_FORWARD FOR            
 SELECT ISNULL(T.TABLE_NAME, &#39;&#39;),   
        ISNULL(COLUMN_NAME, &#39;&#39;),   
        ISNULL(DATA_TYPE, &#39;&#39;),   
        ISNULL(IS_NULLABLE, &#39;&#39;),   
        ISNULL(CHARACTER_MAXIMUM_LENGTH, 0),   
        ISNULL(NUMERIC_PRECISION, 0),   
        ISNULL(NUMERIC_SCALE, 0),   
        ISNULL(COLUMN_DEFAULT, &#39;&#39;),   
        ISNULL(COLLATION_NAME, &#39;&#39;),  
        CASE WHEN EXISTS(SELECT 1 FROM sys.identity_columns WHERE name = C.COLUMN_NAME) then 1 else 0 end  
 FROM INFORMATION_SCHEMA.COLUMNS C INNER JOIN INFORMATION_SCHEMA.TABLES T ON  
 (C.TABLE_NAME = T.TABLE_NAME)  
 AND T.TABLE_TYPE = &#39;BASE TABLE&#39;  
 AND (ISNULL(@PREFIXO, &#39;&#39;) = &#39;&#39; OR T.TABLE_NAME LIKE &#39;%&#39; + @PREFIXO + &#39;%&#39;)  
 AND T.TABLE_NAME NOT LIKE &#39;SYS%&#39;  
 ORDER BY T.TABLE_NAME  
 OPEN CUR_COLUMNS  
 FETCH NEXT FROM CUR_COLUMNS INTO  
      @T_NAME,  
      @C_NAME,   
      @C_TYPE,   
      @C_ISNL,   
      @C_LENC,  
      @C_LENN,  
      @C_LENP,  
      @C_DEF,  
      @C_COLL,  
      @IDT  
 WHILE @@FETCH_STATUS = 0  
 BEGIN  
      /*Parte do Create Table*/  
      IF(@T_NAME &amp;lt;&amp;gt; @U_TBL)  
      BEGIN  
           IF(@U_TBL &amp;lt;&amp;gt; &#39;&#39;)  
                INSERT INTO #T_T(LINE) VALUES (&#39;)&#39;)  
           SET @C_1ST = 1  
           INSERT INTO #T_T(LINE) VALUES(&#39;IF(NOT EXISTS(SELECT 1 FROM SYSOBJECTS WHERE ID = OBJECT_ID(&#39;&#39;&#39; + ISNULL(@T_NAME, &#39;&#39;) + &#39;&#39;&#39;)))&#39;)  
           INSERT INTO #T_T(LINE) VALUES(&#39;CREATE TABLE DBO.&#39; + ISNULL(@T_NAME, &#39;&#39;) + &#39;(&#39;)       
      END  
      DECLARE @LINE VARCHAR(5000)  
      DECLARE @NN VARCHAR(20) = &#39;&#39;  
      DECLARE @DF VARCHAR(100) = &#39;&#39;  
      DECLARE @SZ VARCHAR(30) = &#39;&#39;  
      DECLARE @CN VARCHAR(100) = &#39;&#39;  
      DECLARE @IDENT VARCHAR(100) = &#39;&#39;  
      IF(@C_TYPE NOT IN (&#39;int&#39;, &#39;datetime&#39;, &#39;bit&#39;, &#39;bigint&#39;, &#39;tinyint&#39;, &#39;text&#39;, &#39;uniqueidentifier&#39;,   
           &#39;money&#39;, &#39;smalldatetime&#39;, &#39;smallint&#39;, &#39;image&#39;, &#39;binary&#39;))  
      BEGIN  
           SET @SZ = &#39;(&#39; + LTRIM(RTRIM(  
                CASE WHEN @C_LENN &amp;lt;&amp;gt; 0 THEN STR(@C_LENN)   
                      WHEN @C_LENC &amp;lt;&amp;gt; 0 THEN  
                          CASE WHEN @C_LENC &amp;lt;&amp;gt; -1 THEN STR(@C_LENC) ELSE &#39;MAX&#39; END  
                END +   
                     CASE WHEN ISNULL(@C_LENP, 0) &amp;lt;&amp;gt; 0 THEN &#39;,&#39; + LTRIM(RTRIM(STR(@C_LENP))) ELSE &#39;&#39; END)) +   
                &#39;)&#39;  
      END  
      SET @NN = CASE WHEN @C_ISNL = &#39;NO&#39; THEN &#39;NOT NULL&#39; ELSE &#39;&#39; END  
      SET @DF = CASE WHEN @C_ISNL = &#39;YES&#39; AND @C_DEF = &#39;&#39; THEN  
                &#39; DEFAULT &#39; +   
                CASE   
                     WHEN @C_TYPE IN (&#39;varbinary&#39;, &#39;binary&#39;, &#39;int&#39;, &#39;numeric&#39;, &#39;money&#39;, &#39;smallint&#39;, &#39;bigint&#39;, &#39;decimal&#39;) THEN &#39;0&#39;  
                     WHEN @C_TYPE IN (&#39;datetime&#39;, &#39;smalldatetime&#39;) THEN &#39;(getdate())&#39;  
                ELSE &#39;&#39;&#39; &#39;&#39;&#39;  
                END  
           ELSE  
                CASE WHEN @C_ISNL = &#39;YES&#39; AND @C_DEF &amp;lt;&amp;gt; &#39;&#39; THEN   
                     CASE WHEN @C_DEF NOT LIKE &#39;%NULL%&#39; THEN     &#39; DEFAULT &#39; + @C_DEF ELSE &#39;DEFAULT &#39;&#39; &#39;&#39;&#39; END  
                ELSE  
                     &#39; &#39;  
                END  
           END  
      SET @CN = CASE WHEN @C_COLL &amp;lt;&amp;gt; &#39;&#39; THEN &#39;COLLATE &#39; + @C_COLL ELSE &#39;&#39; END  
      SET @LINE = @C_NAME + &#39; &#39; + @C_TYPE + &#39; &#39; +   
           CASE WHEN @SZ &amp;lt;&amp;gt; &#39;&#39; THEN @SZ ELSE &#39;&#39; END + &#39; &#39; +   
           CASE WHEN @CN &amp;lt;&amp;gt; &#39;&#39; THEN @CN ELSE &#39;&#39; END + &#39; &#39; +   
           CASE WHEN @DF &amp;lt;&amp;gt; &#39;&#39; THEN @DF ELSE &#39;&#39; END + &#39; &#39; +             
           CASE WHEN @NN &amp;lt;&amp;gt; &#39;&#39; THEN @NN ELSE &#39;&#39; END + &#39; &#39;  
      SET @IDENT = CASE WHEN @IDT = 1 THEN &#39; IDENTITY(1,1)&#39; ELSE &#39;&#39; END   
      -- No alter table, o comando vai sem NOT NULL e nem default pois é só para equalizar banco  
      SET @LINE_SEM_DF = @C_NAME + &#39; &#39; + @C_TYPE + &#39; &#39; +   
           CASE WHEN @SZ &amp;lt;&amp;gt; &#39;&#39; THEN @SZ ELSE &#39;&#39; END + &#39; &#39; +   
           @IDENT +  
           CASE WHEN @CN &amp;lt;&amp;gt; &#39;&#39; THEN @CN ELSE &#39;&#39; END + &#39; &#39;        
      INSERT INTO #T_T(LINE) VALUES(  
           CASE WHEN @C_1ST = 0 THEN &#39;,&#39; ELSE &#39;&#39; END +     @LINE)  
      INSERT INTO #T_C(TBL, LINE) VALUES (@T_NAME, &#39;IF(NOT EXISTS(SELECT 1 FROM SYSCOLUMNS WHERE ID = OBJECT_ID(&#39;&#39;&#39; + @T_NAME + &#39;&#39;&#39;) AND NAME = &#39;&#39;&#39; + @C_NAME + &#39;&#39;&#39;))&#39;)  
      INSERT INTO #T_C(TBL, LINE) VALUES(@T_NAME, &#39;ALTER TABLE [&#39; + @T_NAME + &#39;] ADD &#39; + @LINE_SEM_DF)  
      INSERT INTO #T_C(TBL, LINE) VALUES(@T_NAME, &#39;GO&#39;)  
      SET @U_TBL = @T_NAME  
      SET @C_1ST = 0  
 FETCH NEXT FROM CUR_COLUMNS INTO  
      @T_NAME,  
      @C_NAME,   
      @C_TYPE,   
      @C_ISNL,   
      @C_LENC,  
      @C_LENN,  
      @C_LENP,  
      @C_DEF,  
      @C_COLL,  
      @IDT  
 END  
 CLOSE CUR_COLUMNS  
 DEALLOCATE CUR_COLUMNS       
 INSERT INTO #T_T(LINE) VALUES (&#39;)&#39;)  
 PRINT &#39;/*Criação de tabelas - Table Creation*/&#39;  
 SELECT LINE FROM #T_T  
 ORDER BY L  
 PRINT &#39;/*Ajustes de tabelas - Column Adjustments*/&#39;  
 SELECT LINE FROM #T_C  
 ORDER BY L  
 DROP TABLE #T_T  
 DROP TABLE #T_C  
 SET NOCOUNT OFF  
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Espero que ajude!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Grande abraço e até a próxima!&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/8031241007559727770/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/8031241007559727770' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/8031241007559727770'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/8031241007559727770'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2016/02/equalizar-tabelas-tomando-como-base-um.html' title='Equalizar tabelas tomando como base um banco de dados'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-4248906775733814284</id><published>2015-11-13T02:05:00.000-02:00</published><updated>2015-11-13T02:05:04.164-02:00</updated><title type='text'>A importância de se manter calmo</title><content type='html'>Apesar do assunto no geral ser tecnologia, dessa vez eu vou sair um pouco do foco.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Acabei de perder uma chance única de trabalhar na Europa porque eu fiquei nervoso demais pra pensar claramente. Pois é... Eu estava com a faca e o queijo na mão para imigrar pra Europa como imigrante qualificado e por causa de besteira minha, perdi a chance.&lt;/div&gt;
&lt;div&gt;
O pior de tudo é que ao sair da empresa em que fiz a entrevista, 5 minutos depois, os programas que eu deveria ter escrito apareceram como mágica na minha cabeça.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
O que eu quero dizer com isso tudo? Inteligência emocional. Demonstrei que não tenho tanta assim e ao invés de pedir 5 minutos pra respirar um pouco e refletir melhor sobre as decisões que eu tomaria, fui querer dar uma de Braddock e encarar o desafio do jeito que ele veio. Óbvio que as minhas chances foram a zero quando fiz isso. Nessa hora não importa capacidade técnica, experiência, preparo, nada... Basta manter-se calmo.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Não posso culpar a empresa por não me querer no seu quadro de funcionários, afinal, eles já tinham feito muito por mim me levando até a Europa para que eu pudesse fazer a entrevista com eles. A culpa disso tudo é minha e somente minha. Daí a importância de se manter calmo, pensar devagar, não se importar com a pressão em volta e fazer o seu, sem problemas. Me prendi demais a um framework, esqueci de contar complexidade algorítmica, na fácil notação Big O. Enfim, meti os pés pelas mãos e só um milagre faria efeito naquela hora.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
Triste, mas é vida que segue.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/4248906775733814284/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/4248906775733814284' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/4248906775733814284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/4248906775733814284'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2015/11/a-importancia-de-se-manter-calmo.html' title='A importância de se manter calmo'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-3235444354285422811</id><published>2014-12-02T00:17:00.000-02:00</published><updated>2014-12-02T00:18:43.198-02:00</updated><title type='text'>Cuidado com o excesso de especialização!</title><content type='html'>Olá a todos!&lt;br /&gt;
&lt;br /&gt;
A especialização no geral é uma coisa boa tende a te render certa fama. O chato é deixar acontecer aquela máxima de que &quot;Para quem é muito bom com martelo, tudo vira prego&quot;.&lt;br /&gt;
&lt;br /&gt;
Pois é, às vezes precisamos recuar um pouco nas convicções e reavaliar se o caminho que estamos seguindo é realmente o melhor, ou se realmente aquela técnica ou tecnologia que nos é tão familiar é a melhor forma.&lt;br /&gt;
&lt;br /&gt;
Já ví gente substituindo foreach por iterator só porque acha que é melhor implementar Design Patterns. Ok, os padrões de projeto tem sim o seu mérito, mas na minha opinião (que pode valer porcaria nenhuma...) só justificam a sua utilização quando o projeto tem tamanho para isso. Eu acho que escreve-se muito para obter o mesmo resultado (com a vantagem de ser escalável, claro!!). Para o usuário final, não importa qual foi a metodologia utilizada, desde que funcione.&lt;br /&gt;
&lt;br /&gt;
Não entenda isso como uma licença poética para escrever programas porqueiras. Não é isso. O que eu quero dizer aqui é que toda técnica tem algum uso em alguma situação. O nosso trabalho como programadores envolve entender essas situações e apresentar a melhor solução possível. Às vezes, o prazo, orçamento, pressa do usuário, etc, vão justificar muito mais a implementação do foreach, já que o objetivo (neste caso específico) é percorrer uma lista qualquer.&lt;br /&gt;
&lt;br /&gt;
Aí alguém vai te dizer &quot;Implemente padrões de projetos!! O seu software vai ficar fácil de manter, bla, bla, bla...&quot;. Deixe-me contar um segredo: quem programa mal continua programando mal, mas com padrões de projeto. Eles não substituem a lógica de programação. Só dão uma nova abordagem à técnica.&lt;br /&gt;
&lt;br /&gt;
Enfim, a idéia desse post é tentar te colocar em linha com o Keep It Simple.&lt;br /&gt;
&lt;br /&gt;
Grande abraço!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/3235444354285422811/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/3235444354285422811' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/3235444354285422811'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/3235444354285422811'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2014/12/cuidado-com-o-excesso-de-especializacao.html' title='Cuidado com o excesso de especialização!'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-1914759322130501396</id><published>2013-04-10T06:43:00.001-03:00</published><updated>2013-04-10T06:43:12.403-03:00</updated><title type='text'>Larga a mão de ser micreiro!</title><content type='html'>Micreiro. Esse é praticamente o início de todo programador. No começo da carreira, a maioria dos programadores tem seu estágio &quot;Che Guevara&quot;,&amp;nbsp;querendo mudar o mundo e&amp;nbsp;desenvolver softwares livres, com linguagens open source.&lt;br /&gt;
&lt;br /&gt;
Não importa se foi com Perl, Python, PHP, etc, principalmente se você assistiu àqueles filmes como &quot;Jogos de Guerra&quot;, &quot;Matrix&quot;&amp;nbsp;ou &quot;Hackers&amp;nbsp;- Piratas de computador&quot;. Todo aquele glamour de desenvolver softwares para invasão, vírus de computador, war dialing, azucrinar as grandes corporações...&lt;br /&gt;
Seria&amp;nbsp;legal,&amp;nbsp;se não precisássemos de comida, água, energia elétrica. Mas não é assim:&amp;nbsp;portanto é imprescindível que exista uma fonte de renda.&lt;br /&gt;
&lt;br /&gt;
Nessa hora&amp;nbsp;você&amp;nbsp;ignora o seu Karl Marx interior,&amp;nbsp;encara o mercado e vai numa APInfo da vida&amp;nbsp;procurar emprego como programador PHP, por exemplo. Salvo exceções (sim! Elas existem!), você vai trabalhar feito um camelo por um salário digamos, ridículo. Estamos falando aqui de vaga&amp;nbsp;pagando R$ 900,00 para turnos de 10 horas em média para profissional em nível pleno ou até sênior. Fora que você vai precisar de dois idiomas, proatividade, motivação por desafios e toda aquela papagaiada que os RHs adoram pregar. Quando eu vejo uma vaga dessas, a minha vontade é de&amp;nbsp;bater&amp;nbsp;no infeliz que teve a coragem de publicá-la com um gato morto não até miar, mas até cantar as Bodas de Fígaro sem desafinar.&lt;br /&gt;
&lt;br /&gt;
Então fica a pergunta: dá pra ganhar dinheiro com programação?&lt;br /&gt;
Sim! É possível voltando ao título desse post. Essa&amp;nbsp;é uma frase de um amigo, quando a&amp;nbsp;uns 8 anos eu comentei que faria um curso para administração de PostgreSQL. E assim como você quando leu o título desse post, eu me senti meio contrariado.&amp;nbsp;Eu conhecia VB6, SQL Server, etc (dada a época...), mas achava que eram ferramentas caras demais pro&amp;nbsp;que faziam. Só que&amp;nbsp;para ganhar dinheiro com informática tem que&amp;nbsp;usar o que o mercado usa: SQL Server, Oracle, .Net. O Java é a exceção das linguagens open source, pois paga melhor,&amp;nbsp;mas tem que negociar bem ao entrar na empresa. &lt;br /&gt;
&lt;br /&gt;
Em suma, não sou baba ovo de Microsoft, Oracle, etc, mas quem dita os caminhos é o mercado. Se a maioria usa ferramentas proprietárias, vale a pena investir&amp;nbsp;tempo nessas tecnologias. O retorno é mais rápido, fora que projetinho em PHP dá pra fazer por fora depois, certo?&lt;br /&gt;
&lt;br /&gt;
Grande abraço e até a próxima!</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/1914759322130501396/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/1914759322130501396' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/1914759322130501396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/1914759322130501396'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2013/04/larga-mao-de-ser-micreiro.html' title='Larga a mão de ser micreiro!'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-8524137759732720567</id><published>2012-12-14T01:15:00.002-02:00</published><updated>2012-12-14T01:15:34.642-02:00</updated><title type='text'>So, you wanna be a programmer.</title><content type='html'>Então, você quer ser um programador. Ok. Mas por onde começar?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Leitura: Você não gosta de ler? Então pare por aqui e acesse o Facebook. Leitura para programador é essencial, pois por mais autodidata que você seja, vai precisar de algum material de referência. E adivinha onde esse material está?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Inglês: Se você conseguiu traduzir o título desse post, parabéns, é um bom começo. Inglês para programadores é essencial. Não quero criticar o material brasileiro, mas as melhores publicações de informática estão no idioma do tio Sam. Portanto, se o seu inglês se limita a contar até dez, é hora de se matricular em um curso de inglês.&lt;br /&gt;
&lt;br /&gt;
Lógica de programação: essa parte é complicada porque lógica não se ensina como as outras matérias, digamos, normais. Lógica envolve treino (muito treino, diga-se de passagem) e aquela aula de lógica de programação que os cursinhos ministram por ai são só a parte superficial. Todo o resto vem com a vivência. Portanto, é interessante que você crie algum projeto para treinar a sua lógica. E passar muito tempo fazendo projetinhos de software. Só assim você vai afiar a sua lógica a ponto de resolver a maioria dos problemas que aparecem.&lt;br /&gt;
&lt;br /&gt;
Orientação a objetos: Não é um pré requisito para programar, porque existem linguagens que não trabalham com objetos, mas é interessante pois o conceito começa pregando reutilização de código, o que para mim é um dos pilares da programação. Mas orientação a objetos no começo é complicado de aprender e ainda mais quando a lógica ainda não está a todo o vapor. Portanto: estude bastante, mas preze pela sua lógica.&lt;br /&gt;
&lt;br /&gt;
Manutenção de softwares: Isso parece estranho, mas todo programador precisa de um pouco de código alheio pra poder identificar o que é bom de se usar nos seus códigos. Isso vai te mostrar um pouco do mundo real para você ver que nem tudo são rosas, inclusive dentro de um código fonte. Fora isso, manutenção em programas prontos é um teste e tanto pra sua lógica, pois mostra qual a sua capacidade de corrigir um erro sem reconstruir tudo do zero. Óbvio que nem sempre isso é possível, mas em 99% das vezes é possível corrigir um programa sem ter de reconstrui-lo.&lt;br /&gt;
&lt;br /&gt;
Paciência: Se você não é nenhum poço de paciência, para ser um bom programador, você terá de exercitá-la diariamente. Bugs, usuários, chefes, gerentes e quaisquer outros seres vivos ou mortos que não sejam você e o seu computador enchem o saco. Os usuários tendem a acreditar que o computador vai substituir o cérebro deles e que tudo é &quot;implícito&quot;. Para isso, só posso recomendar muito maracujá e um jogo de videogame bem violento para quando você chegar em casa. Esportes também ajudam a relaxar e exercitar a paciência, principalmente esportes coletivos.&lt;br /&gt;
&lt;br /&gt;
Por fim, Linguagens de Programação: No geral a lógica é a mesma, mudando algumas funcionalidades, mas vale aquela máxima de ser bom em uma linguagem ao invés de ser mediano em um monte. Eu recomendo começar pelo C# ou Java, pois tem nível suficiente pra te preparar para desafios mais contundentes que o mercado te prega. Não é uma regra, mas geralmente o que você resolve em uma linguagem baseada em C, fica mais fácil de refazer se precisar traduzir pra alguma outra linguagem.&lt;br /&gt;
&lt;br /&gt;
E se você achava que programar é fácil, acertou. Não é tão difícil, mas como qualquer outra atividade, requer um esforço da sua parte pra começar a valer a pena.&lt;br /&gt;
&lt;br /&gt;
Até a próxima!</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/8524137759732720567/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/8524137759732720567' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/8524137759732720567'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/8524137759732720567'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2012/12/so-you-wanna-be-programmer.html' title='So, you wanna be a programmer.'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-1679797797473036815</id><published>2011-12-29T18:08:00.002-02:00</published><updated>2011-12-29T18:14:14.038-02:00</updated><title type='text'>O javascript não sabe fazer conta??</title><content type='html'>Essa foi a minha primeira impressão ao fazer uns cálculos um pouco mais complexos no javascript. Depois de resolver a maior parte dos erros de contas com o parseInt e o parseFloat, eu descobri outra faceta bem chata deles: se vc digitar um zero à esquerda no valor a reconhecer, ele vai passar pra octal e a sua conta vai ficar mais bonita ainda. &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Pra resolver esse problema, basta atribuir a base numérica na própria função parseInt ou parseFloat. Então o código vai ficar assim:&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;var x = parseInt(y, 10) + parseInt(z, 10); // Assim o javascript vai converter pra um número na base 10, e conseguiremos efetuar nossos cálculos sem problemas. O parseFloat é a mesma coisa.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Agora vem a minha pergunta: por que o javascript não assume a base 10 como default?? Por que ao digitar um zero à esquerda mudamos a base numérica da variável?&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Javascript: ruim com ele, mas muito pior sem ele...&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/1679797797473036815/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/1679797797473036815' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/1679797797473036815'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/1679797797473036815'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2011/12/o-javascript-nao-sabe-fazer-conta.html' title='O javascript não sabe fazer conta??'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-6854336581438729146</id><published>2011-08-08T08:38:00.008-03:00</published><updated>2011-08-30T08:02:35.586-03:00</updated><title type='text'>Múltiplas implementações de uma mesma camada</title><content type='html'>Olá a todos,&lt;br /&gt;&lt;br /&gt;Neste post eu vou dar um exemplo de como fazer um modelo de implementação que mantenha a mesma camada de negócios, mas que utilize uma camada de dados que só é conhecida pela camada de interface com o usuário. &lt;div&gt;&lt;br /&gt;É muito comum um programa ter mais de uma implementação específica, principalmente quando os usuários finais podem estar geograficamente em locais de difícil conexão, etc. Enfim, às vezes é necessário fazer o mesmo programa praticamente duas vezes. Somente o fato de pensar em reescrever o mesmo programa já me dá frio na espinha, então estava eu aqui pensando com os meus botões: &quot;Será que não dá pra deixar pelo menos a camada de negócio intocada e eu mudo somente a parte em volta??&quot;. Depois de alguns ensaios eu vi que dá sim e não é tão complicado quanto parece.&lt;br /&gt;&lt;br /&gt;A idéia aqui é basicamente a clássica implementação em 3 camadas (interface com o usuário, regra de negócio e persistência), mas adicionaremos duas camadas intermediárias que farão o trabalho de seleção e carga da camada de persistência, de acordo com as configurações do programa via web.config ou app.config.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Ok, vamos aos detalhes:&lt;br /&gt;&lt;br /&gt;- Camada de interface com o usuário: Sem novidades aqui, você vai implementar do mesmo jeito de sempre, deixando-a com o mínimo de regras de negócio possível (num mundo perfeito, nenhuma regra de negócio...), mas adicionando uma chave ao seu arquivo de configuração, conforme abaixo:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-GIe6rgJZvJ1iXCfvcL31y_sQbbTu_ULeYVL8tTuAU35YM74vR8TKbIs8qy3DAvfn-5EySwRDtGjebtVLE4T6ZUWfC2GqmjUe0e9R6eJOpg6azJ73VaC-vtL6rqXdnYMKh5aCWILj/s1600/webconfig.png&quot;&gt;&lt;img style=&quot;MARGIN: 0px 10px 10px 0px; WIDTH: 320px; FLOAT: left; HEIGHT: 87px; CURSOR: hand&quot; id=&quot;BLOGGER_PHOTO_ID_5638459230428450050&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-GIe6rgJZvJ1iXCfvcL31y_sQbbTu_ULeYVL8tTuAU35YM74vR8TKbIs8qy3DAvfn-5EySwRDtGjebtVLE4T6ZUWfC2GqmjUe0e9R6eJOpg6azJ73VaC-vtL6rqXdnYMKh5aCWILj/s320/webconfig.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Deste jeito, a camada de factory vai abrir a camada de persistência pelo seu nome de assembly, onde o único trabalho que teremos será o de ajustar a versão do assembly.&lt;br /&gt;&lt;br /&gt;- Camada de negócio&lt;br /&gt;&lt;br /&gt;Aqui também há pouco a adicionar, mas é importante que todas as classes tenham um objeto privado fazendo referência ao acesso a dados. Então fica praticamente como um cabeçalho das classes de negócio a implementação abaixo:&lt;br /&gt;&lt;br /&gt;DLInterface.IDL assemblyToRun = new DLFactory.Factory().getDataLayer(&quot;Class1&quot;);&lt;br /&gt;&lt;br /&gt;DLInterface é o meu namespace para identificar a interface de acesso a dados. Como serão implementações separadas, eu preciso deixar algo em comum entre elas, portanto essa intersecção será feita por uma interface.&lt;br /&gt;&lt;br /&gt;- Factory&lt;br /&gt;&lt;br /&gt;Aqui é uma novidade: Muita gente simplesmente referencia a camada de dados na camada de negócio e a persistência de dados está resolvida. Sim, em aplicações normais isso funciona muito bem, obrigado. O detalhe aqui é que a camada de dados tem mais de uma implementação. Portanto eu vou colar o código inteiro da minha factory e explicar melhor depois.&lt;br /&gt;&lt;br /&gt;Parece confuso, mas é só aparência:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhryjkAFKOLomWyEQYJ-sqd9K7H7p5pjrUNhDH7Og741eqd2pdz2hPUkwHdQtAuAjjh_7thHW-gcVrpn8Loq-bjOWmR1_Clu4nOh2DbODLwpCO_vTkMBVqwzDdEcJvP-N05C6Irfz1z/s1600/factory.png&quot;&gt;&lt;img style=&quot;MARGIN: 0px 10px 10px 0px; WIDTH: 320px; FLOAT: left; HEIGHT: 143px; CURSOR: hand&quot; id=&quot;BLOGGER_PHOTO_ID_5638458813595376418&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhryjkAFKOLomWyEQYJ-sqd9K7H7p5pjrUNhDH7Og741eqd2pdz2hPUkwHdQtAuAjjh_7thHW-gcVrpn8Loq-bjOWmR1_Clu4nOh2DbODLwpCO_vTkMBVqwzDdEcJvP-N05C6Irfz1z/s320/factory.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;No método getDataLayer cria uma instância de um assembly (previamente criado por você, óbvio) e retorna a classe passada no parâmetro. Essa classe é referenciada pelo nome mesmo, por isso o método recebe uma string.&lt;br /&gt;&lt;br /&gt;O método getAssemblyType é somente uma centralização de código para buscar a chave no web.config (ou app.config). Se você quiser ignorar, sem crise, mas precisará implementar o conteúdo dele mesmo assim.&lt;br /&gt;&lt;br /&gt;Os dois últimos métodos fazem parte de um POG (Programação Orientada a Gambiarra) para contornar uma característica bem chata que eu acabei enfrentando. Se a classe não tem nenhuma referência em código das camadas que ela acessa, o Assembly.Load não toma conhecimento do assembly (mesmo que esteja referenciado certinho...)&lt;br /&gt;&lt;br /&gt;- Acesso a dados&lt;br /&gt;&lt;br /&gt;As camadas de acesso a dados devem ser implementadas com os mesmos métodos, mesmo que alguns não sejam necessários. Isso porque a interface força a implementação do método e a sua camada de negócios vai precisar conhecer uma estrutura mínima para poder acessar ambas as classes sem conhecê-las completamente.&lt;br /&gt;&lt;br /&gt;No meu exemplo aqui, eu defini uma interface bem boba, com apenas um método para teste:&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtii1McKajEpXjwVA09xlcYMl9361RDqz08ckVWoVf2a2W-vv-IzwoKKUffmSDDv3VVhG6f9_CnS_lnin0qqCUkNopw9zefVomv6Ewk77DZ3XrHWxYMILqIl4kAzQoQqLHyo0x69j6/s1600/interface.png&quot;&gt;&lt;img style=&quot;MARGIN: 0px 10px 10px 0px; WIDTH: 310px; FLOAT: left; HEIGHT: 208px; CURSOR: hand&quot; id=&quot;BLOGGER_PHOTO_ID_5638458398217087474&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhtii1McKajEpXjwVA09xlcYMl9361RDqz08ckVWoVf2a2W-vv-IzwoKKUffmSDDv3VVhG6f9_CnS_lnin0qqCUkNopw9zefVomv6Ewk77DZ3XrHWxYMILqIl4kAzQoQqLHyo0x69j6/s320/interface.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;O método showMe simplesmente vai mostrar qual é a camada que está sendo acessada.&lt;br /&gt;&lt;br /&gt;No final das contas, a arquitetura desta implementação fica assim:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw9uFldWzcSF9sV9zL1hQlLYqNkcgf-xPgz_OfMryrXpLVZhKARmzK-Q_Ps_NkwxcE2ldoC9uGPTCzAR32IZrPEVBqqG58G2UqAdbFegpFFTZXtWtYbnXREQaSQ7W7WjaoJegIOS3a/s1600/Diagrama.png&quot;&gt;&lt;img style=&quot;MARGIN: 0px 10px 10px 0px; WIDTH: 267px; FLOAT: left; HEIGHT: 320px; CURSOR: hand&quot; id=&quot;BLOGGER_PHOTO_ID_5638461258671902818&quot; border=&quot;0&quot; alt=&quot;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiw9uFldWzcSF9sV9zL1hQlLYqNkcgf-xPgz_OfMryrXpLVZhKARmzK-Q_Ps_NkwxcE2ldoC9uGPTCzAR32IZrPEVBqqG58G2UqAdbFegpFFTZXtWtYbnXREQaSQ7W7WjaoJegIOS3a/s320/Diagrama.png&quot; /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Esta dica foi testada utilizando o Visual Studio 2010.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;Até a próxima!&lt;/div&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/6854336581438729146/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/6854336581438729146' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/6854336581438729146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/6854336581438729146'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2011/08/multiplas-implementacoes-de-uma-mesma.html' title='Múltiplas implementações de uma mesma camada'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-GIe6rgJZvJ1iXCfvcL31y_sQbbTu_ULeYVL8tTuAU35YM74vR8TKbIs8qy3DAvfn-5EySwRDtGjebtVLE4T6ZUWfC2GqmjUe0e9R6eJOpg6azJ73VaC-vtL6rqXdnYMKh5aCWILj/s72-c/webconfig.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-932287768590725179</id><published>2011-07-27T17:07:00.002-03:00</published><updated>2011-07-27T17:24:09.475-03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="desenvolvimento em camadas"/><title type='text'>Um modelo simples de implementação em camadas</title><content type='html'>Depois de alguns meses sem postar nada, segue abaixo mais uma dica que pode simplificar a sua vida ao desenvolver uma aplicação em camadas, mas o tamanho da aplicação não justifica utilizar Design Patterns, DDD ou qualquer outra técnica mais avançada.&lt;br /&gt;A idéia é implementar 3 camadas separadas e sequenciais e uma camada de elementos visuais, que é usada pelas outras 3 como transporte de dados. Fica algo mais ou menos assim:&lt;br /&gt;&lt;br /&gt;Inteface com o usuário&lt;br /&gt;- Nesta camada, não existem regras de negócio, no máximo um ou outro controle de visibilidade ou enable/disable de componente. Toda a validação é passada para a camada abaixo. A única inteligência que a interface de usuário precisa ter é saber quais campos são vinculados a quais propriedades do objeto visual.&lt;br /&gt;&lt;br /&gt;Regras de Negócio&lt;br /&gt;- Aqui moram as regras de validação e tratamento dos dados. Tudo o que a tela faz, essa camada valida e retorna se está ok. Ela não sabe qual a tecnologia de persistência de dados que você tem, portanto passa essa responsabilidade para a próxima camada.&lt;br /&gt;&lt;br /&gt;Acesso a Dados&lt;br /&gt;- Essa camada sabe qual o seu banco de dados e quais são as queries que você está utilizando para persistência de dados. Adicionalmente é ela quem sabe como preencher o seu objeto visual, que será transportado entre as camadas. &lt;br /&gt;&lt;br /&gt;Objetos Visuais&lt;br /&gt;- Essa é a camada que contem as classes que serão transportadas entre as outras camadas. Todas a conhecem e sabem como utilizar suas propriedades e métodos para cumprir suas tarefas, mas aqui só tem métodos de conversão de dados (por exemplo, converter o peso de um atleta de Kg para Libras). Essa classe não sabe se validar, nem se carregar. Quem faz esse trabalho são as outras camadas. &lt;br /&gt;&lt;br /&gt;Essa forma de desenvolver programas não é a melhor do mundo, mas ajuda bastante ao desenvolver um sistema de pequeno a médio porte com uma organização de código bastante satisfatória. Deixe cada camada como um projeto na sua Solution de forma a garantir que somente as camadas certas se conheçam (neste caso, Interface de Usuário e Acesso a Dados não podem saber uma da existência da outra).&lt;br /&gt;&lt;br /&gt;Para esta dica, eu tenho usado o Visual Studio 2010, mas ela pode ser aplicada em diversas tecnologias.</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/932287768590725179/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/932287768590725179' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/932287768590725179'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/932287768590725179'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2011/07/um-modelo-simples-de-implementacao-em.html' title='Um modelo simples de implementação em camadas'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6561618565030895032.post-2529058659385574220</id><published>2011-01-11T23:35:00.002-02:00</published><updated>2011-01-11T23:41:02.835-02:00</updated><title type='text'>Cuidado com datetime na PK</title><content type='html'>Olá a todos. &lt;br /&gt;&lt;br /&gt;Estou reformulando este blog e este é o meu novo primeiro tópico.&lt;br /&gt;&lt;br /&gt;Uma coisa que eu vejo muitos teóricos comentarem é a criação de certas tabelas no SQL Server com um campo Datetime na primary key.&lt;br /&gt;Em tese, tudo certo, mas tem um porém: Quando voce tem entradas de dados muito rápidas e consecutivas, a PK não considera o datetime completo. O SQL faz o favor de arredondar em alguns segundos as entradas de dados, sabe-se lá porque. O importante deste post é: NÃO CRIE PRIMARY KEYS COM CAMPOS DATETIME, não dá pra garantir que o SQL Server vai respeitar o conteúdo completo (como milissegundos, por exemplo).&lt;br /&gt;&lt;br /&gt;Essa dica foi testada no SQL Server 2005 Express e no Enterprise Edition.&lt;br /&gt;&lt;br /&gt;Até a próxima!</content><link rel='replies' type='application/atom+xml' href='http://ti-tips.blogspot.com/feeds/2529058659385574220/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/6561618565030895032/2529058659385574220' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/2529058659385574220'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6561618565030895032/posts/default/2529058659385574220'/><link rel='alternate' type='text/html' href='http://ti-tips.blogspot.com/2011/01/cuidado-com-datetime-na-pk.html' title='Cuidado com datetime na PK'/><author><name>El Pablón</name><uri>http://www.blogger.com/profile/09187402442574472829</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>