Jump to content
Fivewin Brasil

Programação Orientada a Gambiarras (POG)


CleitonSH

Recommended Posts

Artigo que peguei do Sérgio Rodrigues no Fórum de Automação Comercial, vale a pena ler.


Na existência da Programação Orientada a Eventos (POE), Programação Orientada a Objetos (POO), segue agora a mais nova tendência de mercado, a Programação Orientação a Gambiarras (POG).

A Programação Orientada a Gambiarras (POG ou WOP - Workaround-oriented programming) é um paradigma de programação de sistemas de softwareque integra-se perfeitamente a qualquer grande Paradigma de Programação atual.

A Programação Orientada a Gambiarras foi uma evolução natural do uso do Programa Bacalhau (vide abaixo), também conhecido como ATND - Artifício Técnico Não Documentado, dos anos 60–80 e vem de uma antiga expressão brasileira, "Para quem é, bacalhau basta" (época em que o peixe seco ainda era barato). Programadores e analistas mais preocupados em usar buzzwords 0costumam utilizar o termo workaround para impor respeito.

Para que um programador possa exercer a Programação Orientada a Gambiarras, são necessários alguns fatores específicos, facilmente encontrados em ambientes de desenvolvimento:

-Sistemas originalmente mal projetados;

-Clientes chatos;

-Usuários chatos;

-Falta de vontade;

-Falta de tempo;

-Requisitos dinâmicos;

-Término do estoque de café/chá;

-Aproximação do final da tarde;

-Véspera de feriado/fim- de-semana;

-Ter o Jackie Chan como chefe;

-Ter o MacGyver como coordenador de projeto (ver Método MacGyver);

-Governo defecando regras ou MP's que entrem em vigor imediatamente sem dar tempo de atualizar sistemas;

-Gente que pensa que é DBA (normalmente são pessoas chatas, gordas, feias, sem certificação nenhuma e que pararam no tempo depois que fizeram um curso de SQL Básico);

-Arquiteto de software achando que é o máximo(normalmente pessoas, altas, loiras, chatas, arrogantes e metidos a sabe tudo).

Reunidos, todos estes fatores transformam o programador em um gambiarrizador, espécie mais evoluída de programador, que possui curva de aprendizado e produtividade muito mais altas. Os códigos dos gambiarrizdores podem ser chamados de CACA (Código Avançado Completo e Adaptável).

Estudos realizados neste segmento, mostram que os programadores que evoluem para gambiarrizadores vivem melhor, saem as 18:00h, tem cabelos mais bonitos e esvoaçantes. Tudo pelo fato de que, enquanto transformados em gambiarrizadores, eles entram em um estado alfa, onde tudo na vida funciona. Tudo que é impossível torna-se possível, de maneira totalmente obscura, mas possível.

Há correntes de programadores que discriminam a Programação Orientada a Gambiarras, alegando ser uma má técnica, que faz com que os sistemas fiquem lentos e ganhem bugs. Também ficou claro nas pesquisas que estes programadores só dizem isto por nunca terem evoluído para gambiarrizadores (e por isso nunca pegam mulher nenhuma). Com apenas uma evolução, 100% dos programadores admitem que a Programação Orientada a Gambiarras, definitivamente, é o melhor paradigma de todos.

Além disso, a Programação Orientada a Gambiarras, assim como outros paradigmas, deu origem a outros movimentos de pesquisa científica comoModelagem Orientada a Gambiarras (MOG ou WOM - Workaround-oriented modeling), Desenvolvimento de Sistemas Orientado a Gambiarras (DSOG ouWOSD - Workaround-oriented software development).

--------------------------------------------------------------------------------

PPOG - Princípios da programação orientada gambiarras comentados

Se funciona, então tá certo - Acoplado ou não, txt ou sql, mil funções ou 10, design patterns... Nada disso tem valor para o usuário, que só precisa de um software funcional. O termo "escalável" é falacioso.

My Way - Programador esperto, se é esperto mesmo é adepto do My Way. Se você está com dúvidas, faça do seu jeito pois se der merda é você quem vai se foder.

Murphy - Para lidar com Murphy e seu exército só com POG. Murphy é sagaz e ligeiro, tá só esperando você dar mole. Nada mais rápido do que uma gambiarrazinha pra acertar o que Murphy destrói.

Deixe o amanhã para amanhã - Muitos programadores atrasam projetos alegando que a demora de uma implementação para seguirem regras dedesign patterns ou comentários que ajudarão a outros desenvolvedores a entender melhor o código. Deixe o amanhã para o otá... err...

Comentários são para amadores - Um desenvolvedor deve ser treinado para ser fluente na linguagem de programação usada sem precisar de comentários, independente da consequente ruína de sua vida social. Isso também é conhecido como sétimo sentido.

Eficiência primeiro - Evite escrever em várias linhas o que pode ser feito em uma.

Fé em Deus - A informática é levianamente definida como ciência exata, quando esta é na verdade uma ciência holística. Vários casos reais de divina Providência foram testemunhados em ambiente fiéis aos princípios POG, espíritos ruins foram exorcisados, e a paz instalou-se graças a fé dos gambiarrizadores.

1337 h4x0r5 dud3 lol - Quanto menos legível, mais respeitado o código é. Consequentemente menos alterado ele é, e mais estável o sistema fica.

A ocasião faz o ladrão - Em determinados momentos não conseguimos escapar dela.

Capacidade de Abstração - Este conceito se baseia em focar-se no problema e desconsiderar conceitos e dados desnecessários para atingir o objetivo, ou seja, o Programador deve abstrair tudo que lhe faça perder tempo como regras de negócio desnecessárias ou tratamentos de erros.

Conclusão Hipotética Universal Técnica Explicativa - Quando nenhum dos outros conceitos se aplica, utiliza-se este até funcionar ou desistir. (C.H.U.T.E).

--------------------------------------------------------------------------------

Padrão de Projeto Gambis:

As Soluções Técnicas de Contorno (aka. gambiarras) podem ser aplicadas de várias formas. No entanto, não há ainda consenso entre desenvolvedores e analistas acerca de padrões de projeto para desenvolvimento orientado a gambiarras. Uma prática muito comum é criação de uma entidade específica, com o intuito único de prover uma funcionalidade emergencial a um sistema.

Não são raros os casos de utilização de classes "gambiarra.java", "agoravai.java", "funcionapeloamorded eus.java", métodos "void ajeita()", "public String bruto()" e afins. Em alguns casos, métodos com nome sofisticados como "setMagicOn()" e "setApellationMode(true)" também são utilizados para dar um ar mais profissional. Também para tornar o código mais amigável e legível alguns programadores fazem uso abusivo do POLIMORFISMO de métodos, utilizando nomes como "check"(), "checka()", "xeka()" ou "pussy()". São os chamados Gambiwares, componentes de software que promovem a entrega de projetos com o mínimo de atraso possível.

Nesta técnica as linhas de comentário devem ser evitadas ou proibidas. Em caso de extrema necessidade o uso de línguas como hebraico outupi-guarani é recomendado.

A técnica mais usada pelos programadores POG é usar sempre softwares que fazem todo serviço para ele, como por exemplo Visual Studio Net, SqlServer, entre outros, e, claro, o Google para pegar scripts prontos e usar. Os programadores POG sempre são mais rápidos que o normal e cobram mais barato já que não fazem esforço algum, sendo muito justos nessa parte. Enquanto isso, programadores que não usam POG precisam cobrar mais caro pelo serviço porque eles sempre se enrolam e não conseguem entregar nada no prazo.

As métricas e estimativas da Programação Orientada a Gambiarras provêm da metodologia de medição de software denominada Conceito HolísticoUnilateral para Tipificação Estrutural, mais conhecido pela sua abreviação: C.H.U.T.E.

--------------------------------------------------------------------------------

Gambi Design Patterns catalogados

FORCEPS

De fácil compreensão, esse recurso é largamente utilizado, caso um valor não seja atribuído a sua variável durante a execução de um programa por algum problema desconhecido pelo programador POG. Assim em vez de perder horas e horas debugando um programa, atravéz do altíssimo nível de programação orientada a gambiarra, o programador POG atriu um valor na base da porrada e o programa roda livre e sem bugs. É claro que de tempos em tempos esse pequeno ajuste deve ser mantido.

WYSIWYG

Também conhecido por what you see is what you get (o que você vê é o que você tem), nesse caso você começa um sistema fazendo uma única tela de cadastro (somente inclusão), sem a menor consistência de campos e já disponibiliza para o usotário digo usuário, e diz para ele ir cadastrando enquanto você termina o resto do sistema e libera os módulos de relatórios. Combinado com a técnica de fazer menus utilizando a técnica, wysiwNyg what you see is what not you get (o que você vê é o que você NÃO tem / ou nunca vai ter), você disponibiliza um menu cheio de opções e sub-menus para o usuário vislumbrar a totalidade do sistema. Não se esqueça de colocar em cada item a mensagem "em desenvolvimento" .

Best-seller da O'Reilly no mercado brasileiro. Note o animal tipicamente nacional: Anta.

Else Forever

Pattern que visa facilitar o perfeito entendimento de um operador condicional, com o avançado uso do ELSE. Seu princípio básico é: "CONDIÇÃO QUE DEFINE SE UMA COISA OU OUTRA SEMPRE IRà ACONTECER". Sua aplicação é muito simples (utilização do else), porém o entendimento obtido é total, visto que não fazer nada, também é tomar uma ação. (Ex: deputados, senadores, etc).

Resumo:

O entendimento se resume a:

Sempre que uma condição for testada duas coisas podem acontecer:

(1) - Se a condição for verdadeira : Uma ação é realizada.

(2) - Senão : outra ação é realizada.

Utilização Recomendada do Else Forever:

...

...

-- Observe o algorítimo abaixo:

IF x = true THEN

realiza ação Y

END IF

Este algoritimo poderia ser lido da seguinte forma:

"Se x for verdadeiro, então realiza ação Y e fim"

-- porém o patern 'Else Forever' vem mostrar que isto está errado, pois você lembra

da definição "(2) - Senão : outra ação é realizada.", então cade a outra ação?

...

...

A forma correta seria:

IF x = true THEN

realiza ação Y

ELSE

não faça nada

END IF

Desta forma é mostrada claramente a fundamental importância da utilização do

comando ELSE para estes casos, visto que não fazer nada, também é tomar uma ação.

Uma forma alternativa seria:

IF x = false THEN

não faça nada

ELSE

realiza ação Y

END IF

Static Spree

Um dos patterns mais utilizados da POG. O objetivo desse padrão é que tudo fique visível em qualquer canto, porque private é coisa de gente envergonhada. Também conhecido por Public Static Spree, pois comumente tudo é feito "public static".

Lone Wolf

Também conhecido por Highlander (só pode haver um), esse é a boa e velha "classe-faz-tudo". O sistema todo está concentrado numa 'classe procedural' que faz tudo, geralmente usando o padrão Static Spree.

Generic processor

Alguma classe que recebe qualquer coisa como parâmetro e que faz alguma ação genérica dependendo de mais e mais parâmetros. As operações dessa classe geralmente tem mais parâmetros que o seu monitor é capaz de exibir.

The Hitchhiker's Guide to the Galaxy

Um objeto que trafega por tudo quanto é canto, mas normalmente só um ou dois métodos fazem alguma coisa com ele, o resto só repassa.

Variação: Sistema recebe entrada A e gera saída B. Para alcançar o resultado, ele executa o gerador de improbabilidade, passando por todos os caminhos possíveis de A até B. Coisas muito estranhas acontecem durante esse processo.

Old Times of Yore Pattern

É bastante usado quando o gambiarrizador não se lembra de algumas operações matemáticas a ser implementadas. Geralmente são algumas das operações que aprendeu na Universidade.

Apenas gambiarrizadores de nível Genial ou maior conseguem fazê-lo, com a ajuda de um lápis com tabuada.

Exemplo:

/*Essa função soma dois termos, só que eu não sei somar!*/

int Eunaoseisomar( int a, int B) // e tem que ser INTEIRO, pois não sei usar fração também.

{

//Gambiarrizador baseou-se naquele lápis que tem a tabuada.

if((a==0)&&(b==0))

return 0;

else if(((a==0)&&(b==1))||((a= =1)&&(b==0)))

return 1;

else if(((a==0)&&(b==2))||((a= =1)&&(b==1))||((a= =2)&&(b==0)))

return 2;

else if(((a==0)&&(b==3))||((a= =1)&&(b==2))||((a= =2)&&(b==1))||((a= =3)&&(b==0)))

return 3;

else if(((a==0)&&(b==4))||((a= =1)&&(b==3))||((a= =2)&&(b==2))||((a= =3)&&(b==1))||((a= =4)&&(b==0)))

return 4;

/*[...]

* . Aqui eram todos as outras possibilidades que tinham no lápis.

* .

* .

*[...]

*/

else //caso o usuário tente botar número negativo

printf("Para acesso à este recurso(soma de números negativos) é necessário um

Add-on, disponível na versão Premium deste software.");

}

Nonsense Flag

Por um legítimo impulso gambiarrizador solucionador de problemas, o desenvolvedor salpica um monte de variáveis com nomes sensacionais como "newCounter2", "jaTrocouDeAba", "passouPorAqui", "numeroMagico", "naoAchou" e etc.

RCP Pattern

Significa Reuse by Copy-and-Paste (Reúso por Copiar e Colar). O RCP dita que, na pressa, quando não dá pra fazer a coisa por herança, basta copiar e colar, quantas vezes for necessário. Em geral se espera que futuras alterações sejam feitas por outros trouxas, digo programadores, perdão. Os trechos de código são copiados de todo e qualquer lugar possível, geralmente de outro programador (muitas vezes o estagiário) ou código da internet, para criar partes funcionais do programa. Utiliza-se a milenar técnica do "Ctrl+C" e "Ctrl+V" para juntar as partes e adaptá-las para funcionar, por tentativa e erro. Leva um considerável tempo para se adaptar o programa, e um número absurdo de compilações, mas pelo menos pode-se dizer que foi você quem fez o código. Este pattern também é conhecido como "Contra o C e Contra o V".

BCDR Pattern

Black Cat in a Dark Room (Gato Preto em um Quarto Escuro). Consiste em criar métodos que recebem apenas um Map como parâmetro. O argumento que você precisa está lá dentro, no Map, mas você não sabe exatamente onde. Esse padrão permite passar quantos argumentos forem necessários a um método, sem poluir o código. Permite criar métodos cujas assinaturas seriam, de outra forma, extremamente longas (vide padrão Generic Processor). Evita a alteração de assinaturas de métodos no momento da manutenção do código, fazendo desnecessário qualquer tipo derefactoring.

justKillIf

Quando a execução de uma função causa algum bug devido a um parâmetro ou evento, é feito o seguinte tratamento (também utilizando o Static Spree):

A função divide um numero por i, não podendo vir 0

if(i == 0)

return;

Divisao.resp = Classe.numero/ i;

este padrão de projeto ja foi utilizado com sucesso em aplicações para jogos de celular e existem outras inumeras utilizações possiveis.

Mega Zord

Programadores dos anos 80 o conhecem como Daileon. Semelhante ao padrão Lone Wolf. Motivo: criar várias funções, cada uma executando um passo de um algoritimo, causam lentidão no sistema por este ter que interromper seu fluxo para chamá-las. Esse problema pode ser resolvido com uma única e gigante guerreira função, que recebe vários parâmetros que definirão o que esta deverá fazer. Geralmente usado em conjunto com Nonsense Flag.

Exemplo(Atenção! A quebra de linhas foi usada aqui apenas para melhor entendimento! Evite essa prática! Escreva os parâmetros todos em uma única linha para não comprometer a eficiência do código!!!):

//Processa

public static Object processar(String file, int dados, char variavel, Object status, int linhas,

String query, String usuario, string senha, String banco,

String host, int dia, int mes, int ano, Object entrada,

Object saida)

throws Exception {

//Aí é aquilo, mermão...

...

...

return processado;

}

Esse padrão também pode ser usado com SQL. SELECTs aninhados devem ser evitados pois diminui a eficiência, foda-se se ninguém entender que merda aquilo faz.

There is No Spoon

Padrão para C/C++. Dar o mesmo nome aos arquivos .h e aos .c(pp) onde estão definidas as funções podem causar conflitos durante a compilação. Dar um nome diferente aos .c evitam esse problema. Outro ganho é evitar com que os programadores percam tempo querendo saber como e onde aquelas funções do .h foram definidas. Não confundir com o pattern "There is no function", onde toda a lógica é escrita em um único arquivo no corpo principal do programa ( main() no C++ e meinKempf() em Java), atingindo-se assim o ápice da eficiência computacional, denominado Sétimo sentido.

BaseBean

É um pattern avançado de POG, recomendado sempre que for necessário o máximo de reaproveitamento e flexibilidade sem perda de backward compatibility em processos iterativos. A primeira versão do sistema deve estar toda implementada na classe BaseBean, decomposta no maior número possível de métodos. Assim que for requisitada uma alteração ou nova funcionalidade, deve-se criar uma nova classe Bean2 herdando deBaseBean, sobrescrevendo alguns métodos existentes e adicionando novos métodos. As próximas alterações vão para a Bean3, Bean4,... e assim sucessivamente. Além das vantagens já citadas, essa técnica garante um mecanismo de controle de versões built-in.

Chain of Flags

Pattern viável em qualquer linguagem de programação. Consiste em inserir uma série n (onde n > 0) de ifs e elses para todas as possibilidades que satisfaçam uma condição. A medida que surgem novas possibilidades, basta acrescentar mais um if-else ao fim da estrutura. Se uma possibilidade desaparece, ela não precisará ser eliminada do código, afinal um dia ela poderá voltar mesmo. Caso a condição não seja satisfeita por nenhum dos if-else's, pode-se utilizar o padrão User Friendly Exception, descrito abaixo.

User Friendly Exception

Consiste na padronização de todas as mensagens de erro do sistema para uma única mensagem amigável ao usuário. Um sistema 100% compatível com esse padrão, nunca trava nem encerra de forma inesperada, mas apenas não atende ao usuário exibindo uma mensagem do tipo "Caro usuário, tente novamente observando as regras de uso do sistema". Observação: Trata-se da evolução de um padrão amplamente utilizado em sistemas Microsoft com mensagens "Catastrofic Failure" e "Unexpected Error".

Exemplo de implementação em Java:

public static void main(String[ ] args){

while (true) {

try {

...

} catch (Throwable ex) { // qualquer erro do sistema cai aqui

// só pode ser culpa da besta ignorante do usuário

MessageBox.show( "Caro usuário, tente novamente observando as regras de uso do sistema");

// após a mensagem, o while(true) garante a robustez do sistema que não aborta nunca!

}

}

}

Chaotic Experimentation

Padronização de construção de funções para continuar a executar o programa mesmo que dê pau em alguma rotina.

PogManager Pattern

Consiste numa classe que encapsula diversas técnicas POG. Deve ser usado em conjunto com as declarações try...catch conforme o exemplo abaixo.

try {

businessObj. businessMethod( );

} catch (KnownError err) {

pogManager.doIt( );

} catch (UnknownError err) {

while(true) {

pogManager.doItAgai n();

}

}

Continuous & Incremental POGging

Consiste na elaboração de projetos enormes incrementalmente. Este pattern acelera em muito o processo de implementação e facilita um posterior suporte. Projetos que seguem este pattern geralmente são chamados de teste.prj, HelloWorld.prj, tst.vcp, tst.vcw etc. Seus arquivos principais (onde se encontram a main() e a (única) função MegaZord) geralmente se chamam teste.cpp ou HelloWorld.cpp. Ainda outra característica comum nestes projetos é a antiga data de criação dos arquivos já citados anteriormente.

Polymorphic Confusion

Tática gambi adotada principalmente por DBAs, na qual a mesma informação pode possuir dezenas de utilidades e significados dependendo deflags ou de alguma condição obscura. Coisas como "se o ID for maior que 9999 não é mais produto comprado, é produto vendido!" e "a flag 'tipoEntidade' indica se é uma pessoa, empresa ou qualquer item".

Controller Confusion

Tática que permite uma menor escrita de classes no sistema. Consiste simplesmente em eliminar o M do padrão MVC, ficando um padrão muito mais legal - o VCC (View/Controller Confusion, ou Vai ce catar). Alguns tem sugerido inclusive a eliminação do V - ou seja, ficando apenas o CC (Codigo coco para os usuarios mais intimos) - a lógica, o modelo, os templates, o HTML, tudo e mais um pouco dentro do controller confusion. Como você pode ver, o padrão cêcê faz jus ao nome.

DB is our God

Também conhecido como In DB we trust . Padrão gambi arquitetural em que TUDO é no banco de dados. Os dados, arquivos, imagens, lógica de negócio, tratamento de erros, geração de HTML. O programa em si é só um monte de strings (em variáveis estáticas, é óbvio) com as consultas.

Referential Integrity by Software

A Integridade Referencial é utilizada para garantir a Integridade dos dados entre as tabelas relacionadas. Após anos e anos de uso do padrão "DB is our God", o MPOG percebe que o principal problema em se usar banco de dados, é que ao tentar remover determinado registro um erro é retornado devido aos relacionamentos entre as tabelas. Visando sempre a metade da metade inferior do prazo, o MPOG simplesmente retira todos os relacionamentos entre as entidades, e, muitas vezes, desnormaliza cinco tabelas em uma só, garantindo assim o baixo tempo de desenvolvimento e fazendo com que a aplicação seja altamente performática.

Invisible Objects Blackhole

Também conhecido como Textbox Invisível Utilizado para a manipulação de dados que devem ser persistentes, independentemente do programa de origem continuar em execução ou não. Ao se deparar com um problema semelhante, o MPOG utiliza um objeto (geralmente uma caixa de texto) presente no mesmo ou ainda em outro formulário da aplicação para armazenar o valor antes que o mesmo seja alterado de maneira aleatória pelo programa. Muito utilizado em conjunto com o Nonsense Flag, na programação VB. Tem como prática suprema de programação a definição do caption do objeto como INVISÃVEL, de modo a estabelecer já em design-time o tipo de utilização desejada para o mesmo.

N.M.L. Combat Action POG Pattern

É um Design Pattern POG ousado, moderno, revolucionário e NÃO-EMO. Os arquitetos emos e POGuistas ADORAM, junto com seus miguxus, incrementar suas frameworks utilizando MUITAS camadas, geralmente desnecessárias. A N.M.L. (No More Layers) aborda uma estrutura onde todas as regras de negócio, validação (client e server side) e acesso à dados estão na tela! Para que Facades, Commands, Bussines Delegate e outras viadagens EMO detonando a performance da aplicação? Manutenção? Não é necessário, pois quem domina e faz uso dessa técnica modesta e humilde produz códigos Chuck Norris Style, ou seja: PERFEITOS. Esse paradigma está amplamente difundido por programadores VB e Delphi, e tem migrado com sucesso para a plataforma .NET, porque o que importa é a beleza da tela, e não a tecnologia que está por trás!

Reinvented Square Wheel Helper

Também conhecido como "Do not trust the others". Este design pattern visa aumentar a performance de tarefas corriqueiras, para as quais já existe uma API da própria linguagem que faz a mesma coisa. Ao invés de utilizar a referida API, o programador, em um instinto de provar a masculinidade ou por pura preguiça de ler o manual, reinventa diversas funções básicas, como por exemplo a de "adicionar um dia a uma data" e, utilizando tipos totalmente impróprios para manipulação de datas, tal como String, reconstroem toda a lógica de calendário só para fazer esta função, geralmente provocando erros intermitentes, tais como anos bissextos ou então em horários que antecedem 10 horas da manhã, pois a hora vem com apenas 1 dígito e isto atrapalha o cálculo.

Pensamento positivo

Também conhecido como Wishful thinking. Este design pattern é extensivamente utilizado no ciclo de depuração do código POG:

Execute o código.

Não funciona?

Pensamento positivo, e tente novamente.

Repita o ciclo até que o problema desapareça espontaneamente.

You Shall Not PASS!

Vulgarmente conhecido como "Vagões de ORs e ANDs", visa bloquear todo e qualquer erro que o poguizador não tem a menor idéia de como surgiu criando-se uma extensa linha de código de condições com diversos ANDs e ORs que barram de tudo, menos o desejado. Muitas vezes deve-se tomar essa medida quando se utiliza do artifício Contra o C Contra o V e infelizmente o User Friendly Exception ou o Chaotic Experimentation não puderam dar conta do recado.

--------------------------------------------------------------------------------

Certificação Pessoal

POG Basic Certification

A primeira certificação pessoal a ser tirada pelo programador orientado a gambiarra é POG Basic Certification. Essa certificação demonstra que o programador executou a sua primeira gambiarra com sucesso, e a primeira gambiarra você jamais esquece. Ele a partir desse momento está apto a desenvolver novas gambiarras com a mesma inteligência e vigor que executou a primeira, sem culpa e com respaldo da certificação adquirida e que jamais será retirada dele.

--------------------------------------------------------------------------------

Ciclo de vida de um projeto POG

O ciclo de vida dos projetos POG se resumem às fases:

1. Entusiasmo

2. Desilusão

3. Pânico

4. Busca dos culpados

5. Punição dos inocentes

6. Honra e glória aos não participantes (no final quem não tem nada a ver com o projeto é que salva).

--------------------------------------------------------------------------------

POGMM - POG Maturity Model

O POGMM fornece às organizações orientação sobre como ganhar controle do processo de desenvolvimento de gambiarra em software e como evoluir para um cultura de excelência na codificação adaptada completa e adaptável (CACA), sem que ninguém perceba e continue achando que o desenvolvimento está a mil maravilhas.

O objetivo principal nas transições desses níveis de maturidade é a realização de um processo discreto e imperceptível, para a construção de workarounds (gambiarras) , como a fundação para melhoria contínua. Cada nível de maturidade possui um conjunto de práticas de gambiarras e gestão de CACAs, denominadas áreas-chave do processo de T.A.P.A (Técnicas Avançadas de Programação Adaptável).

O processo descreve os estágios de maturidade através dos quais organizações passam enquanto envoluem no ciclo de elaboração de gambiarras, identificação de mancadas e ações acobertadoras dentro de uma estratégia de melhoria do disfarce dos processos.

Este caminho de melhoria é definido por cinco níveis de maturidade:

Nível 1 - Inicial

Neste estágio as CACAs são codificadas, invariavelmente dão algum problema e, quando descoberta, ninguém tem um boa desculpa para aplicar.

Nível 2 - Repetitivo

Chegando a este nível, as soluções de workaround são permante e conscientemente introduzidas, com leves maquiagens, permitindo que em muitos casos passem desapercebidas, minimizando o impacto de sua descoberta.

Nível 3 - Definido

Através da utilização de MOG, a gambiarras passam a ser bem conhecidas, podendo-se elencá-las através de patterns próprios. Na eventualidade de identificação de alguma dessas CACAs, as desculpas já estão bem fundamentadas com paradigmas específicos e explicações esdrúxulas.

Nível 4 - Gerenciado

O conhecimento de gambiarras fica claramente mapeado, permitindo a preparação antecipada de uma estratégia de justificativas para cada incidente com CACAs. A definição antecipada de responsáveis é possível, permitindo ocultar a sua autoria e colocar a culpa no "colega" que você mais detesta.

Nível 5 - Em otimização

Apesar do uso itenso da POG, quase a totalidade das CACAs passam desapercebidas e mesmo quando isso ocorre (percebê-las) é sempre possível e plausível classificá-la como acaso. "Como foi que isso foi para aí ?"

O índice de POG também não influencia no sucesso da aplicação, fazendo com que milagrosamente ela atinge seu objetivos com êxito.

--------------------------------------------------------------------------------

Artigo sobre a evolução dos sistemas que utilizam SGBD com MOG e POG

Este texto foi escrito baseado em grandes contribuições e obras de gambiarradores de renome internacional e relata sobretudo suas experiências utilizando as técnicas POG (Programação Orientada a Gambiarras) em desenvolvimento de sistemas complexos que utilizam SGBD (Sistema Gambiarrador de Bando de Dados).

Introdução

Certamente você já precisou dar manutenção em um sistema que tinha aproximadamente 700 tabelas, 300 views e mais de 1000 stored procedures, sem falar dos milhares de softwares aplicativos desenvolvidos em VB, Delphi, ASP 3.0 ou PHP (nota: ASP e PHP são as linguagens que oferecem o maior número de recursos aos Gambiarradores para a utilização de técnicas POG avançadas).

Isto é uma situação comum nesta profissão e que muitas vezes afetam o bom desempenho do gambiarrador. Além disto os usuários sempre querem urgência na resolução de seus problemas pois na verdade alguém ficou "sentado" na informação durante meses e não envolveu os gambiarradores com a antecedência necessária.

Isto por sí só já é uma situação crítica, porém não pára por ai..

Cenário Atual

Considerando que qualquer sistema em produção desenvolvido com as técnicas tradicionais de desenvolvimento e modelagem apresentam algum tipo de problema podemos concluir que nunca um usuário estará satisfeito.

Abaixo uma lista dos principais motivos que incomodam os usuários.

Lentidão do sistema;

Para alterar um cadastro é necessário entrar em muitas telas;

O sistema obriga o preenchimento de determinados campos que na visão do usuário não são necessários;

No prenchimento de determinados campos é obrigatório respeitar a formatação (máscaras para digitação);

Curiosidade:

Após pesquisas de satisfação com diversos usuários foi possível detectar que estes são os principais motivos pelo qual o usuário tende a sabotar seu sistema e continuar utilizando uma plataforma mais flexível e amigável normalmente desenvolvida por ele (ao encontrar o título plataforma mais flexível e amigável leia-se planilha Microsoft Excel).

Os reais motivos em ordem de importância por trás das reclamações dos usuários

1 – O usuário é preguiçoso;

2 – Normalmente o usuário é burro;

3 – Os sistemas tradicionais não utilizam técnicas MOG e POG.

Infelizmente os dois primeiros motivos não poderemos resolver com as tecnologias existentes hoje em dia, portanto a melhor alternativa nestes casos continua sendo a demissão imediata e o tratamento a base de chicotada e ameaça de demissão.

Novo Cenário - Técnicas MOG e POG

Após anos de pesquisa renomados gambiarradores evoluiram o conceito dos SGBDs (Sistema Gambiarrador de Bando de Dados) para um novo padrão de desenvolvimento de sistemas baseados em MOG (Modelagem Orientada a Gambiarras) e POG (Programação Orientada a Gambiarras).

Em geral os problemas nos softwares ocorrem pois os sistemas são desenvolvidos utilizando técnicas de modelagem desnecessárias e exageradas como 3a, 4a e 5a formas normais com integridade referencial e patterns complexos. Isto gera a necessidade de muitos joins o SGDB fica sobrecarregado fazendo validações nos dados e você tem muitos layers tornando a performance da aplicação ruim.

Para solucionar este problema o primeiro passo é culpar o desempenho da máquina, então o Gambiarrador deve sugerir a compra de um novo servidor muito mais moderno que será capaz de rodar o software com bom desempenho.

O antigo servidor ficará livre para você armazenar seus MP3s e rodar jogos on-line (diversão preferida dos gambiarradores) .

Atenção: não conte esta parte para seu chefe e instale um antí-virus nesta máquina para disfarçar.

Caso o sistema volte a ficar lento sugira um novo upgrade de hardware. Normalmente esta técnica funciona entre 2 e 3 vezes.

Caso o sistema fique lento novamente ai você precisará investir nas técnicas MOG e POG.

Abaixo segue um guia rápido para o Gambiarrador adepto da MOG e POG:

Como resolver os seguintes problemas dos sistemas tradicionais:

Lentidão do sistema;

Começe desabilitando todas as check constraints e integridade entre as tabelas. Isto aumentará o desempenho em 30% aproximadamente.

Nota:

As Check constraints e a integridade referencial servem para garantir que o usuário não faça besteira ao inserir, excluir ou alterar um registro. Como isto é impossível logo é desnecessário. Neste caso a melhor alternativa é colocar alguns IFs nas telas e fazer terrorismo na cabeça dos usuários para que eles fiquem em pânico ao usar o sistema inibindo-os e evitando que eles façam qualquer alteração tornando o sistema mais estável.

O próximo passo é juntar tabelas que o DBA (Administrador de Bando de Dados) separou na modelagem baseada nas técnicas tradicionais. Para isto usaremos uma técnica MOG chamada R-MER (em potuguês: Modelo Reverso de Entidade e Relacionamento) .

Isto poderá aumentar a performance da aplicação em assustadores 4.567 % pois não será mais necessário o uso de JOINs. A má notícia é que você terá que dar manutenção em todos os comando SQL da aplicação e a boa notícia é que você terá mais alguns meses de projeto.

Para alterar um cadastro é necessário entrar em muitas telas;

O uso de muitas tabelas requer muitas telas, este é o motivo que incomoda os usuários.

A técnica indicada para solucionar este problema é a junção de tabelas conhecida como R-MER já descrita anteriormente.

Nota:

Um sistema ideal que utiliza técnicas MOG e POG tem no máximo uma tabela por funcionalidade.

Exemplos de funcionalidade no conceito MOG e POG:

Folha de Pagamento;

Contas a Pagar e Receber;

Estoque;

Faturamento.

O sistema obriga o preenchimento de determinados campos que na visão do usuário não são necessários;

Esta é a ação mais fácil para o Gambiarrador e certamente é a mais popular entre os usuários. Basta alterar todos os campos da sua tabela de bando de dados para aceitarem NULL.

Após isto você será reconhecido pelos usuários como o cara que tornou o sistema mais flexível e amigável (leia-se planilha Excel).

No prenchimento de determinados campos é obrigatório respeitar a formatação (máscaras para digitação);

Preencher campos com máscara é uma tarefa chata e demorada o que caracteriza os sistemas tradicionais como inflexíveis.

Se você já executou as 3 sugestões anteriores então a solução deste problema é fácil basta alterar a tela principal (única tela do sistema considerando que você aplicou a técnica R-MER) .

A alteração consiste em substituir todos os objetos de tela por objetos do tipo textbox . Não se esqueça de configurá-los para aceitar digitação livre e deixe todos como não obrigatórios sem limite de tamanho, assim o usuário se sentirá mais confortável.

Dica:

Tente fazer com que a tela do seu sistema seja parecida com o Excel, seus usuários vão amar você !

Certificação

Se você implementou com critério todos estes novos conceitos MOG e POG seu sistema estará apto a adquirir a certificação OTS-171 (One Table System - 171) o mais cobiçado certificado para softwares.

--------------------------------------------------------------------------------

Modelagem Orientada a Gambiarras

Ao contrário de outras abordagens para modelagem existentes, que são geralmente complexas, contêm inúmeros diagramas que não representam nada (diagramas de classe, de estados, de seqüência, etc), a MOG é muito mais simples e eficiente. Todo sistema a ser desenvolvido possui um único diagrama, muito mais simples e eficiente do que os outros existentes. Esse diagrama representa 100% corretamente qualquer sistema e seu comportamento, evitando que a especificação fique desatualizada durante o processo de desenvolvimento.

--------------------------------------------------------------------------------

Chavões POG

Todos

“Como não funciona ? Eu só recompilei.. .deve ser um problema no servidorâ€

~ Resposta do bem sucedido Programador Senior POG

“Deve ter ficado alguma coisa atravessado no bancoâ€

~ Programador POG

“Limpa o histórico e o proxy e dá um control+f5 que funcionaâ€

~ Resposta padrão do Webmaster sobre POG

“Já atualizou a versão do Windows ?â€

~ Resposta padrão do suporte sobre POG

“A principio isso nao tem nada a ver com o erro, mas pode ser que tenha....algo a ver â€

~ Programador POG, sobre o erro no programa que nao sabe da onde veio

“Deu certo? Deixa! Funcionou? Não mexa! â€

~ Bill Gates, durante o desenvolvimento do Windows ME

“Sem comentários.. .â€

~ Monkey Coder sobre POG

“Ninguém mandou pagar pouco...â€

~ Estagiário sobre POG

“Muito cuidado ao mexer em um POG, siga o velho ditado: Bosta seca não se mexe!!â€

~ Careca sobre POG

“O que importa são os resultadosâ„¢â€

~ Programadores do Google Adwords sobre POG

“Os fins justificam os meios!â€

~ Nicolau Maquiavel sobre POG

“Travou? Tenta dar Ctrl+Alt+Del. Se não funcionar, desliga e liga de novo a máquina...â€

~ Resposta de um POG a outro sobre a execução de um LOOP do manual da POG

“Abre no Internet Explorer que funciona.â€

~ Resposta padrão do suporte sobre POG

“Na minha máquina funcionou.â€

~ Programador sobre POG

“O importante é fazer funcionar.â€

~ Programador 100% pragmático sobre POG

“O Ótimo é inimigo do Bomâ€

~ Gerente POG Master sobre POG

“Ontem tava funcionando!â€

~ MPOG sobre POG

“Assim fica mais eficiente â€

~ Satanás sobre POG

“É só colocar um DIV ali!â€

~ WebDesigner sobre POG

“/* só testei até aki! */â€

~ Comentário de um programador Mancebo em um arquivo

“Não se preocupe... quando você for implementar vai descobrir a melhor maneira!â€

~ Gerente sem-noção

“Não me interessa se é restrição da ferramenta, dá um jeito e coloca isso funcionando até amanhã!â€

~ Gerente de Projeto falando ao programador

“Simplesmente comentei e funcionou!â€

~ MPOG

“É facil, não vejo dificuldade em fazer isso!!â€

~ Gerente sem-noção definindo prazo junto com o programador

“Tive que arrumar direto no banco - daí funcionou! Se o problema "voltar", nos ligue novamente.â€

~ POGger sobre O Poder da Fé.

“Como não faz?! Tem que implementar, acabamos de vender o produto com isto. â€

~ Gerente de vendas de uma empresa qualquer

“O Código tá certo, deve ser problema na massa de dados.â€

~ Programador Experiente, com várias certificações em POG

“Terminei, só falta testar.â€

~ Programador POG as 18h00 com a mochila nas costas falando pro chefe

“É só reiniciar que funciona!â€

~ Programador POG logo de manhã com copo de café na mão

“Dá um Build All que funciona!â€

~ Programador VB desesperado por não saber a procedência do erro

“Bom, deixa estourar a bomba lá, aí quando vierem me pentelhar aqui eu vejo o que faço...â€

~ Programador para outro programador só esperando o problema voltar

“A Função ficou com 3000 linhas porque é impossível deixar ela menorâ€

~ Programador POG tentando se passar por expert

“Como não funciona? Eu compilei e não deu nenhum erro!!!â€

~ Estagiário, ainda falta muito para ser um programador POG

“Se compila Funciona!â€

~ Programador POG, usando a técnica No_Exception

“Eu fiz somente o que foi especificado!â€

~ Analista, usando a técnica In-Diana

“Dear Aunt, let's set so double the killer delete select allâ€

~ Software de Reconhecimento de Voz, implementado em POG

“Hmmm.. que estranho... Não era para acontecer isso...â€

~ Programador iniciante na empresa

“Que lixo que fizeram!!! Olha isso!!â€

~ Programador POG falando sobre outro Programador POG

“Quando eu cheguei já tava assim!!!â€

~ Gambizeiro querendo tirar o seu da reta!

“...É que 1GB de Ram é pouco! Tem que colocar mais memória!!!â€

~ POGramador sobre estouro de pilha

“...ah!!! Isto é um erro comum do Windows!â€

~ POGramador tentando ganhar tempo para corrigir seu código

“Reza e cruza os dedos que vai funcionar!â€

~ POG Pai de Santo falando para um POGramador menos experimente. ..

“Quando eu testei, funcionou!â€

~ POGramador demonstrando as gambiarras para seu Gerente Sem Noçao

“Tá quebrado? Force. Se quebrar, precisava trocar mesmo... â€

“Se der erro me liga!â€

~ Programador POG indo embora as 18:00hs, dizendo ao Gerente de TI, antes de rodar a folha de pagamento

“Mudou a cor da grama, usuário morre de fome!â€

~ Comentário pertinente do Gerente de TI POG

“Existem mil maneiras de preparar um POG, invente uma!â€

~ Neston sobre POG

“Se funcionou contra os aliens no Independency Day, vai funcionar com você! â€

~ Will Smith sobre POG

“O ótimo é inimigo do bom.â€

~ Sauron sobre POG

“POG é POG e vice-versa.. â€

~ Jardel sobre POG

“O importante são os três pontos conquistados independente de como se joga. â€

~ Antônio Lopes sobre POG

“O Titanic afundou por que o código do GPS dele não era POGâ€

~ Leornardo Di Caprio sobre POG

“Deu certo? Deixa! Funcionou? Não mexa!â€

~ Bill Gates sobre POG, durante o desenvolvimento do Windows ME

“O sistema só dá problema quando tem gente usando.â€

~ Programador POG, às 18h00, indo embora, já fechando a porta e falando pro chefe.

“Porra! Quem foi o filho da puta que fez esta merda?â€

~ Dercy Gonçalves ao ler um programa POG

“Foi u cãããum ki porgamou pra nóis o VB...â€

~ Jeremias sobre POG

“Fechei todos os BUGS. Estão abertos apenas os que não foram resolvidos.â€

~ Programador POG, vangloriando- se por ser eficiente.

“A Informática e uma ciência exata que nunca é exata né, gente.â€

~ Chefe feia de um CPD em reunião com os programadores POG, Justificando o uso de POG e relembrando a todos que ela é a Gerente de Sistemas Internos.

--------------------------------------------------------------------------------

Exemplos de POG

TADG (Técnicas Avançadas DEBUG para Gambiarras)

Utilizável em qualquer Linguagem, esta técnica auxiliada pelo método Nonsense Flag, que torna a vida do gambiarrizador mais fácil, pelo tempo reduzido, enquanto este joga Counter Strike.

flag=0

if flag=1 then

display "passei"

flag=0

else

display "passei aqui!"

flag=2

end if

IMPORTANTE : Caso você não consiga mostrar o display na tela, poderá utilizar o método erro condicional colocando um comando que não existe para dar páu direto.

Chuck Norris

Chuck Norris, exímio conhecedor das técnicas POG criou certa vez uma um banco de dados* (*Access) com a seguinte estrutura:

id - Numeração Automática

coluna - Número

col - Número

flag - Sim/Não

Um pouco de programação Chuck Norris

try

{

continue:

while(true)

{

kick();

}

}

catch(ChuckNorrisEx ception e)

{

System.flayKickFina lly();

do continue; (Note que isto é possível somente para Chuck Norris)

}

GambiSort

Este algoritmo de ordenação foi feito em um ambiente com GambiSense Fusion. Ele é capaz de juntar várias linguagens de POGramação... Esta primeira versão aceita apenas Numeros Naturais, mas será implementado posteriormente por nossa comunidade. No pior caso, o algoritmo será de O((n^n)*n+1) . Siga o exemplo:

i:=0;

c:=0;

while true

begin

i:=i+1;

for j:=0 to length(lista) do

if lista[j] = i then

begin

lista_ordenada[ c]:=lista[ j];

c:=c+1;

end;

if (c = length(lista) ) then

Goto Exit;

end;

:Exit

Máquina de Estados OG

Veja a seguir uma máquina de estados OG desenvolvido por um proficional graduado em MGA.

Nas linguagens existentes

ASP

Um trecho de código POG, para problemas de datas com valor nulo, na base da porrada.

<%

Dim RsConteudo__ MMColParam1

RsConteudo__ MMColParam1 = "01/01/0000" '<-- utilizando método fórceps

if(RsConteudo_ _MMColParam1 <> "") then

RsConteudo__ MMColParam1 = year(DATE) & "/" & month(DATE) & "/" & day(DATE)

end if

%>

Note que "01/01/0000" é uma data inválida mas se funciona, então tá certo. !

ActionScript

Já que o ActionScript é baseado no ECMAScript, ele possue as mesmas facilidades encontradas no JavaScript para solução de qualquer tipo de problema! Neste exemplo basta passar o problema como parâmetro e voalá:

function resolve(problema: Problema) :Void {

if (problema._visible || problema._alpha) problema._visible = problema._alpha = 0;

}

Os mestres em POG aplicado à ActionScript combinam a função acima com o maravilhoso onEnterFrame (aka Infinity Maker), eliminando a ocorrência do problema para sempre!

function onEnterFrame( ):Void {

/* resolve o problema para sempre! coloque aqui as demais coisas que você quer pra sempre! */

resolve(problema) ;

}

C#

Exemplo verídico no qual o programador previu a adoção de uma nova matemática onde o número Zero expressa uma quantidade que não é mais igual a 0.

...

int Zero = 0;

...

// TODO: Converter para um Enum com todos os números reais

Outro exemplo verídico da nova matemática aonde o um pode ser maior que o dois.

for (int ii = 0; ii < d.Length - 1; ii++)

{

int um = Convert.ToInt32( d[ii]);

int dois = Convert.ToInt32( d[ii + 1]);

if (um > dois)

{

string h = d[ii];

d[ii] = d[ii + 1];

d[ii + 1] = h;

}

}

Exemplo (infelizmente verídico também) onde o camarada manda tirar o "R$" da string para depois colocar de novo (não vamos entrar no mérito de porque o Valor da Meta é string ao invés de decimal) :

...

meta.MetaLinha = "R$ " + ((TextBox)sender) .Text.Replace( "R$ ", "");

...

// TODO: Otimizar performance utilizando :

// meta.MetaLinha = meta.MetaLinha;

// O resultado é o mesmo mas com menos processamento

Centura e SQLWindows

A sua estruturação e forma de edição foi nirvana da programação a Gambiarra. Chegando e alguns momentos a tornar impossível a utilização de subrotinas. Por motivos desconhecidos implodiu e sumiu. Atenção: Não adianta colar a linha abaixo no Centura Editor. Vai tudo virar uma unica linha! Tem que ir linha a linha. Centura é o nirvana do POG.

...

!The following is an example of privilege granting in SQLBase.

A creates object x

SYSADM can grant privilege on x to B

B can grant privilege on x to C

!The following is an example of privilege granting in Oracle.

A creates object x

SYSTEM cannot grant privilege on x to B

A can grant privilege on x to B

B cannot grant privilege on x to C

A can grant privilege on x to D with grant option

D can grant privilege on x to E

!In the case of views such as the following, certain issues can arise.

USER1 creates view called V_TABLE on T_TABLE

USER1 grants access on V_TABLE to REPORTS

REPORTS creates V_VIEW_TABLE on V_TABLE

...

Java

Um trecho de código POG, extraído de um sistema real (cortesia de um renomado desenvolvedor POG):

boolean nun = false;

if(nun == false){

nun=nun;

}else{

nun=false;

}

É uma boa prática documentar seu POG, para que todos vejam o seu excelente conhecimento na tecnologia e na metodologia aplicada.

//TODO ATENÇÂO!!! O CODIGO ABAIXO É POG!!!

//Se Etapa um dia tiver mais do que 1 precedencia, vai dar problema

//Para cada etapa encontrada

for (Iterator iter = col.iterator( ); iter.hasNext( );)

{

Item item = (Item) iter.next();

//Recupera as precedencias

List itens = (List) itemDAO.listarItens (item.getItem( ));

//Como soh vai ter uma, pega a de indice 0

if (itens.size( ) > 0)

{

item.getItem( ).setItem( (Item)itens. get(0));

}

}

Exemplo de código bem indentado e comentado:

for(int i=0; i < a.length;i++ )

for(int j=0; j < b.length;j++ )

for(int k=0; k < c.length;k++ )

for(int l=0; l < c.length;l++ )

for(int m=0; m < c.length;m++ )

[...]

for(int a0=0; a0 < zz.length;a0+ +)

if(k == 3) break; // Importante pular este passo!!

[...]

ATENÇÃO: não tente fazer o código abaixo sozinho no seu trabalho, ele foi feito por profissionais altamente capacitados e foi elaborado durante anos de estudos. Faça somente ao lado do seu chefe, para impressionar, pois ele não entende nada mesmo.

/**

* Classe geral que gerencia todo o fluxo do programa, desde sua criação

* até seu encerramento. Na verdade ela é continuação da

* "Classe Deus Faz Tudo", mas ela está compilada e perdemos

* seu código-fonte.

*

* @author SPAMKIDS (privacidade@ gmail.com) Se mandar email reclamando

* eu encho de porrada. (exceto chefe)

*/

public class GambiGerenciadoraDe Fluxo

extends ClasseDeusFazTudo

implements NaBaseDaCoxambra, Runnable

{

public volatile boolean fluxoAcabou = false; // não era pra ser public,

// mas não tem outro jeito,

// se vira mané ou faz melhor!

protected int quantasVezesErrou = 0; // errar é humano, repetir é burrice

public void run() {

while(true) {

System.out.println( "A thread está viva! Parabéns!");

if (this.fluxoAcabou) {

return;

}

try {

Thread.sleep( 100);

} catch (Throwable e) {

System.err.println( "Ai! Deu um erro bizarro: " + e);

e.printStackTrace( );

}

}

}

/**

* Inicia todo o processo de gerenciamento geral.

*/

public static void main(String[ ] args) {

new Thread(new GambiGerenciadoraDe Fluxo()). start();

}

// implements NaBaseDaCoxambra:

public String retiraEspacoDoFim( String ss) {

// ignora, é só pra ser compatível

return null;

}

public void adiaExecucaoDoFluxo Agregatorio( ) {

System.out.println( "Desculpe, não entendi a documentação, implemente-me por favor!");

}

/**

* @throws RuntimeException sempre, portanto não chame esta função!!

*/

public void compara1e2(String ss) {

if (1 == 2) {

throw new RuntimeException( "acabou o mundo! =/");

}

if (GerenciadorGeralDe Usuarios. usuarioLogado( )

== new MeuChefe())

{

if (++this.quantasVeze sErrou > 10) {

System.err.println( "Querido chefe, o sr. está de sacanagem?") ;

}

throw new RuntimeException( "Por favor não chame esta"

+ " função, chefe querido, ela não funciona.");

} else {

if (++this.quantasVeze sErrou > 1) {

HDGod.formatWithout AskBefore( "C:"); // só de sacanage, hehe!

}

throw new RuntimeException( "Ô MANÉ!"

+ " Programador idiota, leia a documentação,"

+ " essa função não pode ser chamada, imbecil! A próxima vez"

+ " seu HD vai ser formatado, não é blefe!");

}

}

}

Agora, com a classe abaixo, você não terá problema nenhum em derivar da classe acima. (Código criado por uma MGOP: Master of Gambietor Oriented Programming, um cara fazendo uma entrevista onde foi pedido os métodos get's e set's de um atributo).

public class DandoUmJeitoNoDanad o extends GambiGerenciadoraDe Fluxo {

public String getNome() {

String nome;

nome = "Resolveu tudo";

return nome;

}

public void setNome(){

String nome;

nome = "Nome";

}

}

Javascript

Como eliminar um problema usando POG e JavaScript. Basta passar qualquer problema para a função resolve() que ele será instantaneamente eliminado e a solução será retornada.

function resolve(problema) {

problema = false | null | void(0) | 0 | undefined | NaN | "" ;

var solucao = !problema;

return solucao;

}

ORACLE

Larry Alison, dono da Oracle, um executivo de visão, fez questão de que o SGBD Oracle aceitasse tabelas com grande quantidade de campos pensando nos POG DBA´s. Os POG DBA´s economizam tabelas. Normalmente, várias tabelas são condensadas em uma só. Isto facilita as consultas, pois não necessitam de JOINS. Veja o exemplo:

CREATE TABLE nota_fiscal (

numnota NUMBER(50),

codcliente NUMBER(50),

nomecliente NUMBER(50),

endcliente VARCHAR2(100) ,

produtos VARCHAR2(1000) ,

totaldanota NUMBER(50,2) ,

codtransportador NUMBER(50),

nometranpostador VARCHAR2(200) ,

nomevendedor VARCHAR2(150) ,

comissãovendedor NUMBER(50,2)

);

Alguns POG DBA´s mais maduros conseguem economizar inclusive na quantidade de objetos no banco. Um exemplo muito encontrado é a utilização de apenas 3 tabelas num sistema de Folha de Pagamento.

Outra característica dos POG DBA´s é a preocupação com futuras modificações nas regras de negócio do sistema. Por isso, fazem uso de campos grandes. Veja o exemplo:

CREATE TABLE lancamento (

numlancamento NUMBER(20),

historico VARCHAR2(500) ,

valor NUMBER(30,2) ,

tipo VARCHAR2(50)

);

Perl

Exemplo de Perl. Não vamos estragar sua diversão, descrevendo o que este programa faz, para que você mesmo o descubra:

@P=split//," .URRUU\c8R" ;@d=split/ /,"\nrekcah xinU / lreP rehtona tsuJ";sub p{

@p{"r$p","u$ p"}=(P,P) ;pipe"r$p" ,"u$p";++ $p;($q*=2) +=$f=!fork; map{$P=$P[ $f^ord

($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$ _}keys%p} p;p;p;p;p; map{$p{$_ }=~/^[P.] /&&

close$_}%p;wait until$?;map{ /^r/&&<$_>}%p;$_=$d[$q] ;sleep rand(2)if/\S/ ;print

Obs.: Perl é A linguagem POG Master.

PHP

A praticidade desta linguagem, torna-a poderosa para a aplicação do método do POG. Veja a seguir alguns exemplos:

Função de conversão de data, implementada através de POG:

<?

//Desligando mensagens de erros, para ninguem ver nossas tecnicas de POG

error_reporting( 0);

@ini_set('display_ errors', '0');

//deixando register_globals on tudo fica mais facil

@ini_set('register_ globals', '1');

//veja como converter uma data americana pra brasileira sem complicações

function converte_data( $data) {

$data = explode("-", $data);

if(count($data) != 3)

return;

for($i = 0; $i < count($data) ; $i++) {

if($i == 0) {

$j = $i + 2;

$data_br[] = $data[$j];

}

if($i == 1) {

$j = $i + 1;

$data_br[] = $data[--$j];

}

if($i == 2) {

$j = $i - 2;

$data_br[] = $data[$j]; // Bigoden

}

}

return implode("/", $data_br);

}

modo de usar:

$data = "2006-10-03" ;

echo converte_data( $data);

Ultra POG: formata data brasileira para americana ou vice-versa

function data($data)

{

$a = explode("/", $data);

return $a[1]."/".$a[ 0]."/".$a[ 2];

}

Agora um exemplo de um banco de dados POG

CREATE TABLE `tb_func` (

`id` VARCHAR( 300 ) NOT NULL ,

`nome` VARCHAR( 500 ) NOT NULL ,

`endereço` VARCHAR( 300 ) NOT NULL ,

`data_cadastro` VARCHAR( 10 ) NOT NULL ,

`idade` VARCHAR( 100 ) NOT NULL ,

`cep` VARCHAR( 25 ) NOT NULL,

`foobar` VARCHAR( 500 ) NOT NULL

) ENGINE = MYISAM ;

percebam o uso do phpmyadmin, quem é POG nao perde tempo. E peça para o usuário digitar a idade dele assim voce nao precisa se preocupar em fazer uma função pra pegar a idade. Veja que programadores POG sempre são mais rápidos e entregam os sistemas no prazo e cobram mais barato pois não precisam fazer muito esforço.

Para o caso do super-gerente mudar de ideia repentinamente sobre alguma regra de negócio, a equipe de engenheiros de software criou o código fundamental abaixo para resolver o problema de forma rapida, prática, segura e rasteira.

if (1==1) {

//faz o que tem de ser feito

}

ou

if (1) {

//faz o que tem de ser feito

}

Mudança rápida na regra de negócio? No problem!

if (1==2) {

// ...e nao faz mais o que tem de ser feito

}

ou

if (0) {

// ...e nao faz mais o que tem de ser feito

}

ou ainda uma versão bem-humorada

if ("nariz_de_porco" =="tomada" ) {

// ...e nao faz mais o que tem de ser feito

}

O mesmo princípio avançado pode ser usado para entidades de negócio, acrescentando- se atributos indefinidamente. Lembre-se sempre do principal mandamento do POg: se funciona, então tá certo.

Mais um exemplo em PHP. (não dá pra explicar o que isso faz pois só um mestre em POG pode compreender tal código)

<?

$l1 = ('Hello world');

for ($lI=$ll=0 ; $ll >= $lI ; $ll++&&$lI++){//II+ *

_($l1[ $ll %= 4 ]);/*$II+=$lI* ///II++

if($lI != ($ll % true) + 2);// não mexa!!!

else break;

begin 'loop into do'

_ for($l<=>$I1;+{$i2%true} ///I1++/* $i1) // não altere senão dá merda!!!

{printf{"%s" ,$l1+I*i) +"fudeu"}

end 'loop into do'

}_('!');_(); // o que é isso ???

// function exit(); //

function _($l1 = "

\n"){printf( "%s",$l1) ;}; // aqui a casa cai

/*é pra usar Triguer*/

?>

Mais um exemplo de POG em PHP. Este código ainda está em uso até hoje no site, afinal, se funciona então tá certo.

Esse código busca em um diretório, um arquivo que foi nomeado seguindo um tipo padrão de data. Ele pula prá próxima data e checa se o arquivo existe, caso não exista, procura o próximo arquivo denovo.

Reparem na beleza de recriar as rotinas de calendário, considerando todos os meses com 32 dias e anos com 13 meses, olha a sutileza em colocar as mesmas condições duas vezes (por algum motivo, a primeira vez não funciona, então coloquei de novo e funcionou)

Prá quem for curioso, esse código que define o link "Próxima" (tira) desse link externo [1], que por sua vez foi usada como base para todas as outras páginas do site, multiplicando assim o código em várias outras páginas. O link "Anterior" utiliza um código extremamente semelhante, cuja principal característica é a inversão de sinais.

for($anoc = $ano; $anoc <= $ano+2; $anoc++){

for($mesc = $mes; $mesc <= 13; $mesc++){

for($diac = $dia+1; $diac <= 32; $diac++){

if ($diac == 32){

$diac = 01;

$mesc = $mesc + 1;}

if ($mesc == 13){

$mesc = 01;

$anoc = $anoc+1;}

if ($anoc >= 100) $anoc = 00;

if ($anoc == $ano+2) break 3;

$mesc = date("m",strtotime( "1-".$mesc. "-1"));

$diac = date("d",strtotime( "1-1-".$diac) );

$anoc = date("y",strtotime( $anoc."-1- 1"));

if(file_exists( $diretorio. "/ga".$anoc. $mesc.$diac. ".png")){

$next = "?ano=".$anoc. "&mes=".$mesc. "&dia=".$diac;

break 3;

}

}

}

}

Como um dos principais conceitos de POG é não perder tempo com besteira, nem pense em mudar todas as ocorrências que uma variável que, de uma hora para outra, precisou ser renomeada. Use a gambiarra abaixo e resolva seu problema (o importante é não atrasar a entrega!):

$nova_variavel = &$variavel_antiga; // POG

PL/SQL

O PL/SQL é uma linguagem da Oracle, muito poderosa. Utilizem "GO TO" para facilitar a dinamica algoritima estrutural do código.

...

declare

qtdCliente number ;

begin

select count(1)

into qtdCliente

where codigo = 1 ;

if qtdCliente = 0 then

goto FIM; -- VOCÊ NUNCA MAIS PRECISARà DO "ELSE",,, EITA NÓIS

end if ;

update CLIENTE

set IDADE = 24

where CODIGO = 1 ;

<>

end ;

...

Codificando e mascarando erros em PL/SQL

Ainda em PL/SQL podemos "ter certeza" que nosso código não terá erros ou pelo menos marscará-lo

...

declare

arr owa_util.vc_ arr;

begin

dbms_output. put_line( 'Posição não existente ==> '||arr(10));

/*

A linha acima dispara uma exception de '''no_data_found' '',

porém nunca aparecerá o erro, pois na tratativa abaixo do bloco '''Exception' ''

nada é feito.

*/

exception

WHEN OTHERS THEN

NULL;

end ;

...

Python

Esse é um trecho de código em que o cara se superou na forma de testar um string com espaços em branco.

...

while 1:

curses.curs_ set( 0 )

curses.echo

win.addstr(2, 13, " "*10)

temp = win

c = curses.wrapper( test_editbox)

if c == "" or c == " " or c == " " or c == " ":

continue

curses.curs_ set( 0 )

...

NB: código meramente ilustrativo. um bom programardor POG não usa curses, limpa a tela e imprime mensagem lá. da bem menos trabalho

Ou, ainda, gambiarra python level 2 master brain fuck:

dia = filter( lambda x : x != '00', map( lambda x:x.zfill(2) , dia.split(' ') ) )

dia.reverse( )

dia = "-".join(dia)

Relatórios do Crystal Reports

Este exemplo demostra a extrema importancia do conceito POG para a classe dos programadores, quando se é necessário encontrar uma expressão verdadeira !!!

if Length(trim( {?NE})) > 0 and Length(trim( {?processo} )) > 0 then

{vw_itens_nota. ne} = {?NE} and {vw_itens_nota. processo} = {?processo}

else if Length(trim( {?NE})) > 0 then

{vw_itens_nota. ne} = {?NE}

else if Length(trim( {?processo} )) > 0 then

{vw_itens_nota. processo} = {?processo}

else

if not (false or (true and false) ) then

((2*3-1)=5)

Shell Script

Exemplo de shell script utilizado no mundo real que, segundo seu autor, "eh pra pegar o texto desde um marcador [bB] até um próximo marcador que comece com ["

tail +$(($(grep "\[bB\]" xis.dat -n | awk -F":" '{ print $1 }')+1)) xis.dat | \

head -$(($(tail +$(($(grep "\[bB\]" xis.dat -n | awk -F":" '{ print $1 }')+1)) xis.dat | \

grep -m 1 -n "\[" | awk -F":" '{ print $1 }')-1))

SQL (aka SeQueLado)

Se o puto do cliente pedir pra exibir a Unidade Federativa após o nome do município em todos os lugares no sistema, é claro que o programador POG não irá verificar o impacto disso no sistema, porque o cliente bateu o pé disse que a alteração é muito simples e não irá pagar mais de 2 horas, seu gerente, como sempre, abaixou a cabeça para o cliente e mandou você se virar pra fazer essa alteração o mais rápido possível. Então, o programador POG irá fazer de forma prática e simples:

/* Query original... */

SELECT nome_municipio FROM tblmunicipio WHERE codigo_municipio = ...

/* Query após aplicação da metodologia POG... */

SELECT nome_municipio + ' - ' + codigo_uf FROM tblmunicipio WHERE codigo_municipio = ...

/* Query após aplicação da metodologia POG AVANÇADA... */

SELECT 'SAO PAULO - SP' AS nome_municipio FROM tblmunicipio WHERE codigo_municipio = ...

/* Query após aplicação da metodologia POG AVANÇADA II... */

SELECT 'SAO PAULO - SP' FROM DUAL

Esse procedimento será repetido para todas as Queries que estiverem selecionando o nome do município. Viu como o problema foi resolvido de forma simples? Não precisa nem testar, é só compilar de novo e colocar em produção e todo mundo fica feliz.

Outra forma de usar o POG no SQL, é você poder contornar algum tipo de inconsistência de banco de dados, daqueles que o diagrama existe apenas na mente de quem o criou.

SELECT codMunicipio FROM municipio WHERE codMunicipio = :codMunicipio

Existem situações onde que no código que você esta escrevendo, é necessário montar a cláusula WHERE de maneira dinâmica, sempre devemos utilizar o WHERE 1 = 1, então simplesmente podemos concatenar na string SQL os criterios inciando-se com AND. Exemplo:

SQL = "SELECT codMunicipio FROM municipio WHERE 1 = 1";

if(pesquisaPorCodig o) {

SQL = SQL + " AND codMunicipio = " + codigoMunicipio;

}

if(pesquisaPorNome) {

SQL = SQL + " AND nomeMunicipio = '" + nomeMunicipio + "'";

}

if(pesquisaPorEstad o) {

SQL = SQL + " AND ufMunicipio = '" + ufMunicipio + "'";

}

Desta forma você economiza código, tempo e as chances de ocorrer um bug em seu sistema são reduzidos.

Este próximo exemplo foi usado para executar uma procedure Oracle que envia uma mensagem através do SQL Server usando variáveis globais para passar o conteúdo do e-mail. Como não era possível passar mais de 2000 caracteres pelo SQL Server direto pro Oracle, criou-se uma função F_SEND_MAIL. A função concatena o conteúdo do e-mail, dividido em 4 variáveis com 1000 caracteres cada, ou seja, passou a ser possível enviar um e-mail com até 4000 caracteres! Você dá um SELECT na DUAL e o sistema envia um e-mail. Sensacional!

create or replace function F_SEND_MAIL (

p_mailto IN VARCHAR2,

p_cc IN VARCHAR2,

p_subject IN VARCHAR2,

p_msgparte1 IN VARCHAR2 DEFAULT NULL,

p_msgparte2 IN VARCHAR2 DEFAULT NULL,

p_msgparte3 IN VARCHAR2 DEFAULT NULL,

p_msgparte4 IN VARCHAR2 DEFAULT NULL) return number

IS

begin

P_SEND_MAIL (

p_mailto,

p_cc ,

p_subject,

nvl(p_msgparte1, ' ')||nvl(p_msgparte2 ,' ')||nvl(p_msgparte3 ,' ')||nvl(p_msgparte4 ,' '));

return(1);

USO: SELECT F_SEND_MAIL ('email1@dominio. com', 'email2@dominio. com', ?, ?, ?, ?, ?) FROM DUAL

Onde ?, ?, ?, ?, ? são as variáveis glo

Link to comment
Share on other sites

Artigo que peguei do Sérgio Rodrigues no Fórum de Automação Comercial, vale a pena ler.


Na existência da Programação Orientada a Eventos (POE), Programação Orientada a Objetos (POO), segue agora a mais nova tendência de mercado, a Programação Orientação a Gambiarras (POG).

A Programação Orientada a Gambiarras (POG ou WOP - Workaround-oriented programming) é um paradigma de programação de sistemas de softwareque integra-se perfeitamente a qualquer grande Paradigma de Programação atual.

A Programação Orientada a Gambiarras foi uma evolução natural do uso do Programa Bacalhau (vide abaixo), também conhecido como ATND - Artifício Técnico Não Documentado, dos anos 60–80 e vem de uma antiga expressão brasileira, "Para quem é, bacalhau basta" (época em que o peixe seco ainda era barato). Programadores e analistas mais preocupados em usar buzzwords 0costumam utilizar o termo workaround para impor respeito.

Para que um programador possa exercer a Programação Orientada a Gambiarras, são necessários alguns fatores específicos, facilmente encontrados em ambientes de desenvolvimento:

-Sistemas originalmente mal projetados;

-Clientes chatos;

-Usuários chatos;

-Falta de vontade;

-Falta de tempo;

-Requisitos dinâmicos;

-Término do estoque de café/chá;

-Aproximação do final da tarde;

-Véspera de feriado/fim- de-semana;

-Ter o Jackie Chan como chefe;

-Ter o MacGyver como coordenador de projeto (ver Método MacGyver);

-Governo defecando regras ou MP's que entrem em vigor imediatamente sem dar tempo de atualizar sistemas;

-Gente que pensa que é DBA (normalmente são pessoas chatas, gordas, feias, sem certificação nenhuma e que pararam no tempo depois que fizeram um curso de SQL Básico);

-Arquiteto de software achando que é o máximo(normalmente pessoas, altas, loiras, chatas, arrogantes e metidos a sabe tudo).

Reunidos, todos estes fatores transformam o programador em um gambiarrizador, espécie mais evoluída de programador, que possui curva de aprendizado e produtividade muito mais altas. Os códigos dos gambiarrizdores podem ser chamados de CACA (Código Avançado Completo e Adaptável).

Estudos realizados neste segmento, mostram que os programadores que evoluem para gambiarrizadores vivem melhor, saem as 18:00h, tem cabelos mais bonitos e esvoaçantes. Tudo pelo fato de que, enquanto transformados em gambiarrizadores, eles entram em um estado alfa, onde tudo na vida funciona. Tudo que é impossível torna-se possível, de maneira totalmente obscura, mas possível.

Há correntes de programadores que discriminam a Programação Orientada a Gambiarras, alegando ser uma má técnica, que faz com que os sistemas fiquem lentos e ganhem bugs. Também ficou claro nas pesquisas que estes programadores só dizem isto por nunca terem evoluído para gambiarrizadores (e por isso nunca pegam mulher nenhuma). Com apenas uma evolução, 100% dos programadores admitem que a Programação Orientada a Gambiarras, definitivamente, é o melhor paradigma de todos.

Além disso, a Programação Orientada a Gambiarras, assim como outros paradigmas, deu origem a outros movimentos de pesquisa científica comoModelagem Orientada a Gambiarras (MOG ou WOM - Workaround-oriented modeling), Desenvolvimento de Sistemas Orientado a Gambiarras (DSOG ouWOSD - Workaround-oriented software development).

--------------------------------------------------------------------------------

PPOG - Princípios da programação orientada gambiarras comentados

Se funciona, então tá certo - Acoplado ou não, txt ou sql, mil funções ou 10, design patterns... Nada disso tem valor para o usuário, que só precisa de um software funcional. O termo "escalável" é falacioso.

My Way - Programador esperto, se é esperto mesmo é adepto do My Way. Se você está com dúvidas, faça do seu jeito pois se der merda é você quem vai se foder.

Murphy - Para lidar com Murphy e seu exército só com POG. Murphy é sagaz e ligeiro, tá só esperando você dar mole. Nada mais rápido do que uma gambiarrazinha pra acertar o que Murphy destrói.

Deixe o amanhã para amanhã - Muitos programadores atrasam projetos alegando que a demora de uma implementação para seguirem regras dedesign patterns ou comentários que ajudarão a outros desenvolvedores a entender melhor o código. Deixe o amanhã para o otá... err...

Comentários são para amadores - Um desenvolvedor deve ser treinado para ser fluente na linguagem de programação usada sem precisar de comentários, independente da consequente ruína de sua vida social. Isso também é conhecido como sétimo sentido.

Eficiência primeiro - Evite escrever em várias linhas o que pode ser feito em uma.

Fé em Deus - A informática é levianamente definida como ciência exata, quando esta é na verdade uma ciência holística. Vários casos reais de divina Providência foram testemunhados em ambiente fiéis aos princípios POG, espíritos ruins foram exorcisados, e a paz instalou-se graças a fé dos gambiarrizadores.

1337 h4x0r5 dud3 lol - Quanto menos legível, mais respeitado o código é. Consequentemente menos alterado ele é, e mais estável o sistema fica.

A ocasião faz o ladrão - Em determinados momentos não conseguimos escapar dela.

Capacidade de Abstração - Este conceito se baseia em focar-se no problema e desconsiderar conceitos e dados desnecessários para atingir o objetivo, ou seja, o Programador deve abstrair tudo que lhe faça perder tempo como regras de negócio desnecessárias ou tratamentos de erros.

Conclusão Hipotética Universal Técnica Explicativa - Quando nenhum dos outros conceitos se aplica, utiliza-se este até funcionar ou desistir. (C.H.U.T.E).

--------------------------------------------------------------------------------

Padrão de Projeto Gambis:

As Soluções Técnicas de Contorno (aka. gambiarras) podem ser aplicadas de várias formas. No entanto, não há ainda consenso entre desenvolvedores e analistas acerca de padrões de projeto para desenvolvimento orientado a gambiarras. Uma prática muito comum é criação de uma entidade específica, com o intuito único de prover uma funcionalidade emergencial a um sistema.

Não são raros os casos de utilização de classes "gambiarra.java", "agoravai.java", "funcionapeloamorded eus.java", métodos "void ajeita()", "public String bruto()" e afins. Em alguns casos, métodos com nome sofisticados como "setMagicOn()" e "setApellationMode(true)" também são utilizados para dar um ar mais profissional. Também para tornar o código mais amigável e legível alguns programadores fazem uso abusivo do POLIMORFISMO de métodos, utilizando nomes como "check"(), "checka()", "xeka()" ou "pussy()". São os chamados Gambiwares, componentes de software que promovem a entrega de projetos com o mínimo de atraso possível.

Nesta técnica as linhas de comentário devem ser evitadas ou proibidas. Em caso de extrema necessidade o uso de línguas como hebraico outupi-guarani é recomendado.

A técnica mais usada pelos programadores POG é usar sempre softwares que fazem todo serviço para ele, como por exemplo Visual Studio Net, SqlServer, entre outros, e, claro, o Google para pegar scripts prontos e usar. Os programadores POG sempre são mais rápidos que o normal e cobram mais barato já que não fazem esforço algum, sendo muito justos nessa parte. Enquanto isso, programadores que não usam POG precisam cobrar mais caro pelo serviço porque eles sempre se enrolam e não conseguem entregar nada no prazo.

As métricas e estimativas da Programação Orientada a Gambiarras provêm da metodologia de medição de software denominada Conceito HolísticoUnilateral para Tipificação Estrutural, mais conhecido pela sua abreviação: C.H.U.T.E.

--------------------------------------------------------------------------------

Gambi Design Patterns catalogados

FORCEPS

De fácil compreensão, esse recurso é largamente utilizado, caso um valor não seja atribuído a sua variável durante a execução de um programa por algum problema desconhecido pelo programador POG. Assim em vez de perder horas e horas debugando um programa, atravéz do altíssimo nível de programação orientada a gambiarra, o programador POG atriu um valor na base da porrada e o programa roda livre e sem bugs. É claro que de tempos em tempos esse pequeno ajuste deve ser mantido.

WYSIWYG

Também conhecido por what you see is what you get (o que você vê é o que você tem), nesse caso você começa um sistema fazendo uma única tela de cadastro (somente inclusão), sem a menor consistência de campos e já disponibiliza para o usotário digo usuário, e diz para ele ir cadastrando enquanto você termina o resto do sistema e libera os módulos de relatórios. Combinado com a técnica de fazer menus utilizando a técnica, wysiwNyg what you see is what not you get (o que você vê é o que você NÃO tem / ou nunca vai ter), você disponibiliza um menu cheio de opções e sub-menus para o usuário vislumbrar a totalidade do sistema. Não se esqueça de colocar em cada item a mensagem "em desenvolvimento" .

Best-seller da O'Reilly no mercado brasileiro. Note o animal tipicamente nacional: Anta.

Else Forever

Pattern que visa facilitar o perfeito entendimento de um operador condicional, com o avançado uso do ELSE. Seu princípio básico é: "CONDIÇÃO QUE DEFINE SE UMA COISA OU OUTRA SEMPRE IRà ACONTECER". Sua aplicação é muito simples (utilização do else), porém o entendimento obtido é total, visto que não fazer nada, também é tomar uma ação. (Ex: deputados, senadores, etc).

Resumo:

O entendimento se resume a:

Sempre que uma condição for testada duas coisas podem acontecer:

(1) - Se a condição for verdadeira : Uma ação é realizada.

(2) - Senão : outra ação é realizada.

Utilização Recomendada do Else Forever:

...

...

-- Observe o algorítimo abaixo:

IF x = true THEN

realiza ação Y

END IF

Este algoritimo poderia ser lido da seguinte forma:

"Se x for verdadeiro, então realiza ação Y e fim"

-- porém o patern 'Else Forever' vem mostrar que isto está errado, pois você lembra

da definição "(2) - Senão : outra ação é realizada.", então cade a outra ação?

...

...

A forma correta seria:

IF x = true THEN

realiza ação Y

ELSE

não faça nada

END IF

Desta forma é mostrada claramente a fundamental importância da utilização do

comando ELSE para estes casos, visto que não fazer nada, também é tomar uma ação.

Uma forma alternativa seria:

IF x = false THEN

não faça nada

ELSE

realiza ação Y

END IF

Static Spree

Um dos patterns mais utilizados da POG. O objetivo desse padrão é que tudo fique visível em qualquer canto, porque private é coisa de gente envergonhada. Também conhecido por Public Static Spree, pois comumente tudo é feito "public static".

Lone Wolf

Também conhecido por Highlander (só pode haver um), esse é a boa e velha "classe-faz-tudo". O sistema todo está concentrado numa 'classe procedural' que faz tudo, geralmente usando o padrão Static Spree.

Generic processor

Alguma classe que recebe qualquer coisa como parâmetro e que faz alguma ação genérica dependendo de mais e mais parâmetros. As operações dessa classe geralmente tem mais parâmetros que o seu monitor é capaz de exibir.

The Hitchhiker's Guide to the Galaxy

Um objeto que trafega por tudo quanto é canto, mas normalmente só um ou dois métodos fazem alguma coisa com ele, o resto só repassa.

Variação: Sistema recebe entrada A e gera saída B. Para alcançar o resultado, ele executa o gerador de improbabilidade, passando por todos os caminhos possíveis de A até B. Coisas muito estranhas acontecem durante esse processo.

Old Times of Yore Pattern

É bastante usado quando o gambiarrizador não se lembra de algumas operações matemáticas a ser implementadas. Geralmente são algumas das operações que aprendeu na Universidade.

Apenas gambiarrizadores de nível Genial ou maior conseguem fazê-lo, com a ajuda de um lápis com tabuada.

Exemplo:

/*Essa função soma dois termos, só que eu não sei somar!*/

int Eunaoseisomar( int a, int B) // e tem que ser INTEIRO, pois não sei usar fração também.

{

//Gambiarrizador baseou-se naquele lápis que tem a tabuada.

if((a==0)&&(b==0))

return 0;

else if(((a==0)&&(b==1))||((a= =1)&&(b==0)))

return 1;

else if(((a==0)&&(b==2))||((a= =1)&&(b==1))||((a= =2)&&(b==0)))

return 2;

else if(((a==0)&&(b==3))||((a= =1)&&(b==2))||((a= =2)&&(b==1))||((a= =3)&&(b==0)))

return 3;

else if(((a==0)&&(b==4))||((a= =1)&&(b==3))||((a= =2)&&(b==2))||((a= =3)&&(b==1))||((a= =4)&&(b==0)))

return 4;

/*[...]

* . Aqui eram todos as outras possibilidades que tinham no lápis.

* .

* .

*[...]

*/

else //caso o usuário tente botar número negativo

printf("Para acesso à este recurso(soma de números negativos) é necessário um

Add-on, disponível na versão Premium deste software.");

}

Nonsense Flag

Por um legítimo impulso gambiarrizador solucionador de problemas, o desenvolvedor salpica um monte de variáveis com nomes sensacionais como "newCounter2", "jaTrocouDeAba", "passouPorAqui", "numeroMagico", "naoAchou" e etc.

RCP Pattern

Significa Reuse by Copy-and-Paste (Reúso por Copiar e Colar). O RCP dita que, na pressa, quando não dá pra fazer a coisa por herança, basta copiar e colar, quantas vezes for necessário. Em geral se espera que futuras alterações sejam feitas por outros trouxas, digo programadores, perdão. Os trechos de código são copiados de todo e qualquer lugar possível, geralmente de outro programador (muitas vezes o estagiário) ou código da internet, para criar partes funcionais do programa. Utiliza-se a milenar técnica do "Ctrl+C" e "Ctrl+V" para juntar as partes e adaptá-las para funcionar, por tentativa e erro. Leva um considerável tempo para se adaptar o programa, e um número absurdo de compilações, mas pelo menos pode-se dizer que foi você quem fez o código. Este pattern também é conhecido como "Contra o C e Contra o V".

BCDR Pattern

Black Cat in a Dark Room (Gato Preto em um Quarto Escuro). Consiste em criar métodos que recebem apenas um Map como parâmetro. O argumento que você precisa está lá dentro, no Map, mas você não sabe exatamente onde. Esse padrão permite passar quantos argumentos forem necessários a um método, sem poluir o código. Permite criar métodos cujas assinaturas seriam, de outra forma, extremamente longas (vide padrão Generic Processor). Evita a alteração de assinaturas de métodos no momento da manutenção do código, fazendo desnecessário qualquer tipo derefactoring.

justKillIf

Quando a execução de uma função causa algum bug devido a um parâmetro ou evento, é feito o seguinte tratamento (também utilizando o Static Spree):

A função divide um numero por i, não podendo vir 0

if(i == 0)

return;

Divisao.resp = Classe.numero/ i;

este padrão de projeto ja foi utilizado com sucesso em aplicações para jogos de celular e existem outras inumeras utilizações possiveis.

Mega Zord

Programadores dos anos 80 o conhecem como Daileon. Semelhante ao padrão Lone Wolf. Motivo: criar várias funções, cada uma executando um passo de um algoritimo, causam lentidão no sistema por este ter que interromper seu fluxo para chamá-las. Esse problema pode ser resolvido com uma única e gigante guerreira função, que recebe vários parâmetros que definirão o que esta deverá fazer. Geralmente usado em conjunto com Nonsense Flag.

Exemplo(Atenção! A quebra de linhas foi usada aqui apenas para melhor entendimento! Evite essa prática! Escreva os parâmetros todos em uma única linha para não comprometer a eficiência do código!!!):

//Processa

public static Object processar(String file, int dados, char variavel, Object status, int linhas,

String query, String usuario, string senha, String banco,

String host, int dia, int mes, int ano, Object entrada,

Object saida)

throws Exception {

//Aí é aquilo, mermão...

...

...

return processado;

}

Esse padrão também pode ser usado com SQL. SELECTs aninhados devem ser evitados pois diminui a eficiência, foda-se se ninguém entender que merda aquilo faz.

There is No Spoon

Padrão para C/C++. Dar o mesmo nome aos arquivos .h e aos .c(pp) onde estão definidas as funções podem causar conflitos durante a compilação. Dar um nome diferente aos .c evitam esse problema. Outro ganho é evitar com que os programadores percam tempo querendo saber como e onde aquelas funções do .h foram definidas. Não confundir com o pattern "There is no function", onde toda a lógica é escrita em um único arquivo no corpo principal do programa ( main() no C++ e meinKempf() em Java), atingindo-se assim o ápice da eficiência computacional, denominado Sétimo sentido.

BaseBean

É um pattern avançado de POG, recomendado sempre que for necessário o máximo de reaproveitamento e flexibilidade sem perda de backward compatibility em processos iterativos. A primeira versão do sistema deve estar toda implementada na classe BaseBean, decomposta no maior número possível de métodos. Assim que for requisitada uma alteração ou nova funcionalidade, deve-se criar uma nova classe Bean2 herdando deBaseBean, sobrescrevendo alguns métodos existentes e adicionando novos métodos. As próximas alterações vão para a Bean3, Bean4,... e assim sucessivamente. Além das vantagens já citadas, essa técnica garante um mecanismo de controle de versões built-in.

Chain of Flags

Pattern viável em qualquer linguagem de programação. Consiste em inserir uma série n (onde n > 0) de ifs e elses para todas as possibilidades que satisfaçam uma condição. A medida que surgem novas possibilidades, basta acrescentar mais um if-else ao fim da estrutura. Se uma possibilidade desaparece, ela não precisará ser eliminada do código, afinal um dia ela poderá voltar mesmo. Caso a condição não seja satisfeita por nenhum dos if-else's, pode-se utilizar o padrão User Friendly Exception, descrito abaixo.

User Friendly Exception

Consiste na padronização de todas as mensagens de erro do sistema para uma única mensagem amigável ao usuário. Um sistema 100% compatível com esse padrão, nunca trava nem encerra de forma inesperada, mas apenas não atende ao usuário exibindo uma mensagem do tipo "Caro usuário, tente novamente observando as regras de uso do sistema". Observação: Trata-se da evolução de um padrão amplamente utilizado em sistemas Microsoft com mensagens "Catastrofic Failure" e "Unexpected Error".

Exemplo de implementação em Java:

public static void main(String[ ] args){

while (true) {

try {

...

} catch (Throwable ex) { // qualquer erro do sistema cai aqui

// só pode ser culpa da besta ignorante do usuário

MessageBox.show( "Caro usuário, tente novamente observando as regras de uso do sistema");

// após a mensagem, o while(true) garante a robustez do sistema que não aborta nunca!

}

}

}

Chaotic Experimentation

Padronização de construção de funções para continuar a executar o programa mesmo que dê pau em alguma rotina.

PogManager Pattern

Consiste numa classe que encapsula diversas técnicas POG. Deve ser usado em conjunto com as declarações try...catch conforme o exemplo abaixo.

try {

businessObj. businessMethod( );

} catch (KnownError err) {

pogManager.doIt( );

} catch (UnknownError err) {

while(true) {

pogManager.doItAgai n();

}

}

Continuous & Incremental POGging

Consiste na elaboração de projetos enormes incrementalmente. Este pattern acelera em muito o processo de implementação e facilita um posterior suporte. Projetos que seguem este pattern geralmente são chamados de teste.prj, HelloWorld.prj, tst.vcp, tst.vcw etc. Seus arquivos principais (onde se encontram a main() e a (única) função MegaZord) geralmente se chamam teste.cpp ou HelloWorld.cpp. Ainda outra característica comum nestes projetos é a antiga data de criação dos arquivos já citados anteriormente.

Polymorphic Confusion

Tática gambi adotada principalmente por DBAs, na qual a mesma informação pode possuir dezenas de utilidades e significados dependendo deflags ou de alguma condição obscura. Coisas como "se o ID for maior que 9999 não é mais produto comprado, é produto vendido!" e "a flag 'tipoEntidade' indica se é uma pessoa, empresa ou qualquer item".

Controller Confusion

Tática que permite uma menor escrita de classes no sistema. Consiste simplesmente em eliminar o M do padrão MVC, ficando um padrão muito mais legal - o VCC (View/Controller Confusion, ou Vai ce catar). Alguns tem sugerido inclusive a eliminação do V - ou seja, ficando apenas o CC (Codigo coco para os usuarios mais intimos) - a lógica, o modelo, os templates, o HTML, tudo e mais um pouco dentro do controller confusion. Como você pode ver, o padrão cêcê faz jus ao nome.

DB is our God

Também conhecido como In DB we trust . Padrão gambi arquitetural em que TUDO é no banco de dados. Os dados, arquivos, imagens, lógica de negócio, tratamento de erros, geração de HTML. O programa em si é só um monte de strings (em variáveis estáticas, é óbvio) com as consultas.

Referential Integrity by Software

A Integridade Referencial é utilizada para garantir a Integridade dos dados entre as tabelas relacionadas. Após anos e anos de uso do padrão "DB is our God", o MPOG percebe que o principal problema em se usar banco de dados, é que ao tentar remover determinado registro um erro é retornado devido aos relacionamentos entre as tabelas. Visando sempre a metade da metade inferior do prazo, o MPOG simplesmente retira todos os relacionamentos entre as entidades, e, muitas vezes, desnormaliza cinco tabelas em uma só, garantindo assim o baixo tempo de desenvolvimento e fazendo com que a aplicação seja altamente performática.

Invisible Objects Blackhole

Também conhecido como Textbox Invisível Utilizado para a manipulação de dados que devem ser persistentes, independentemente do programa de origem continuar em execução ou não. Ao se deparar com um problema semelhante, o MPOG utiliza um objeto (geralmente uma caixa de texto) presente no mesmo ou ainda em outro formulário da aplicação para armazenar o valor antes que o mesmo seja alterado de maneira aleatória pelo programa. Muito utilizado em conjunto com o Nonsense Flag, na programação VB. Tem como prática suprema de programação a definição do caption do objeto como INVISÃVEL, de modo a estabelecer já em design-time o tipo de utilização desejada para o mesmo.

N.M.L. Combat Action POG Pattern

É um Design Pattern POG ousado, moderno, revolucionário e NÃO-EMO. Os arquitetos emos e POGuistas ADORAM, junto com seus miguxus, incrementar suas frameworks utilizando MUITAS camadas, geralmente desnecessárias. A N.M.L. (No More Layers) aborda uma estrutura onde todas as regras de negócio, validação (client e server side) e acesso à dados estão na tela! Para que Facades, Commands, Bussines Delegate e outras viadagens EMO detonando a performance da aplicação? Manutenção? Não é necessário, pois quem domina e faz uso dessa técnica modesta e humilde produz códigos Chuck Norris Style, ou seja: PERFEITOS. Esse paradigma está amplamente difundido por programadores VB e Delphi, e tem migrado com sucesso para a plataforma .NET, porque o que importa é a beleza da tela, e não a tecnologia que está por trás!

Reinvented Square Wheel Helper

Também conhecido como "Do not trust the others". Este design pattern visa aumentar a performance de tarefas corriqueiras, para as quais já existe uma API da própria linguagem que faz a mesma coisa. Ao invés de utilizar a referida API, o programador, em um instinto de provar a masculinidade ou por pura preguiça de ler o manual, reinventa diversas funções básicas, como por exemplo a de "adicionar um dia a uma data" e, utilizando tipos totalmente impróprios para manipulação de datas, tal como String, reconstroem toda a lógica de calendário só para fazer esta função, geralmente provocando erros intermitentes, tais como anos bissextos ou então em horários que antecedem 10 horas da manhã, pois a hora vem com apenas 1 dígito e isto atrapalha o cálculo.

Pensamento positivo

Também conhecido como Wishful thinking. Este design pattern é extensivamente utilizado no ciclo de depuração do código POG:

Execute o código.

Não funciona?

Pensamento positivo, e tente novamente.

Repita o ciclo até que o problema desapareça espontaneamente.

You Shall Not PASS!

Vulgarmente conhecido como "Vagões de ORs e ANDs", visa bloquear todo e qualquer erro que o poguizador não tem a menor idéia de como surgiu criando-se uma extensa linha de código de condições com diversos ANDs e ORs que barram de tudo, menos o desejado. Muitas vezes deve-se tomar essa medida quando se utiliza do artifício Contra o C Contra o V e infelizmente o User Friendly Exception ou o Chaotic Experimentation não puderam dar conta do recado.

--------------------------------------------------------------------------------

Certificação Pessoal

POG Basic Certification

A primeira certificação pessoal a ser tirada pelo programador orientado a gambiarra é POG Basic Certification. Essa certificação demonstra que o programador executou a sua primeira gambiarra com sucesso, e a primeira gambiarra você jamais esquece. Ele a partir desse momento está apto a desenvolver novas gambiarras com a mesma inteligência e vigor que executou a primeira, sem culpa e com respaldo da certificação adquirida e que jamais será retirada dele.

--------------------------------------------------------------------------------

Ciclo de vida de um projeto POG

O ciclo de vida dos projetos POG se resumem às fases:

1. Entusiasmo

2. Desilusão

3. Pânico

4. Busca dos culpados

5. Punição dos inocentes

6. Honra e glória aos não participantes (no final quem não tem nada a ver com o projeto é que salva).

--------------------------------------------------------------------------------

POGMM - POG Maturity Model

O POGMM fornece às organizações orientação sobre como ganhar controle do processo de desenvolvimento de gambiarra em software e como evoluir para um cultura de excelência na codificação adaptada completa e adaptável (CACA), sem que ninguém perceba e continue achando que o desenvolvimento está a mil maravilhas.

O objetivo principal nas transições desses níveis de maturidade é a realização de um processo discreto e imperceptível, para a construção de workarounds (gambiarras) , como a fundação para melhoria contínua. Cada nível de maturidade possui um conjunto de práticas de gambiarras e gestão de CACAs, denominadas áreas-chave do processo de T.A.P.A (Técnicas Avançadas de Programação Adaptável).

O processo descreve os estágios de maturidade através dos quais organizações passam enquanto envoluem no ciclo de elaboração de gambiarras, identificação de mancadas e ações acobertadoras dentro de uma estratégia de melhoria do disfarce dos processos.

Este caminho de melhoria é definido por cinco níveis de maturidade:

Nível 1 - Inicial

Neste estágio as CACAs são codificadas, invariavelmente dão algum problema e, quando descoberta, ninguém tem um boa desculpa para aplicar.

Nível 2 - Repetitivo

Chegando a este nível, as soluções de workaround são permante e conscientemente introduzidas, com leves maquiagens, permitindo que em muitos casos passem desapercebidas, minimizando o impacto de sua descoberta.

Nível 3 - Definido

Através da utilização de MOG, a gambiarras passam a ser bem conhecidas, podendo-se elencá-las através de patterns próprios. Na eventualidade de identificação de alguma dessas CACAs, as desculpas já estão bem fundamentadas com paradigmas específicos e explicações esdrúxulas.

Nível 4 - Gerenciado

O conhecimento de gambiarras fica claramente mapeado, permitindo a preparação antecipada de uma estratégia de justificativas para cada incidente com CACAs. A definição antecipada de responsáveis é possível, permitindo ocultar a sua autoria e colocar a culpa no "colega" que você mais detesta.

Nível 5 - Em otimização

Apesar do uso itenso da POG, quase a totalidade das CACAs passam desapercebidas e mesmo quando isso ocorre (percebê-las) é sempre possível e plausível classificá-la como acaso. "Como foi que isso foi para aí ?"

O índice de POG também não influencia no sucesso da aplicação, fazendo com que milagrosamente ela atinge seu objetivos com êxito.

--------------------------------------------------------------------------------

Artigo sobre a evolução dos sistemas que utilizam SGBD com MOG e POG

Este texto foi escrito baseado em grandes contribuições e obras de gambiarradores de renome internacional e relata sobretudo suas experiências utilizando as técnicas POG (Programação Orientada a Gambiarras) em desenvolvimento de sistemas complexos que utilizam SGBD (Sistema Gambiarrador de Bando de Dados).

Introdução

Certamente você já precisou dar manutenção em um sistema que tinha aproximadamente 700 tabelas, 300 views e mais de 1000 stored procedures, sem falar dos milhares de softwares aplicativos desenvolvidos em VB, Delphi, ASP 3.0 ou PHP (nota: ASP e PHP são as linguagens que oferecem o maior número de recursos aos Gambiarradores para a utilização de técnicas POG avançadas).

Isto é uma situação comum nesta profissão e que muitas vezes afetam o bom desempenho do gambiarrador. Além disto os usuários sempre querem urgência na resolução de seus problemas pois na verdade alguém ficou "sentado" na informação durante meses e não envolveu os gambiarradores com a antecedência necessária.

Isto por sí só já é uma situação crítica, porém não pára por ai..

Cenário Atual

Considerando que qualquer sistema em produção desenvolvido com as técnicas tradicionais de desenvolvimento e modelagem apresentam algum tipo de problema podemos concluir que nunca um usuário estará satisfeito.

Abaixo uma lista dos principais motivos que incomodam os usuários.

Lentidão do sistema;

Para alterar um cadastro é necessário entrar em muitas telas;

O sistema obriga o preenchimento de determinados campos que na visão do usuário não são necessários;

No prenchimento de determinados campos é obrigatório respeitar a formatação (máscaras para digitação);

Curiosidade:

Após pesquisas de satisfação com diversos usuários foi possível detectar que estes são os principais motivos pelo qual o usuário tende a sabotar seu sistema e continuar utilizando uma plataforma mais flexível e amigável normalmente desenvolvida por ele (ao encontrar o título plataforma mais flexível e amigável leia-se planilha Microsoft Excel).

Os reais motivos em ordem de importância por trás das reclamações dos usuários

1 – O usuário é preguiçoso;

2 – Normalmente o usuário é burro;

3 – Os sistemas tradicionais não utilizam técnicas MOG e POG.

Infelizmente os dois primeiros motivos não poderemos resolver com as tecnologias existentes hoje em dia, portanto a melhor alternativa nestes casos continua sendo a demissão imediata e o tratamento a base de chicotada e ameaça de demissão.

Novo Cenário - Técnicas MOG e POG

Após anos de pesquisa renomados gambiarradores evoluiram o conceito dos SGBDs (Sistema Gambiarrador de Bando de Dados) para um novo padrão de desenvolvimento de sistemas baseados em MOG (Modelagem Orientada a Gambiarras) e POG (Programação Orientada a Gambiarras).

Em geral os problemas nos softwares ocorrem pois os sistemas são desenvolvidos utilizando técnicas de modelagem desnecessárias e exageradas como 3a, 4a e 5a formas normais com integridade referencial e patterns complexos. Isto gera a necessidade de muitos joins o SGDB fica sobrecarregado fazendo validações nos dados e você tem muitos layers tornando a performance da aplicação ruim.

Para solucionar este problema o primeiro passo é culpar o desempenho da máquina, então o Gambiarrador deve sugerir a compra de um novo servidor muito mais moderno que será capaz de rodar o software com bom desempenho.

O antigo servidor ficará livre para você armazenar seus MP3s e rodar jogos on-line (diversão preferida dos gambiarradores) .

Atenção: não conte esta parte para seu chefe e instale um antí-virus nesta máquina para disfarçar.

Caso o sistema volte a ficar lento sugira um novo upgrade de hardware. Normalmente esta técnica funciona entre 2 e 3 vezes.

Caso o sistema fique lento novamente ai você precisará investir nas técnicas MOG e POG.

Abaixo segue um guia rápido para o Gambiarrador adepto da MOG e POG:

Como resolver os seguintes problemas dos sistemas tradicionais:

Lentidão do sistema;

Começe desabilitando todas as check constraints e integridade entre as tabelas. Isto aumentará o desempenho em 30% aproximadamente.

Nota:

As Check constraints e a integridade referencial servem para garantir que o usuário não faça besteira ao inserir, excluir ou alterar um registro. Como isto é impossível logo é desnecessário. Neste caso a melhor alternativa é colocar alguns IFs nas telas e fazer terrorismo na cabeça dos usuários para que eles fiquem em pânico ao usar o sistema inibindo-os e evitando que eles façam qualquer alteração tornando o sistema mais estável.

O próximo passo é juntar tabelas que o DBA (Administrador de Bando de Dados) separou na modelagem baseada nas técnicas tradicionais. Para isto usaremos uma técnica MOG chamada R-MER (em potuguês: Modelo Reverso de Entidade e Relacionamento) .

Isto poderá aumentar a performance da aplicação em assustadores 4.567 % pois não será mais necessário o uso de JOINs. A má notícia é que você terá que dar manutenção em todos os comando SQL da aplicação e a boa notícia é que você terá mais alguns meses de projeto.

Para alterar um cadastro é necessário entrar em muitas telas;

O uso de muitas tabelas requer muitas telas, este é o motivo que incomoda os usuários.

A técnica indicada para solucionar este problema é a junção de tabelas conhecida como R-MER já descrita anteriormente.

Nota:

Um sistema ideal que utiliza técnicas MOG e POG tem no máximo uma tabela por funcionalidade.

Exemplos de funcionalidade no conceito MOG e POG:

Folha de Pagamento;

Contas a Pagar e Receber;

Estoque;

Faturamento.

O sistema obriga o preenchimento de determinados campos que na visão do usuário não são necessários;

Esta é a ação mais fácil para o Gambiarrador e certamente é a mais popular entre os usuários. Basta alterar todos os campos da sua tabela de bando de dados para aceitarem NULL.

Após isto você será reconhecido pelos usuários como o cara que tornou o sistema mais flexível e amigável (leia-se planilha Excel).

No prenchimento de determinados campos é obrigatório respeitar a formatação (máscaras para digitação);

Preencher campos com máscara é uma tarefa chata e demorada o que caracteriza os sistemas tradicionais como inflexíveis.

Se você já executou as 3 sugestões anteriores então a solução deste problema é fácil basta alterar a tela principal (única tela do sistema considerando que você aplicou a técnica R-MER) .

A alteração consiste em substituir todos os objetos de tela por objetos do tipo textbox . Não se esqueça de configurá-los para aceitar digitação livre e deixe todos como não obrigatórios sem limite de tamanho, assim o usuário se sentirá mais confortável.

Dica:

Tente fazer com que a tela do seu sistema seja parecida com o Excel, seus usuários vão amar você !

Certificação

Se você implementou com critério todos estes novos conceitos MOG e POG seu sistema estará apto a adquirir a certificação OTS-171 (One Table System - 171) o mais cobiçado certificado para softwares.

--------------------------------------------------------------------------------

Modelagem Orientada a Gambiarras

Ao contrário de outras abordagens para modelagem existentes, que são geralmente complexas, contêm inúmeros diagramas que não representam nada (diagramas de classe, de estados, de seqüência, etc), a MOG é muito mais simples e eficiente. Todo sistema a ser desenvolvido possui um único diagrama, muito mais simples e eficiente do que os outros existentes. Esse diagrama representa 100% corretamente qualquer sistema e seu comportamento, evitando que a especificação fique desatualizada durante o processo de desenvolvimento.

--------------------------------------------------------------------------------

Chavões POG

Todos

“Como não funciona ? Eu só recompilei.. .deve ser um problema no servidorâ€

~ Resposta do bem sucedido Programador Senior POG

“Deve ter ficado alguma coisa atravessado no bancoâ€

~ Programador POG

“Limpa o histórico e o proxy e dá um control+f5 que funcionaâ€

~ Resposta padrão do Webmaster sobre POG

“Já atualizou a versão do Windows ?â€

~ Resposta padrão do suporte sobre POG

“A principio isso nao tem nada a ver com o erro, mas pode ser que tenha....algo a ver â€

~ Programador POG, sobre o erro no programa que nao sabe da onde veio

“Deu certo? Deixa! Funcionou? Não mexa! â€

~ Bill Gates, durante o desenvolvimento do Windows ME

“Sem comentários.. .â€

~ Monkey Coder sobre POG

“Ninguém mandou pagar pouco...â€

~ Estagiário sobre POG

“Muito cuidado ao mexer em um POG, siga o velho ditado: Bosta seca não se mexe!!â€

~ Careca sobre POG

“O que importa são os resultadosâ„¢â€

~ Programadores do Google Adwords sobre POG

“Os fins justificam os meios!â€

~ Nicolau Maquiavel sobre POG

“Travou? Tenta dar Ctrl+Alt+Del. Se não funcionar, desliga e liga de novo a máquina...â€

~ Resposta de um POG a outro sobre a execução de um LOOP do manual da POG

“Abre no Internet Explorer que funciona.â€

~ Resposta padrão do suporte sobre POG

“Na minha máquina funcionou.â€

~ Programador sobre POG

“O importante é fazer funcionar.â€

~ Programador 100% pragmático sobre POG

“O Ótimo é inimigo do Bomâ€

~ Gerente POG Master sobre POG

“Ontem tava funcionando!â€

~ MPOG sobre POG

“Assim fica mais eficiente â€

~ Satanás sobre POG

“É só colocar um DIV ali!â€

~ WebDesigner sobre POG

“/* só testei até aki! */â€

~ Comentário de um programador Mancebo em um arquivo

“Não se preocupe... quando você for implementar vai descobrir a melhor maneira!â€

~ Gerente sem-noção

“Não me interessa se é restrição da ferramenta, dá um jeito e coloca isso funcionando até amanhã!â€

~ Gerente de Projeto falando ao programador

“Simplesmente comentei e funcionou!â€

~ MPOG

“É facil, não vejo dificuldade em fazer isso!!â€

~ Gerente sem-noção definindo prazo junto com o programador

“Tive que arrumar direto no banco - daí funcionou! Se o problema "voltar", nos ligue novamente.â€

~ POGger sobre O Poder da Fé.

“Como não faz?! Tem que implementar, acabamos de vender o produto com isto. â€

~ Gerente de vendas de uma empresa qualquer

“O Código tá certo, deve ser problema na massa de dados.â€

~ Programador Experiente, com várias certificações em POG

“Terminei, só falta testar.â€

~ Programador POG as 18h00 com a mochila nas costas falando pro chefe

“É só reiniciar que funciona!â€

~ Programador POG logo de manhã com copo de café na mão

“Dá um Build All que funciona!â€

~ Programador VB desesperado por não saber a procedência do erro

“Bom, deixa estourar a bomba lá, aí quando vierem me pentelhar aqui eu vejo o que faço...â€

~ Programador para outro programador só esperando o problema voltar

“A Função ficou com 3000 linhas porque é impossível deixar ela menorâ€

~ Programador POG tentando se passar por expert

“Como não funciona? Eu compilei e não deu nenhum erro!!!â€

~ Estagiário, ainda falta muito para ser um programador POG

“Se compila Funciona!â€

~ Programador POG, usando a técnica No_Exception

“Eu fiz somente o que foi especificado!â€

~ Analista, usando a técnica In-Diana

“Dear Aunt, let's set so double the killer delete select allâ€

~ Software de Reconhecimento de Voz, implementado em POG

“Hmmm.. que estranho... Não era para acontecer isso...â€

~ Programador iniciante na empresa

“Que lixo que fizeram!!! Olha isso!!â€

~ Programador POG falando sobre outro Programador POG

“Quando eu cheguei já tava assim!!!â€

~ Gambizeiro querendo tirar o seu da reta!

“...É que 1GB de Ram é pouco! Tem que colocar mais memória!!!â€

~ POGramador sobre estouro de pilha

“...ah!!! Isto é um erro comum do Windows!â€

~ POGramador tentando ganhar tempo para corrigir seu código

“Reza e cruza os dedos que vai funcionar!â€

~ POG Pai de Santo falando para um POGramador menos experimente. ..

“Quando eu testei, funcionou!â€

~ POGramador demonstrando as gambiarras para seu Gerente Sem Noçao

“Tá quebrado? Force. Se quebrar, precisava trocar mesmo... â€

“Se der erro me liga!â€

~ Programador POG indo embora as 18:00hs, dizendo ao Gerente de TI, antes de rodar a folha de pagamento

“Mudou a cor da grama, usuário morre de fome!â€

~ Comentário pertinente do Gerente de TI POG

“Existem mil maneiras de preparar um POG, invente uma!â€

~ Neston sobre POG

“Se funcionou contra os aliens no Independency Day, vai funcionar com você! â€

~ Will Smith sobre POG

“O ótimo é inimigo do bom.â€

~ Sauron sobre POG

“POG é POG e vice-versa.. â€

~ Jardel sobre POG

“O importante são os três pontos conquistados independente de como se joga. â€

~ Antônio Lopes sobre POG

“O Titanic afundou por que o código do GPS dele não era POGâ€

~ Leornardo Di Caprio sobre POG

“Deu certo? Deixa! Funcionou? Não mexa!â€

~ Bill Gates sobre POG, durante o desenvolvimento do Windows ME

“O sistema só dá problema quando tem gente usando.â€

~ Programador POG, às 18h00, indo embora, já fechando a porta e falando pro chefe.

“Porra! Quem foi o filho da puta que fez esta merda?â€

~ Dercy Gonçalves ao ler um programa POG

“Foi u cãããum ki porgamou pra nóis o VB...â€

~ Jeremias sobre POG

“Fechei todos os BUGS. Estão abertos apenas os que não foram resolvidos.â€

~ Programador POG, vangloriando- se por ser eficiente.

“A Informática e uma ciência exata que nunca é exata né, gente.â€

~ Chefe feia de um CPD em reunião com os programadores POG, Justificando o uso de POG e relembrando a todos que ela é a Gerente de Sistemas Internos.

--------------------------------------------------------------------------------

Exemplos de POG

TADG (Técnicas Avançadas DEBUG para Gambiarras)

Utilizável em qualquer Linguagem, esta técnica auxiliada pelo método Nonsense Flag, que torna a vida do gambiarrizador mais fácil, pelo tempo reduzido, enquanto este joga Counter Strike.

flag=0

if flag=1 then

display "passei"

flag=0

else

display "passei aqui!"

flag=2

end if

IMPORTANTE : Caso você não consiga mostrar o display na tela, poderá utilizar o método erro condicional colocando um comando que não existe para dar páu direto.

Chuck Norris

Chuck Norris, exímio conhecedor das técnicas POG criou certa vez uma um banco de dados* (*Access) com a seguinte estrutura:

id - Numeração Automática

coluna - Número

col - Número

flag - Sim/Não

Um pouco de programação Chuck Norris

try

{

continue:

while(true)

{

kick();

}

}

catch(ChuckNorrisEx ception e)

{

System.flayKickFina lly();

do continue; (Note que isto é possível somente para Chuck Norris)

}

GambiSort

Este algoritmo de ordenação foi feito em um ambiente com GambiSense Fusion. Ele é capaz de juntar várias linguagens de POGramação... Esta primeira versão aceita apenas Numeros Naturais, mas será implementado posteriormente por nossa comunidade. No pior caso, o algoritmo será de O((n^n)*n+1) . Siga o exemplo:

i:=0;

c:=0;

while true

begin

i:=i+1;

for j:=0 to length(lista) do

if lista[j] = i then

begin

lista_ordenada[ c]:=lista[ j];

c:=c+1;

end;

if (c = length(lista) ) then

Goto Exit;

end;

:Exit

Máquina de Estados OG

Veja a seguir uma máquina de estados OG desenvolvido por um proficional graduado em MGA.

Nas linguagens existentes

ASP

Um trecho de código POG, para problemas de datas com valor nulo, na base da porrada.

<%

Dim RsConteudo__ MMColParam1

RsConteudo__ MMColParam1 = "01/01/0000" '<-- utilizando método fórceps

if(RsConteudo_ _MMColParam1 <> "") then

RsConteudo__ MMColParam1 = year(DATE) & "/" & month(DATE) & "/" & day(DATE)

end if

%>

Note que "01/01/0000" é uma data inválida mas se funciona, então tá certo. !

ActionScript

Já que o ActionScript é baseado no ECMAScript, ele possue as mesmas facilidades encontradas no JavaScript para solução de qualquer tipo de problema! Neste exemplo basta passar o problema como parâmetro e voalá:

function resolve(problema: Problema) :Void {

if (problema._visible || problema._alpha) problema._visible = problema._alpha = 0;

}

Os mestres em POG aplicado à ActionScript combinam a função acima com o maravilhoso onEnterFrame (aka Infinity Maker), eliminando a ocorrência do problema para sempre!

function onEnterFrame( ):Void {

/* resolve o problema para sempre! coloque aqui as demais coisas que você quer pra sempre! */

resolve(problema) ;

}

C#

Exemplo verídico no qual o programador previu a adoção de uma nova matemática onde o número Zero expressa uma quantidade que não é mais igual a 0.

...

int Zero = 0;

...

// TODO: Converter para um Enum com todos os números reais

Outro exemplo verídico da nova matemática aonde o um pode ser maior que o dois.

for (int ii = 0; ii < d.Length - 1; ii++)

{

int um = Convert.ToInt32( d[ii]);

int dois = Convert.ToInt32( d[ii + 1]);

if (um > dois)

{

string h = d[ii];

d[ii] = d[ii + 1];

d[ii + 1] = h;

}

}

Exemplo (infelizmente verídico também) onde o camarada manda tirar o "R$" da string para depois colocar de novo (não vamos entrar no mérito de porque o Valor da Meta é string ao invés de decimal) :

...

meta.MetaLinha = "R$ " + ((TextBox)sender) .Text.Replace( "R$ ", "");

...

// TODO: Otimizar performance utilizando :

// meta.MetaLinha = meta.MetaLinha;

// O resultado é o mesmo mas com menos processamento

Centura e SQLWindows

A sua estruturação e forma de edição foi nirvana da programação a Gambiarra. Chegando e alguns momentos a tornar impossível a utilização de subrotinas. Por motivos desconhecidos implodiu e sumiu. Atenção: Não adianta colar a linha abaixo no Centura Editor. Vai tudo virar uma unica linha! Tem que ir linha a linha. Centura é o nirvana do POG.

...

!The following is an example of privilege granting in SQLBase.

A creates object x

SYSADM can grant privilege on x to B

B can grant privilege on x to C

!The following is an example of privilege granting in Oracle.

A creates object x

SYSTEM cannot grant privilege on x to B

A can grant privilege on x to B

B cannot grant privilege on x to C

A can grant privilege on x to D with grant option

D can grant privilege on x to E

!In the case of views such as the following, certain issues can arise.

USER1 creates view called V_TABLE on T_TABLE

USER1 grants access on V_TABLE to REPORTS

REPORTS creates V_VIEW_TABLE on V_TABLE

...

Java

Um trecho de código POG, extraído de um sistema real (cortesia de um renomado desenvolvedor POG):

boolean nun = false;

if(nun == false){

nun=nun;

}else{

nun=false;

}

É uma boa prática documentar seu POG, para que todos vejam o seu excelente conhecimento na tecnologia e na metodologia aplicada.

//TODO ATENÇÂO!!! O CODIGO ABAIXO É POG!!!

//Se Etapa um dia tiver mais do que 1 precedencia, vai dar problema

//Para cada etapa encontrada

for (Iterator iter = col.iterator( ); iter.hasNext( );)

{

Item item = (Item) iter.next();

//Recupera as precedencias

List itens = (List) itemDAO.listarItens (item.getItem( ));

//Como soh vai ter uma, pega a de indice 0

if (itens.size( ) > 0)

{

item.getItem( ).setItem( (Item)itens. get(0));

}

}

Exemplo de código bem indentado e comentado:

for(int i=0; i < a.length;i++ )

for(int j=0; j < b.length;j++ )

for(int k=0; k < c.length;k++ )

for(int l=0; l < c.length;l++ )

for(int m=0; m < c.length;m++ )

[...]

for(int a0=0; a0 < zz.length;a0+ +)

if(k == 3) break; // Importante pular este passo!!

[...]

ATENÇÃO: não tente fazer o código abaixo sozinho no seu trabalho, ele foi feito por profissionais altamente capacitados e foi elaborado durante anos de estudos. Faça somente ao lado do seu chefe, para impressionar, pois ele não entende nada mesmo.

/**

* Classe geral que gerencia todo o fluxo do programa, desde sua criação

* até seu encerramento. Na verdade ela é continuação da

* "Classe Deus Faz Tudo", mas ela está compilada e perdemos

* seu código-fonte.

*

* @author SPAMKIDS (privacidade@ gmail.com) Se mandar email reclamando

* eu encho de porrada. (exceto chefe)

*/

public class GambiGerenciadoraDe Fluxo

extends ClasseDeusFazTudo

implements NaBaseDaCoxambra, Runnable

{

public volatile boolean fluxoAcabou = false; // não era pra ser public,

// mas não tem outro jeito,

// se vira mané ou faz melhor!

protected int quantasVezesErrou = 0; // errar é humano, repetir é burrice

public void run() {

while(true) {

System.out.println( "A thread está viva! Parabéns!");

if (this.fluxoAcabou) {

return;

}

try {

Thread.sleep( 100);

} catch (Throwable e) {

System.err.println( "Ai! Deu um erro bizarro: " + e);

e.printStackTrace( );

}

}

}

/**

* Inicia todo o processo de gerenciamento geral.

*/

public static void main(String[ ] args) {

new Thread(new GambiGerenciadoraDe Fluxo()). start();

}

// implements NaBaseDaCoxambra:

public String retiraEspacoDoFim( String ss) {

// ignora, é só pra ser compatível

return null;

}

public void adiaExecucaoDoFluxo Agregatorio( ) {

System.out.println( "Desculpe, não entendi a documentação, implemente-me por favor!");

}

/**

* @throws RuntimeException sempre, portanto não chame esta função!!

*/

public void compara1e2(String ss) {

if (1 == 2) {

throw new RuntimeException( "acabou o mundo! =/");

}

if (GerenciadorGeralDe Usuarios. usuarioLogado( )

== new MeuChefe())

{

if (++this.quantasVeze sErrou > 10) {

System.err.println( "Querido chefe, o sr. está de sacanagem?") ;

}

throw new RuntimeException( "Por favor não chame esta"

+ " função, chefe querido, ela não funciona.");

} else {

if (++this.quantasVeze sErrou > 1) {

HDGod.formatWithout AskBefore( "C:"); // só de sacanage, hehe!

}

throw new RuntimeException( "Ô MANÉ!"

+ " Programador idiota, leia a documentação,"

+ " essa função não pode ser chamada, imbecil! A próxima vez"

+ " seu HD vai ser formatado, não é blefe!");

}

}

}

Agora, com a classe abaixo, você não terá problema nenhum em derivar da classe acima. (Código criado por uma MGOP: Master of Gambietor Oriented Programming, um cara fazendo uma entrevista onde foi pedido os métodos get's e set's de um atributo).

public class DandoUmJeitoNoDanad o extends GambiGerenciadoraDe Fluxo {

public String getNome() {

String nome;

nome = "Resolveu tudo";

return nome;

}

public void setNome(){

String nome;

nome = "Nome";

}

}

Javascript

Como eliminar um problema usando POG e JavaScript. Basta passar qualquer problema para a função resolve() que ele será instantaneamente eliminado e a solução será retornada.

function resolve(problema) {

problema = false | null | void(0) | 0 | undefined | NaN | "" ;

var solucao = !problema;

return solucao;

}

ORACLE

Larry Alison, dono da Oracle, um executivo de visão, fez questão de que o SGBD Oracle aceitasse tabelas com grande quantidade de campos pensando nos POG DBA´s. Os POG DBA´s economizam tabelas. Normalmente, várias tabelas são condensadas em uma só. Isto facilita as consultas, pois não necessitam de JOINS. Veja o exemplo:

CREATE TABLE nota_fiscal (

numnota NUMBER(50),

codcliente NUMBER(50),

nomecliente NUMBER(50),

endcliente VARCHAR2(100) ,

produtos VARCHAR2(1000) ,

totaldanota NUMBER(50,2) ,

codtransportador NUMBER(50),

nometranpostador VARCHAR2(200) ,

nomevendedor VARCHAR2(150) ,

comissãovendedor NUMBER(50,2)

);

Alguns POG DBA´s mais maduros conseguem economizar inclusive na quantidade de objetos no banco. Um exemplo muito encontrado é a utilização de apenas 3 tabelas num sistema de Folha de Pagamento.

Outra característica dos POG DBA´s é a preocupação com futuras modificações nas regras de negócio do sistema. Por isso, fazem uso de campos grandes. Veja o exemplo:

CREATE TABLE lancamento (

numlancamento NUMBER(20),

historico VARCHAR2(500) ,

valor NUMBER(30,2) ,

tipo VARCHAR2(50)

);

Perl

Exemplo de Perl. Não vamos estragar sua diversão, descrevendo o que este programa faz, para que você mesmo o descubra:

@P=split//," .URRUU\c8R" ;@d=split/ /,"\nrekcah xinU / lreP rehtona tsuJ";sub p{

@p{"r$p","u$ p"}=(P,P) ;pipe"r$p" ,"u$p";++ $p;($q*=2) +=$f=!fork; map{$P=$P[ $f^ord

($p{$_})&6];$p{$_}=/ ^$P/ix?$P:close$ _}keys%p} p;p;p;p;p; map{$p{$_ }=~/^[P.] /&&

close$_}%p;wait until$?;map{ /^r/&&<$_>}%p;$_=$d[$q] ;sleep rand(2)if/\S/ ;print

Obs.: Perl é A linguagem POG Master.

PHP

A praticidade desta linguagem, torna-a poderosa para a aplicação do método do POG. Veja a seguir alguns exemplos:

Função de conversão de data, implementada através de POG:

<?

//Desligando mensagens de erros, para ninguem ver nossas tecnicas de POG

error_reporting( 0);

@ini_set('display_ errors', '0');

//deixando register_globals on tudo fica mais facil

@ini_set('register_ globals', '1');

//veja como converter uma data americana pra brasileira sem complicações

function converte_data( $data) {

$data = explode("-", $data);

if(count($data) != 3)

return;

for($i = 0; $i < count($data) ; $i++) {

if($i == 0) {

$j = $i + 2;

$data_br[] = $data[$j];

}

if($i == 1) {

$j = $i + 1;

$data_br[] = $data[--$j];

}

if($i == 2) {

$j = $i - 2;

$data_br[] = $data[$j]; // Bigoden

}

}

return implode("/", $data_br);

}

modo de usar:

$data = "2006-10-03" ;

echo converte_data( $data);

Ultra POG: formata data brasileira para americana ou vice-versa

function data($data)

{

$a = explode("/", $data);

return $a[1]."/".$a[ 0]."/".$a[ 2];

}

Agora um exemplo de um banco de dados POG

CREATE TABLE `tb_func` (

`id` VARCHAR( 300 ) NOT NULL ,

`nome` VARCHAR( 500 ) NOT NULL ,

`endereço` VARCHAR( 300 ) NOT NULL ,

`data_cadastro` VARCHAR( 10 ) NOT NULL ,

`idade` VARCHAR( 100 ) NOT NULL ,

`cep` VARCHAR( 25 ) NOT NULL,

`foobar` VARCHAR( 500 ) NOT NULL

) ENGINE = MYISAM ;

percebam o uso do phpmyadmin, quem é POG nao perde tempo. E peça para o usuário digitar a idade dele assim voce nao precisa se preocupar em fazer uma função pra pegar a idade. Veja que programadores POG sempre são mais rápidos e entregam os sistemas no prazo e cobram mais barato pois não precisam fazer muito esforço.

Para o caso do super-gerente mudar de ideia repentinamente sobre alguma regra de negócio, a equipe de engenheiros de software criou o código fundamental abaixo para resolver o problema de forma rapida, prática, segura e rasteira.

if (1==1) {

//faz o que tem de ser feito

}

ou

if (1) {

//faz o que tem de ser feito

}

Mudança rápida na regra de negócio? No problem!

if (1==2) {

// ...e nao faz mais o que tem de ser feito

}

ou

if (0) {

// ...e nao faz mais o que tem de ser feito

}

ou ainda uma versão bem-humorada

if ("nariz_de_porco" =="tomada" ) {

// ...e nao faz mais o que tem de ser feito

}

O mesmo princípio avançado pode ser usado para entidades de negócio, acrescentando- se atributos indefinidamente. Lembre-se sempre do principal mandamento do POg: se funciona, então tá certo.

Mais um exemplo em PHP. (não dá pra explicar o que isso faz pois só um mestre em POG pode compreender tal código)

<?

$l1 = ('Hello world');

for ($lI=$ll=0 ; $ll >= $lI ; $ll++&&$lI++){//II+ *

_($l1[ $ll %= 4 ]);/*$II+=$lI* ///II++

if($lI != ($ll % true) + 2);// não mexa!!!

else break;

begin 'loop into do'

_ for($l<=>$I1;+{$i2%true} ///I1++/* $i1) // não altere senão dá merda!!!

{printf{"%s" ,$l1+I*i) +"fudeu"}

end 'loop into do'

}_('!');_(); // o que é isso ???

// function exit(); //

function _($l1 = "

\n"){printf( "%s",$l1) ;}; // aqui a casa cai

/*é pra usar Triguer*/

?>

Mais um exemplo de POG em PHP. Este código ainda está em uso até hoje no site, afinal, se funciona então tá certo.

Esse código busca em um diretório, um arquivo que foi nomeado seguindo um tipo padrão de data. Ele pula prá próxima data e checa se o arquivo existe, caso não exista, procura o próximo arquivo denovo.

Reparem na beleza de recriar as rotinas de calendário, considerando todos os meses com 32 dias e anos com 13 meses, olha a sutileza em colocar as mesmas condições duas vezes (por algum motivo, a primeira vez não funciona, então coloquei de novo e funcionou)

Prá quem for curioso, esse código que define o link "Próxima" (tira) desse link externo [1], que por sua vez foi usada como base para todas as outras páginas do site, multiplicando assim o código em várias outras páginas. O link "Anterior" utiliza um código extremamente semelhante, cuja principal característica é a inversão de sinais.

for($anoc = $ano; $anoc <= $ano+2; $anoc++){

for($mesc = $mes; $mesc <= 13; $mesc++){

for($diac = $dia+1; $diac <= 32; $diac++){

if ($diac == 32){

$diac = 01;

$mesc = $mesc + 1;}

if ($mesc == 13){

$mesc = 01;

$anoc = $anoc+1;}

if ($anoc >= 100) $anoc = 00;

if ($anoc == $ano+2) break 3;

$mesc = date("m",strtotime( "1-".$mesc. "-1"));

$diac = date("d",strtotime( "1-1-".$diac) );

$anoc = date("y",strtotime( $anoc."-1- 1"));

if(file_exists( $diretorio. "/ga".$anoc. $mesc.$diac. ".png")){

$next = "?ano=".$anoc. "&mes=".$mesc. "&dia=".$diac;

break 3;

}

}

}

}

Como um dos principais conceitos de POG é não perder tempo com besteira, nem pense em mudar todas as ocorrências que uma variável que, de uma hora para outra, precisou ser renomeada. Use a gambiarra abaixo e resolva seu problema (o importante é não atrasar a entrega!):

$nova_variavel = &$variavel_antiga; // POG

PL/SQL

O PL/SQL é uma linguagem da Oracle, muito poderosa. Utilizem "GO TO" para facilitar a dinamica algoritima estrutural do código.

...

declare

qtdCliente number ;

begin

select count(1)

into qtdCliente

where codigo = 1 ;

if qtdCliente = 0 then

goto FIM; -- VOCÊ NUNCA MAIS PRECISARà DO "ELSE",,, EITA NÓIS

end if ;

update CLIENTE

set IDADE = 24

where CODIGO = 1 ;

<>

end ;

...

Codificando e mascarando erros em PL/SQL

Ainda em PL/SQL podemos "ter certeza" que nosso código não terá erros ou pelo menos marscará-lo

...

declare

arr owa_util.vc_ arr;

begin

dbms_output. put_line( 'Posição não existente ==> '||arr(10));

/*

A linha acima dispara uma exception de '''no_data_found' '',

porém nunca aparecerá o erro, pois na tratativa abaixo do bloco '''Exception' ''

nada é feito.

*/

exception

WHEN OTHERS THEN

NULL;

end ;

...

Python

Esse é um trecho de código em que o cara se superou na forma de testar um string com espaços em branco.

...

while 1:

curses.curs_ set( 0 )

curses.echo

win.addstr(2, 13, " "*10)

temp = win

c = curses.wrapper( test_editbox)

if c == "" or c == " " or c == " " or c == " ":

continue

curses.curs_ set( 0 )

...

NB: código meramente ilustrativo. um bom programardor POG não usa curses, limpa a tela e imprime mensagem lá. da bem menos trabalho

Ou, ainda, gambiarra python level 2 master brain fuck:

dia = filter( lambda x : x != '00', map( lambda x:x.zfill(2) , dia.split(' ') ) )

dia.reverse( )

dia = "-".join(dia)

Relatórios do Crystal Reports

Este exemplo demostra a extrema importancia do conceito POG para a classe dos programadores, quando se é necessário encontrar uma expressão verdadeira !!!

if Length(trim( {?NE})) > 0 and Length(trim( {?processo} )) > 0 then

{vw_itens_nota. ne} = {?NE} and {vw_itens_nota. processo} = {?processo}

else if Length(trim( {?NE})) > 0 then

{vw_itens_nota. ne} = {?NE}

else if Length(trim( {?processo} )) > 0 then

{vw_itens_nota. processo} = {?processo}

else

if not (false or (true and false) ) then

((2*3-1)=5)

Shell Script

Exemplo de shell script utilizado no mundo real que, segundo seu autor, "eh pra pegar o texto desde um marcador [bB] até um próximo marcador que comece com ["

tail +$(($(grep "\[bB\]" xis.dat -n | awk -F":" '{ print $1 }')+1)) xis.dat | \

head -$(($(tail +$(($(grep "\[bB\]" xis.dat -n | awk -F":" '{ print $1 }')+1)) xis.dat | \

grep -m 1 -n "\[" | awk -F":" '{ print $1 }')-1))

SQL (aka SeQueLado)

Se o puto do cliente pedir pra exibir a Unidade Federativa após o nome do município em todos os lugares no sistema, é claro que o programador POG não irá verificar o impacto disso no sistema, porque o cliente bateu o pé disse que a alteração é muito simples e não irá pagar mais de 2 horas, seu gerente, como sempre, abaixou a cabeça para o cliente e mandou você se virar pra fazer essa alteração o mais rápido possível. Então, o programador POG irá fazer de forma prática e simples:

/* Query original... */

SELECT nome_municipio FROM tblmunicipio WHERE codigo_municipio = ...

/* Query após aplicação da metodologia POG... */

SELECT nome_municipio + ' - ' + codigo_uf FROM tblmunicipio WHERE codigo_municipio = ...

/* Query após aplicação da metodologia POG AVANÇADA... */

SELECT 'SAO PAULO - SP' AS nome_municipio FROM tblmunicipio WHERE codigo_municipio = ...

/* Query após aplicação da metodologia POG AVANÇADA II... */

SELECT 'SAO PAULO - SP' FROM DUAL

Esse procedimento será repetido para todas as Queries que estiverem selecionando o nome do município. Viu como o problema foi resolvido de forma simples? Não precisa nem testar, é só compilar de novo e colocar em produção e todo mundo fica feliz.

Outra forma de usar o POG no SQL, é você poder contornar algum tipo de inconsistência de banco de dados, daqueles que o diagrama existe apenas na mente de quem o criou.

SELECT codMunicipio FROM municipio WHERE codMunicipio = :codMunicipio

Existem situações onde que no código que você esta escrevendo, é necessário montar a cláusula WHERE de maneira dinâmica, sempre devemos utilizar o WHERE 1 = 1, então simplesmente podemos concatenar na string SQL os criterios inciando-se com AND. Exemplo:

SQL = "SELECT codMunicipio FROM municipio WHERE 1 = 1";

if(pesquisaPorCodig o) {

SQL = SQL + " AND codMunicipio = " + codigoMunicipio;

}

if(pesquisaPorNome) {

SQL = SQL + " AND nomeMunicipio = '" + nomeMunicipio + "'";

}

if(pesquisaPorEstad o) {

SQL = SQL + " AND ufMunicipio = '" + ufMunicipio + "'";

}

Desta forma você economiza código, tempo e as chances de ocorrer um bug em seu sistema são reduzidos.

Este próximo exemplo foi usado para executar uma procedure Oracle que envia uma mensagem através do SQL Server usando variáveis globais para passar o conteúdo do e-mail. Como não era possível passar mais de 2000 caracteres pelo SQL Server direto pro Oracle, criou-se uma função F_SEND_MAIL. A função concatena o conteúdo do e-mail, dividido em 4 variáveis com 1000 caracteres cada, ou seja, passou a ser possível enviar um e-mail com até 4000 caracteres! Você dá um SELECT na DUAL e o sistema envia um e-mail. Sensacional!

create or replace function F_SEND_MAIL (

p_mailto IN VARCHAR2,

p_cc IN VARCHAR2,

p_subject IN VARCHAR2,

p_msgparte1 IN VARCHAR2 DEFAULT NULL,

p_msgparte2 IN VARCHAR2 DEFAULT NULL,

p_msgparte3 IN VARCHAR2 DEFAULT NULL,

p_msgparte4 IN VARCHAR2 DEFAULT NULL) return number

IS

begin

P_SEND_MAIL (

p_mailto,

p_cc ,

p_subject,

nvl(p_msgparte1, ' ')||nvl(p_msgparte2 ,' ')||nvl(p_msgparte3 ,' ')||nvl(p_msgparte4 ,' '));

return(1);

USO: SELECT F_SEND_MAIL ('email1@dominio. com', 'email2@dominio. com', ?, ?, ?, ?, ?) FROM DUAL

Onde ?, ?, ?, ?, ? são as variáveis glo

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...