Sei que muitos de nós mantemos nossa pequena biblioteca pessoal com ferramentas e utilitários que usamos com freqüência.
Eu tenho o meu desde os 16 anos, então ele cresceu para um tamanho considerável. Algumas das coisas que escrevi foram adicionadas à estrutura. Eu escrevi minha própria pequena implementação de árvores de expressão para uso com algoritmos genéticos muito antes do LINQ, do qual gosto bastante e me orgulhava na época - é claro que agora é bastante inútil. Mas, recentemente, estive passando por isso e atualizando para o .NET 4.0 e reacendi o interesse.
Então, estou curioso para saber o que você usa na sua biblioteca. Talvez pudéssemos ter algumas idéias interessantes para pequenos trechos úteis e compartilhá-las entre nós.
Então, minhas perguntas são:
- Você possui uma biblioteca de utilidades diversas?
- De que parte você mais se orgulha e por quê?
Dê um exemplo de código, se quiser :-)
fonte
Respostas:
Não.
Eu já vi alguns efeitos de pesadelo de uma dúzia de desenvolvedores, todos adicionando suas próprias bibliotecas de estilo "util.h" a projetos e transformando-as em uma bagunça gigante de nomes e comportamentos inconsistentes de funções. Muito parecido com o PHP. Então, por esse motivo, evito fazê-lo.
Evito fazer isso usando ambientes de programação que me fornecem quase todas as ferramentas e bibliotecas necessárias sempre que possível, como C # e python.
fonte
SmartFormat
Meu utilitário favorito é o que eu escrevi - um simples construtor / formatador de strings que facilita a transformação de dados em strings com a gramática correta.
Por exemplo, a maioria dos programadores construir texto de um modelo:
"There are {0} items remaining"
mas isto leva a erros gramaticais:"There are 1 items remaining"
.Então, SmartFormat permite escrever:
"There {0:is|are} {0} item{0:|s} remaining"
.Você apenas substituir
String.Format(...)
comSmart.Format(...)
e é isso!O código SmartFormat é de código aberto: http://github.com/scottrippey/SmartFormat/wiki
fonte
java.text.MessageFormat
.MessageFormat
tem aChoiceFormat
classe que permite uma sintaxe surpreendentemente semelhante! Um exemplo da documentação:"There {0,choice,0#are no files|1#is one file|1<are {0,number,integer} files}."
. Obrigado por mencionar esta referência."{Count:<0?negative|=5?five|>50&<100?large|other}"
. Ele possui reflexão (ou seja"There are {items.Length} items"
, pode formatar itens e intervalos de tempo da matriz. Além disso, possui um modelo de plug-in para suportar ainda mais recursos.Smart.Format("There are {0.Count} files: {0:'{}'|, |, and }.", files);
resultaria em"There are 3 files: 'a.txt', 'b.txt', and 'c.txt'."
. Não consigo imaginar "localização" sem ele.Combinador K (C #, Scala)
Eu uso o combinador K em Ruby com bastante frequência, principalmente em dobras quando a operação de dobra é realizada através de um efeito colateral ao invés de um valor de retorno, como neste exemplo:
Isso conta com que frequência cada elemento ocorre
some_collection
. Infelizmente, na verdade não funciona, pois o bloco precisa retornar o novo valor do acumulador a cada iteração, mas nas atribuições do Ruby é avaliado o valor atribuído.Portanto, você deve retornar explicitamente o novo valor do acumulador assim:
Mas acho esse seqüenciamento explícito feio nesse estilo funcional usando dobras. O combinador K (chamado
Object#tap
em Ruby) para o resgate:Eu já perdi algumas vezes em C # (principalmente porque, por algum motivo, mutadores de coleção, como
List.Add
return emvoid
vez dethis
) e Scala, então eu carrego isso:e em Scala:
Função de identidade (Ruby)
Algo que estou sentindo falta no Ruby, é uma maneira bem nomeada de acessar a função de identidade. Haskell fornece a função de identidade com o nome de
id
, Scala com o nome deidentity
. Isso permite escrever código como:O equivalente em Ruby é
Não sai exatamente da língua, pois não?
A correção é
ForEach (.NET)
Outro método extremamente ausente em C #:
fonte
Action
implica efeitos colaterais que são contrários aos princípios de design do LINQ.IEnumerable
extensões foram adicionadas para o LINQ.ForEach
não é um operador LINQ. Por que as restrições que se aplicam apenas aos operadores LINQ se aplicamForEach
, que não é um operador LINQ? E por que os efeitos colaterais são proibidos,IEnumerable.ForEach
mas permitidosList.ForEach
? Além disso, por que os efeitos colaterais são proibidos,IEnumerable.ForEach
mas permitidosforeach
?List<T>
ter umForEach
é razoável, considerando que é um tipo mutável.Eu tenho um conversor de tipo Java. Tem uma assinatura pública
e faz o possível para converter o valor de origem no tipo de destino. Essencialmente, permite fazer digitação dinâmica em um idioma estaticamente digitado :-)
É realmente útil com tipos numéricos em caixas. Quão irritante é que você não pode colocar um
Integer
ondeLong
é esperado? Não tem problema, basta convertê-lo. Ou então, se sua função espera umadouble
, mas você precisanull
colocar lá? Kaboom, um NPE. Mas aguardeconvert
, e você recebeNaN
.fonte
NaN
suporte.NaN
é excelente. Pena que não existe tal coisa para números inteiros. Eu useiInteger.MIN_VALUE
como uma convenção. Geralmente é "estranho o suficiente" para ser notado, diferentemente do valor padrão 0. Não sei por que o (des) boxe automático não trata(Double) null
comoNaN
. É a solução certa óbvia, IMHO.Do código misc que eu escrevi, a maioria das coisas boas está no CCAN agora, enquanto o resto eu costumo encontrar versões melhores de projetos existentes de código aberto. Eu me pego escrevendo cada vez menos códigos "diversos" de uso geral hoje em dia, em favor de escrever variantes específicas de aplicativos desse código ou escrever módulos de uso geral que eu possa liberar por eles mesmos.
C
Aqui está uma função e typedef que usei mais de uma vez. Para aplicativos que precisam de tempo, é difícil superar milissegundos em termos de simplicidade:
E mais funções C diversas que costumo usar repetidamente (e repetidamente):
Haskell
A
nub :: (Eq a) => [a] -> [a]
função de Haskell é O (n²) porque, por sua assinatura de tipo, só é permitido testar se dois elementos são iguais. Uma alternativa O (n log n) simples émap head . group . sort
, mas requer forçar toda a lista de entradas antes de produzir saída, enquantonub
pode começar a produzir saída imediatamente. A seguir, é apresentada uma alternativa O (n log n)nub
àquela que coleta itens já vistos em umData.Set
:Em Haskell, eu uso Alternativas
sequence
,mapM
,forM
,replicateM
, efilterM
. Cada uma dessas ações gera uma lista, mas a lista não pode ser usada até que a ação seja concluída na íntegra (se você estiver usando uma mônada estrita como E / S). As alternativas constroem a lista ao contrário, em vez de formar uma torre de thunks, que eu achei mais rápida no benchmarking, pelo menos com o GHC.Nota:
sequence_
,mapM_
,forM_
, ereplicateM_
funções ainda são uma escolha melhor se você não está interessado na lista de resultados.fonte
Acabo implementando split / join ala Perl em idiomas que não o possuem.
Eu também reimplementei o atoi e o itoa em C mais vezes do que quero pensar (junk de sistemas embarcados).
fonte
Não.
Eu faço a maior parte da minha codificação em Java, e a melhor prática é reutilizar "utils" das bibliotecas Apache Commons e projetos similares.
Se você é objetivo, existem poucos casos em que sua própria coleção de "utils" será uma melhoria significativa no que outras pessoas já fizeram. E se não for uma melhoria, sua biblioteca de utilitários provavelmente será uma perda de tempo de desenvolvimento e um incômodo / ônus para futuros mantenedores.
fonte
Eu tive algumas manipulações de datas que realizei usando Java, depois comecei a usar o JodaTime pois tinha ouvido coisas boas sobre ele e que deveria ser incluído no Java 7 (não tenho certeza se esse ainda é o caso, mas mesmo que ainda não seja) vale a pena usá-lo imho).
Ele transformou uma classe de mais de 50 linhas em uma linha com cerca de três chamadas de método em cadeia.
Para os curiosos, envolvia-se em obter a data para cada dia das n semanas passadas: por exemplo, o valor das vendas de uma segunda-feira 10 semanas atrás etc etc).
E aqui faz parte disso
fonte
Eu sempre tenho um
utils
pacote de algum tipo, mesmo em Java, mas minha coleção de utilitários PHP é a mais reutilizada. Existem tantas boas bibliotecas em Java que eu já tenho uma biblioteca incluída no projeto ou preciso apenas criar alguns utilitários ausentes por conta própria. Bibliotecas PHP tendem a fazer muito para eu querer incluí-las em meus projetos.Eu meio que gosto dessa função para PHP, refinada com ajuda no StackOverflow ...
É semelhante ao BeanUtils para Java do Apache, e eu o uso para uma finalidade semelhante, fornecendo aos elementos de formulário em uma linguagem de modelo uma única chave que pode obter / definir um valor aninhado em uma matriz de origem:
Claro que, sendo PHP, eu queria manter o método tão leves quanto possível, de modo que não é bastante como featureful como BeanUtils
;)
fonte
A biblioteca padrão Scala não possui algumas funções de ordem superior mais comumente usadas.
Duas dessas funções que eu mais preciso:
fonte
Atualmente não. Eu tinha um quando estava fazendo C, mas agora que faço Java, não faz mais sentido, considerando todas as bibliotecas padrão disponíveis, além de todas as guloseimas provenientes do projeto Apache.
Uma das coisas úteis na minha biblioteca C foi uma implementação rápida e suja da máquina de estados finitos, que permitiu a definição de uma máquina de estados finitos com apenas duas strings e uma série de strings. Ele poderia ser usado para verificar seqüências de caracteres em relação às regras (por exemplo, "deve ter 4 a 6 caracteres, primeiro uma letra, dígitos restantes"), mas a disponibilidade de expressões regulares torna essa coisa completamente inútil.
fonte
Agora não posso escrever interfaces de usuário da área de trabalho sem caixas de diálogo dinâmicas , com base na execução diferencial . É um truque que eu tropecei por volta de 1985, e o implementei em vários idiomas mais vezes do que me lembro.
fonte
Eu descobri que estava escrevendo muito do mesmo código no django: Faça isso de comum, depois comum e, finalmente, comum. Basicamente, obtenha um ou mais itens do banco de dados ou salve os resultados de um formulário.
Se cada uma dessas coisas ocorrer apenas uma vez em uma exibição, eu posso usar as visualizações genéricas do django. Infelizmente, essas não são realmente compostas e eu precisava fazer várias coisas em sequência.
Então, escrevi uma biblioteca de visualizações ainda mais genérica, que funcionava primeiro criando uma lista de ações de conjuntos de consultas relevantes (ou qualquer outra coisa) e, em seguida, agrupava a lista em uma exibição.
Ainda preciso escrever algumas visualizações à mão, mas essas geralmente são complexas o suficiente para que não haja muita coisa reutilizável nelas. Todo o boilerplate fica em outro lugar, seja uma exibição genérica ou como um decorador de exibição (geralmente uma exibição genérica decorada). Isso normalmente acaba sendo cerca de 10% dos manipuladores que eu escrevo, pois alguns manipuladores genéricos podem fazer todo o resto.
fonte
Sim, mas apenas para estruturas de idiomas específicos de domínio (como contêineres específicos de objetos de jogo).
Como são ferramentas utilitárias simples do que qualquer coisa complexa, não tenho orgulho de nada lá. Eu sou o usuário único no momento, então não há nada do que se orgulhar.
fonte
Classificação indireta C ++, com base no STL
sort
e em um modelo de functor.A necessidade de classificação indireta (na qual a saída desejada eram os índices de permutação que resultariam da classificação dos dados, mas não os dados classificados em si) apareceu várias vezes em vários projetos. Eu sempre me perguntei por que a STL não forneceu uma implementação para ela.
Outro foi um vetor cíclico C ++, onde índices positivos e negativos são módulos com o tamanho do vetor (para que quaisquer valores inteiros sejam índices válidos para o vetor).
fonte
Escrevi um pequeno pacote de utilitários quando estava desenvolvendo Java no meu Comp. Classe Sci no ensino médio. Estou mais orgulhoso do meu gerador de números aleatórios.
Adereços para minha inspiração.
fonte