You are currently browsing the category archive for the '.net' category.
Quem trabalha com TestDrivenDevelopment sabe que a pior parte de conseguir uma boa code coverage é que há alguns testes que são demasiado entediantes para se estarem sempre a fazer… Infelizmente, não os fazendo, a % de code coverage desce, o que leva a que os outros testes – estes mais importantes – também passem um pouco despercebidos.
Para ajudar na criação deste tipo de testes, estive há uns meses a trabalhar com uma biblioteca de geração automática de testes, STDL. Esta biblioteca, apesar de ser bastante interessante, implicava ainda algum trabalho manual para que os testes fossem gerados.
Para ajudar a combater isso (e para aprender um pouco mais sobre o ecosistema do VS), passei um fim de semana a criar um addin para o visual studio. Este addin acrescenta ao botão direito do rato uma nova opção para gerar uns stubs para os testes STDL (faz um pouco mais, por inspecção da classe em que se clica mas…
.
Hoje lembrei-me disso e achei que seria interessante colocar aqui umas referências pois nunca se sabe quando irei precisar de gerar testes em .net novamente
Podem ver mais neste post, sacar uma beta release aqui ou ver o código aqui.
Se acharem a plataforma interessante, falem com o Neville Grech na mailing list para ver se o projecto recomeça… Eu era capaz de fazer mais uma ou duas linhas de código
Apesar de não ter escrito nada de novo, acho que o Phil Wright resumiu tudo perfeitamente:
Yahoo have announced they are cutting 10% of its global workforce, about 1500 people, as it tries to cope with its ongoing problems. They also reported a 64% drop in third quarter profits and only a 1% increase in revenue over a year ago(…) Remember this is the same company that turned down a $47.5bn offer from Microsoft last January. I wonder if Jerry Yang still thinks that offer ‘undervalued the company’. This is where the problem of having the original founder as CEO really causes problems.
E, já que vão ao site, aproveitem para experimentar os controlos .net que ele vende. Ah, e alguns são grátis!
Podem ver aqui.
Depois de terminadas as férias (incluindo as férias mentais), está na altura de recomeçar a escrever sobre coisas mais técnicas, como os plugins.
O próximo passo vai permitir que o primeiro grande objectivo se aproxime: permitir que os plugins adicionem elementos à interface usando a ‘Shell’, que representa a aplicação vista pelos olhos dos plugins. A partir desta classe vai ser possível adicionar elementos aos forms, abrir novos documentos, lançar eventos para outros plugins, etc:
Hoje a ler a revista MSDN online reparei num artigo que fala sobre implementar I/O assíncrono usando delegados para os callbacks. Imediatamente lembrei-me do projecto que fiz na Inosat, em que para conseguir rede, GPS ou GRPS no dispositivo móvel, usei um sistema parecido com este.
A maior diferença é que, em vez de declarar dois métodos para callback – um em caso de sucesso e outro em caso de falha – usei apenas um, retornando sempre um valor do tipo Result<T>. Por exemplo, se virem no artigo, o autor para o método:
1: public static string ReadAllText(string path);
define a seguinte assinatura:
1: public static void ReadAllTextAsync(string path, Action<string> success, Action<Exception> failure);
em que o primeiro método é chamado se o método correr como esperado, o segundo é invocado se houver algum problema pelo caminho. No meu caso, a definição seria algo como:
1: public static void ReadAllTextAsync(string path, Result<string> success);
em que a classe Result é:
1: public class Result<T>
2: {
3: private readonly T _value;
4: private readonly bool _valid;
5: private readonly string _error;
6:
7: private Result(T value)
8: {
9: _value = value;
10: _valid = true;
11: }
12:
13: private Result(string error) : this()
14: {
15: _error = error;
16: }
17:
18: private Result()
19: {
20: _valid = false;
21: }
22:
23: public static Result<T> Failed()
24: {
25: return new Result<T>();
26: }
27:
28: public static Result<T> Failed(string error)
29: {
30: return new Result<T>(error);
31: }
32:
33: public static Result<T> Success(T value)
34: {
35: return new Result<T>(value);
36: }
37:
38: public T Value
39: {
40: get { return _value; }
41: }
42:
43: public bool Valid
44: {
45: get { return _valid; }
46: }
47:
48: public string Error
49: {
50: get { return _error; }
51: }
52: }
Isto permite que o Result seja usado para notificar se o método teve sucesso ou não e, caso não tenha, que se possa passar o erro que se encontrou.
A diferença que encontro nas duas abordagens é que, no meu caso, quem trata do resultado tem de verificar se a operação teve sucesso chamando o result.Valid. No caso da implementação que está na revista, cada método sabe se o resultado teve sucesso ou não. Para os puristas que defendem a abolição do uso de If’s (já trabalhei com alguns
), isto é puro ouro!
O primeiro problema que tenho de enfrentar para conseguir usar um sistema de plugins é conseguir identificar os plugins que temos disponíveis e os inicializar. Para isso vou criar o PluginManager.
De alguma forma tenho de definir como é que os plugins serão descobertos pela aplicação: Lidos automaticamente de uma directoria pré-definida, previamente registados usando uma UI na aplicação, ficheiros de configuração, etc. Como não quero ter de decidir isso para já, vou implementar a forma mais fácil que me consiga lembrar e, tendo o cuidado de não ter o uso desta implementação especifica ‘hard-coded’ em lugar algum, vou permitir que mais tarde se possa mudar o plugin manager (quem sabe usando.. um plugin!)
Para o projecto em que estou envolvido desde Janeiro, desde cedo fiz questão que fossem usados muitos processos relacionados com o desenvolvimento para, no final, facilitar o processo de manutenção.
No top 3 destes processos estão, sem qualquer sombra de dúvida:
-
Uso de source control (SVN)
-
Integração contínua
-
Log4net
Desde que usei o log4net na Inosat que acho que é uma ferramenta indispensável para a grande maioria* dos programadores. Desde que a aplicação foi instalada nos servidores que, invariavelmente, todos os problemas podem ser identificados usando os logs para verificar o que se passou.
Ultimamente tenho andado a trabalhar num pequeno projecto pessoal que entretanto decide partilhar.
O objectivo deste projecto é fazer uma aplicação semelhante ao Outlook em termos de interface mas, em vez de tratar de emails, esta aplicação seria direccionada para… qualquer coisa.
Ao ler o blog do Tiago vi uma solução que ele colocou para encontrar a parte decimal de um número usando C#.
À primeira vista pareceu-me que a solução dele era um pouco ingénua:
1: public static int GetDecimalPart(double value)
2: {
3: int number = (int) value;
4: string numbString = number.ToString();
5: int stringLength = numbString.Length;
6: return Int32.Parse(value.ToString().Substring(stringLength + 1));
7: }
Quer dizer, usar strings e Lenght’s? :S Não me parece que seja bom… Então decidi tentar fazer melhor … Esta foi a minha primeira iteração:
