StackOverflow/StackExchange

9 respostas
acazsouza

Eu fico realmente surpreso com algumas questões e respostas no StackOverflow/StackExchange.
Tem dicas e malícias sobre coisas que não se encontra nos livros/documentos, achei uns tópicos bem interessante e queria compartilhar com a galera, até pra discutir:

What popular ?best practices? are not always best, and why?

What should take precedence: YAGNI or Good Design?

Vou descrever aqui alguns tópicos interessantes que eu concordei pra quem não tiver tempo de ler todos os tópicos:

“Premature optimization is the root of all evil.”

Não, não é. É melhor construir com um bom desempenho desde o início, desde que você não se concentre em minúcias.

“Don’t reinvent the wheel.”

Nossa, essa é uma das mais faladas e eu tive que concordar com a resposta: Uma solução 100% adequada raramente existe.

“Unit Test Everything.”

Teste de unidade em tudo realmente eu não concordo, existem métodos e classes que só fazem chamadas a outros métodos e classes, fazer testes de unidade pra esses membros é fazer o teste conhecer 100% a implementação destes caras, ficando difícil de dar manutenção e coisas do tipo, melhor um teste de integração nesses casos.

“The Single Responsibility Principle” - S in S.O.L.I.D. Principles

Podemos cair no erro de levar em consideração esse princípio em tudo sem levar em consideração a coesão. Eu mesmo estava fazendo uma classe de serviço que fazia nada mais nada menos que operações CRUD, se eu levar em consideração o SRP nela, teria 4 classes: CreateClass, ReadClass, UpdateClass e DeleteClass, me levando a um exagero de classes sem necessidade, muito mais simples manter essas operações em uma única classe.


Acho que coisas como essa traz muita dificuldade para iniciantes, são coisas que não são muito comentadas sobre os patterns/principles/bestpractices.

Good advice comes with a rationale so you can tell when it becomes bad advice. If you don’t understanding why something should be done, then you’ve fallen into the trap of cargo cult programming, and you’ll keep doing it even when it’s no longer necessary or even becomes deleterious. - Raymond Chen in Good advice comes with a rationale so you can tell when it becomes bad advice

9 Respostas

leonardobhbr

Amigo alem de coesão existe padroes exmplos MVC Strategy, Factory DAO, Service, etc

exemplo o padrão DAO vc abstrai toda sua camada de acesso ao banco de dados em uma unica classe entendeu.

Uma classe deve ter o minimo de funcionalidades para atingir um objetivo não significa que uma classe deva ter apenas um metodo.

Não sei se foi vc que postou o exemplo de Dot.net sobre a classe list te tudo dentro dela, considero errado isso pq a classe List o objetivo dela e conseguir guardar uma lista de objeto na memoria e não pesquisar ordenar, fazer café, etc.

acazsouza

leonardobhbr:
a classe List o objetivo dela e conseguir guardar uma lista de objeto na memoria e não pesquisar ordenar, fazer café, etc.

então a Microsoft fez errado, pq a lista no .Net é assim, ela por si sozinha se ordena e tudo mais.

leonardobhbr

Tudo na vida tem um proposito exemplo delphi foi feito para ser uma das ferramentas mais produtiva para desktop. E hoje ele é uma decadência. vb identico

acazsouza

Olhe os métodos da lista (http://msdn.microsoft.com/pt-br/library/6sh2ey19.aspx):

Método Add

Método AddRange

Método AsReadOnly

Método BinarySearch

Método Clear

Método Contains

Método ConvertAll(TOutput)

Método CopyTo

Método Exists

Método Find

Método FindAll

Método FindIndex

Método FindLast

Método FindLastIndex

Método ForEach

Método GetEnumerator

Método GetRange

Método ICollection.CopyTo

Método IEnumerable(T).GetEnumerator

Método IEnumerable.GetEnumerator

Método IList.Add

Método IList.Contains

Método IList.IndexOf

Método IList.Insert

Método IList.Remove

Método IndexOf

Método Insert

Método InsertRange

Método LastIndexOf

Método Remove

Método RemoveAll

Método RemoveAt

Método RemoveRange

Método Reverse

Método Sort

Método ToArray

Método TrimExcess

Método TrueForAll

Isso quebrou o SRP dessa classe? rsrs

leonardobhbr

Amigo na acho que esses metodos aqui, não deveriam tar nessa classe

ForEach BinarySearch Find FindAll FindIndex FindLast FindLastIndex TrimExcess dentro de um list. Alem dos metodos sort,reverse.

O mais absurdo é o metodo forEach

doravan

leonardobhbr:
Amigo na acho que esses metodos aqui, não deveriam tar nessa classe

ForEach BinarySearch Find FindAll FindIndex FindLast FindLastIndex TrimExcess dentro de um list. Alem dos metodos sort,reverse.

O mais absurdo é o metodo forEach

Rapaz, penso diferente. Esses métodos provém facilitação de código.
Imagine ter que receber a lista, depois fazer um laço foreach, escrever o código dentro do laço foreach para acessar um outro método, quando você pode simplesmente chamar o método foreach da List e passar para ela um delegate.

Sou a favor da simplicidade, mas se a Microsoft gosta de descer o código no núcleo facilitando a programação, melhor que ela faça mesmo.

Gosto tanto de C# quanto de Java, mas tem coisas em C# que são bem mais perspicazes que no java.

o que você acha mais fácil fazer?
isso?

private String nome;
public void setNome(String nome){
   this.nome = nome;
}
public String getNome(){
return nome;
}

ou isso?

public String Nome {get;set;}
leonardobhbr

Como disse anteriormente se for pra ser facil eu trabalhava com Delphi.

Sobre sua pergunta

public String Nome {get;set;} se isso é mais fácil do que

private String nome; public void setNome(String nome){ this.nome = nome; } public String getNome(){ return nome; }

Eu te digo uma coisa eu prefiro um padrão que é muito bem documentado e bem definido POJO http://pt.wikipedia.org/wiki/Plain_Old_Java_Objects

Claro que isso é meu ponto de vista antigamente eu trabalhava com Delphi por isso falo tanto nele, depois que comecei aprender Java comecei a mudar meu ponto de vista fui aprendendo padrões de projetos, boas práticas de desenvolvimento., que fui mudando até minha maneira de programar em Delphi e comecei a ver os pontos fraco da linguagem com relação a OO.

Eu acho muito mais legivel o código tendo os metodos get/set do que ao voce criar um atributo voce colocar no final dele public Nome {get;set;}

B

acazsouza:

“Don’t reinvent the wheel.”

Nossa, essa é uma das mais faladas e eu tive que concordar com a resposta: Uma solução 100% adequada raramente existe.

Raramente existe por que chegar a 100% normalmente não tem um bom custo-benefício.

Aliás tudo que ouvir de boas práticas, conselhos, princípios, todos tem base em custo-benefício. Por exemplo, não tem por que fazer teste unitário para algo que não te trará benefícios testar exaustivamente. Se bem que isso também pode entrar no mérito de “Se não tem por que testar, por que a minha aplicação depende deste componente?”, um bad smell.

C

leonardobhbr:
Amigo na acho que esses metodos aqui, não deveriam tar nessa classe

ForEach BinarySearch Find FindAll FindIndex FindLast FindLastIndex TrimExcess dentro de um list. Alem dos metodos sort,reverse.

O mais absurdo é o metodo forEach

Discordo de você também amigo. O paradigma orientado a objetos visa como um dos principios que cada componente de software tenha suas próprias ações como se fossem seres vivos. Mas claro, essa é apenas minha opinião.

Mas voltado ao assunto do tópico, de fato, já estudei muitos padrões de projetos e sempre tento pensar o máximo para a melhor aplicação deles no meu projeto (incluindo frameworks e etc). Mas recentemente me convenci que as vezes o melhor padrão é simplesmente não ter padrão. Forçar supostas “boas práticas” em todo canto do seu projeto pode causar uma grande dor de cabeça para uma simples manutenção (embora em alguns casos possibilite melhor estensabilidade do código).

Criado 21 de outubro de 2011
Ultima resposta 24 de out. de 2011
Respostas 9
Participantes 5