BrazilUtils API

Vou acertar o CVS hoje. Houve alteração em alguns pacotes por isso o erro.

Quanto aos números romanos, acho que pode ser no pacote orb.brazilutils.metrics, mas confirma com o Ironlynx porque ele está mechendo nesse pacote.

Vou fazer no meu PC local…

Depois eu comito quando decidirem!

VELO

O que vc nao entendeu?

[code]public class MililitrosPorMenstruacao extends BigDecimal {

// …

public LigacoesTelefonicasPorTPM toLigacoesTelefonicasPorTPM() {
return // faca a conversao aqui
}

}[/code]

Desse jeito, MililitrosPorMenstruacao continua se comportando como um BigDecimal, mas que “faz sentido” como numero, e nao eh soh um monte de algarismo jogado um na frente do outro… se eh que uma medida chamada ‘mililitros por menstruacao’ faz algum sentido…

Velo, taí algo que eu não posso te precisar 100%.Não conheço nenhuma métrica em romanos(deve haver).Temporariariamente podedia deixar em org.brazilutils.utilities.conversion por exemplo, pois não deixa de ser uma utilidade.Vou pesquisar sobre isso.

Cv, saquei sua idéia.Mas ainda acho mais fácil separar por assunto(como é físicamente viável), e para obedecer o SI(Sistema Internacional), fazendo uma classe para cada conj de unidades de medidas, e mantendo uma interface principal com todas as constantes.Algo + ou -:

public class Pressure implements NumericConstant{ public BigDecimal convertAtmToPsi(double atm,int decimalPlace){ BigDecimal result = new BigDecimal(atm * PSI); result= result.setScale(decimalPlace,BigDecimal.ROUND_HALF_UP); return result; } //blabalbal... }
Mas se o povo prefere por cada tipo de conversão numa classe, farei assim(Vai ficar populado…).Vou substituir então o que seria uma classe de unidades afins por um package, o que pensando bem, não deixa de ficar claro tb.

[quote=Ironlynx]Velo, taí algo que eu não posso te precisar 100%.Não conheço nenhuma métrica em romanos(deve haver).Temporariariamente podedia deixar em org.brazilutils.utilities.conversion por exemplo, pois não deixa de ser uma utilidade.Vou pesquisar sobre isso.
[/quote]

Blz…

Eu jah fiz a conversão de int para romano, mas o teto, por enquanto, é o numero 3999, para numeros maiores preciso de uns caracteres especiais que não se como fazer em java… V com tracinho em cima, tipo um assento. Se alguem sober o caractere pra isso, ajuda.

VELO

Dei uma atualizada no CVS. Mudei alguns pacotes e criei i pacote ID que está com as classes paraticamente vazias ainda. Os outros já estão funcionando e com testes rodando.

Comitei toda a parte de números romanos…
Pra quem tiver preguiça de ir no CVS, tá aí o fonte.

VELO

[code]/*

  • Created on 26/05/2005
    */
    package org.brazilutils.utilities.conversion;

/**

  • @author Marvin Herman Froeder
    */
    public final class RomanNumbers {

    private static RomanNumbers instance;

    private RomanNumbers() {

    }

    public String IntToRoman(int value) {
    String roman = “”;
    if (value == 0)
    return “”;

     if (value < 0)
         throw new IllegalArgumentException(
                 "Impossivel criar numero romano menor que 0.");
    
     if (value <= 3999) {
         while (value / 1000 >= 1) {
             roman += "M";
             value = value - 1000;
         }
         if (value / 900 >= 1) {
             roman += "CM";
             value = value - 900;
         }
         if (value / 500 >= 1) {
             roman += "D";
             value = value - 500;
         }
         if (value / 400 >= 1) {
             roman += "CD";
             value = value - 400;
         }
         while (value / 100 >= 1) {
             roman += "C";
             value = value - 100;
         }
         if (value / 90 >= 1) {
             roman += "XC";
             value = value - 90;
         }
         if (value / 50 >= 1) {
             roman += "L";
             value = value - 50;
         }
         if (value / 40 >= 1) {
             roman += "XL";
             value = value - 40;
         }
         while (value / 10 >= 1) {
             roman += "X";
             value = value - 10;
         }
         if (value / 9 >= 1) {
             roman += "IX";
             value = value - 9;
         }
         if (value / 5 >= 1) {
             roman += "V";
             value = value - 5;
         }
         if (value / 4 >= 1) {
             roman += "IV";
             value = value - 4;
         }
         while (value >= 1) {
             roman += "I";
             value = value - 1;
         }
         return roman;
    
     } else {
         throw new IllegalArgumentException(
                 "Impossivel criar numero romano maior que 3999.");
     }
    

    }

    /**

    • @return Returns the instance.
      */
      public static RomanNumbers getInstance() {
      if (instance == null)
      instance = new RomanNumbers();
      return instance;
      }

    public int RomanToInt(String roman) {
    if (this.validate(roman)) {
    char[] chars = roman.toCharArray();
    char lastChar = ’ ';
    int value = 0;

         for (int i = chars.length - 1; i >= 0; i--) {
             switch (chars[i]) {
             case 'I':
                 if (lastChar == 'X' || lastChar == 'V')
                     value -= 1;
                 else
                     value += 1;
                 break;
             case 'V':
                 value += 5;
                 break;
             case 'X':
                 if (lastChar == 'C' || lastChar == 'L')
                     value -= 10;
                 else
                     value += 10;
                 break;
             case 'L':
                 value += 50;
                 break;
             case 'C':
                 if (lastChar == 'M' || lastChar == 'D')
                     value -= 100;
                 else
                     value += 100;
                 break;
             case 'D':
                 value += 500;
                 break;
             case 'M':
                 value += 1000;
                 break;
             }
             lastChar = chars[i];
         }
         return value;
     } else
         throw new IllegalArgumentException("Numero recebido inválido!");
    

    }

    public boolean validate(String roman) {
    char[] chars = roman.toCharArray();
    char lastChar;

     for (int i = 0; i < chars.length; i++) {
         if (Character.isLowerCase(chars[i]))
             return false;
         if (chars[i] != 'I' && chars[i] != 'V' && chars[i] != 'X'
                 && chars[i] != 'L' && chars[i] != 'C' && chars[i] != 'D'
                 && chars[i] != 'M')
             return false;
     }
    
     return true;
    

    }
    }
    [/code]

Blz Velo!!! :wink:
Mas temos que começar a pegar o costume de fazer com pelo menos um teste adicionado.Ateh eu tô tendo que me acostumar com isso…mas no final te livre de problemas mil…

Péééééééééééééé. Resposta errada, Ironlynx. Voces tem que fazer as coisas COMECANDO PELO TESTE DANDO ERRADO, de preferencia com um erro de compilacao do tipo “a classe que voce esta tentando testar nem existe ainda, maneh!”, e trabalhando sempre em cima do teste e da implementacao ate que o codigo saia. Nao vou enumerar os beneficios disso, mas TDD vale a pena, vai por mim :wink:

O que é um teste adicionado???

Não entendi esse final, hheheheh

VELO

O que é um teste adicionado???

Não entendi esse final, hheheheh

VELO[/quote]

Hm…ele quiz dizer adicione ao menos um teste no cvs junto com a implementacao. Mas eu concordo com o CV, faca o teste primeiro para todas funfionalidades, com eles em maos implemente as funcionalidades. Quando os testes nao derem mais erro podem commitar.

]['s

Cv, quando eu crescer eu quero ser q nem vc! :smiley:
Agora, isso de começar pelo teste antes mesmo de fazer o programa para mim é quase uma quebra de paradigma. :shock:
Vc testa antes mesmo de modelar???
Para testar antes(tah certo, JUNTO) da implementação, em teoria, o cara tem que SABER testar antes mesmo de PROGRAMAR.Isso é complicado…
Vou ter q me adaptar a isso… 8)

Velo, só tava me referindo a uma classe q testasse alguma das features que vc escreveu(para assim sabermos o que a classe está fazendo).

Uhm… entendi… eu fiz um teste unitário pra ela sim, testando erros e acertos, só há um erro não testado… quando os algarismos romanos estão fora de ordem ele ignora o problema… tirando isso, tá 100%

VELO

[quote=Ironlynx]Velo, só tava me referindo a uma classe q testasse alguma das features que vc escreveu(para assim sabermos o que a classe está fazendo).
[/quote]

Ai que ta, testes de unidade nao podem ser feitos em cima de alguma funcionalidade, mas sim em cima de TODAS funcionalidades da classe. Porque os testes nao servem so para saber o que a classe faz, mas tambem pra saber se realmente ela ta fazendo o que se espera.

[quote]Ai que ta, testes de unidade nao podem ser feitos em cima de alguma funcionalidade, mas sim em cima de TODAS funcionalidades da classe. Porque os testes nao servem so para saber o que a classe faz, mas tambem pra saber se realmente ela ta fazendo o que se espera.
[/quote]
Fábio, nisso eu concordo, mas teremos muitas classes com métodos burros, que darão um trabalhão devido a quantidade de features(como a classe metrics), e não devido a alguma complexidade em termos de programação.São centenas de métodos q basicamente pegam um parâmetro e multiplicam por uma constante.Neste caso, por exemplo, basta pegar alguns para fazer uma amostragem.Ateh pq se eu cometesse um erro no valor de uma constante física, o teste não seria capaz de me dizer isso(pois nesse caso,não saberia q teria errado …).

Qual a licença do projeto?

No java.net fala em LGPL… no CVS fala na licença da apache… o q tah valendo?

VELO

Entao nao tenha metodos burros, ora essa. Escreva codigo que faz sentido e prove alguma funcionalidade que nao seja “burra”, que nao seja “obvia”. De codigo e programador burro o mundo ja ta cheio, pra que contribuir? :wink:

Cv, eu chamo de método burro aquele q não faz muita coisa, ou o mínimo indispensável para realizar uma tarefa simples e repetitiva.Receber um parâmetro e multiplicá-lo por uma constante para mim é uma dessas tarefas.Se eu pegar uma constante errada e passar para o teste, ele não pode validá-la se ele não conhece a correta…
Nesse projeto faremos coisas justamente para “poupar saco” dos programadores, que jah perdem muito tempo com deploys, configuraçoes de banco e servidores.O trabalho q fazemos é sujo.Mas é um mal necessário.Códigos de validação de CPF/CNPJ/RG/ não são nem um pouco inteligentes e intuitivos(aliás, esse excesso de registros não é algo muito inteligente, mas se fosse simplificado e centralizado, seria mais difícil roubarem nosso dinheirinho…)

Assumindo que vc se refere ao lance de converter medidas, cara, tem dezenas de jeitos mais legais de fazer isso do que um metodo do tipo convert(value, to, from) - e eu ja dei uma ideia aqui de como fazer, estendendo BigDecimal e tal. E, quanto aos testes, um pouquinho de inventividade resolve. Precisa testar a conversao de litros pra pints? Asserte que o seu codigo esta gerando o mesmo valor que o Google:

http://www.google.com/search?hl=pt-BR&q=4+uk+pints+in+liters&btnG=Pesquisar&lr=

Assim, voce nao usa a constante errada no teste, e ele te indica se voce fez besteira ou nao.

Entao, poupe ainda mais o saco dos programadores e nao faca eles terem que depurar a sua lib um dia desses pq ela foi mal testada ou mal desenhada… teste tudo que puder, e o que voce nao puder nao deveria estar ali em primeiro lugar. Simples assim: se alguma coisa nao pode ou “nao vale a pena” ser testada, eh pq ela nao deveria estar ali, e tem que haver um jeito melhor de desenhar aquela funcionalidade de forma que ela possa ser testada de forma independente e que traga seguranca de que sua implementacao foi, de fato, correta.

Eh uma restricao de design simples, e que pode parecer meio absurda, mas experimente com ela um pouco e vc vai ver como a coisa anda. Lembrando sempre que a lei do “quanto menos codigo, melhor” tambem vale pros testes - se os seus testes estao muito longos, repetitivos ou estao testando muita coisa de cada vez, quebre-os em pedacos menores e mais faceis de digerir.

Podem nao ser, mas nao existe razao pra que o codigo que faz essa validacao nao seja, e quanto ao seu dinheiro, ele vai ser roubado enquanto existir corrupcao e desonestidade no Brasil (e eu vejo coisas como a situacao tributaria atual extremamente desonesta), e nao pq a maioria dos brasileiros tem 3 documentos de identidade diferentes. :wink:

Ok, chefe.Sugestão acatada.
Qto a conversão eu jah uso o link q vc pôs de conversões há tempos, mas há outro q uso mais intuitivo e científico.
Eu não tô falando do código só que eu irei digitar, mas para o programador, convertToATM(double N,int scale) é claro não é?(Eu me preocupo com o usuário!)

Corrupção existe e existirá em qualquer país do mundo, pois o corrupto é um parasita(1) mutualista,por vezes simbiótico, que cria colônias com muita facilidade.Só existe o corrupto por que existe o corrompido.Ninguém está livre dessa.E sim Cv, a existência de vários documentos descentralizados é a melhor forma de propagar a corrupção que mama nas tetas do erário.Dificulta o cruzamento de dados.Se centralizar, ficaria muuuuuito mais difícil.

NOTA: (1)-Minha própria definição de ser humano em matéria de sua relação para com o meio.