Reutilização é quase sinônimo de bom design?

10

A reutilização é um recurso do bom design de software .

A reutilização é um glossário aceitável ("breve notação do significado") para um bom design de software? Por quê?

Matthew Rodatus
fonte
Eu argumentaria que a flexibilidade é mais importante. Ter uma arquitetura subjacente que tente acomodar a realidade de que algo provavelmente mudará ou será acrescentado mais tarde é a minha opinião. A reutilização quase chega de graça nesse ponto.
Pemdas 11/11
Seu uso da flexibilidade soa exatamente como reutilização.
Matthew Rodatus
"Reutilização é a probabilidade de um segmento do código fonte que pode ser usado novamente para adicionar novas funcionalidades com ligeira ou nenhuma modificação" - en.wikipedia.org/wiki/Reusability
Matthew Rodatus
Estou impressionado que a maioria das respostas abaixo diga não . Agora, esse seria o caso apenas alguns anos atrás (bem ... 5 a 10 anos), quando a reutilização era toda a raiva, algo altamente desejável.
Martin Wickman
@MartinWickman A reutilização é boa, mas não é gratuita.
Calebe

Respostas:

13

Não.

A reutilização é um indicador de bom design. Isso indica que o acoplamento do sistema está frouxo o suficiente e a coesão de uma unidade específica é alta o suficiente para facilitar a reutilização sem ocorrer problemas de dependência ou ter que reescrever a maior parte do código.

A reutilização é em grande parte uma ilusão. É comprovadamente impossível medir a "capacidade de reutilização" de uma unidade sem saber com antecedência onde ou como será usada. Muitos desenvolvedores tentarão projetar componentes "reutilizáveis" e frequentemente descobrirão mais tarde que os aspectos específicos que eles tentaram tornar "flexíveis" são exatamente os que não precisavam ser.

Eu usaria um "gloss" diferente: testabilidade.

Agora não sou um defensor do TDD, nem sinto a necessidade de testar a unidade de tudo e qualquer coisa. Mas escrever testes para um componente fornecerá uma idéia muito boa de suas características de acoplamento / coesão e muito rapidamente. Se isso depende de abstrações, isso é um acoplamento frouxo; você achará fácil zombar das dependências e isso sugere um bom design. Se ele tiver um objetivo claro (consulte também o Princípio da responsabilidade única ), seu comportamento será relativamente intuitivo, e você descobrirá com facilidade o que testar, o que novamente sugere um bom design.

Obviamente, isso não garante um bom design; a implementação real ou mesmo toda a arquitetura pode ser totalmente inadequada para o propósito declarado. Mas pelo menos ele diz que você não está trabalhando com código de espaguete ou com Deus Objects.

Por favor, não tente adivinhar a "reutilização" de um componente, especialmente para não usá-lo como evidência de "bom design". Isso é algo que você só pode estabelecer em retrospectiva, uma vez que realmente é reutilizado, e então o design pode ter mudado significativamente.

Aaronaught
fonte
Boa resposta. Você respondeu à pergunta que eu deveria ter perguntado: "Qual é um bom glossário para um bom design de software?"
Matthew Rodatus
+1: Especialmente para "Reutilização é basicamente uma ilusão".
Kramii
É apenas um indicador de bom design se a reutilização for uma meta. Geralmente, é um objetivo, se implícito, mas gastar tempo e dinheiro para tornar os componentes reutilizáveis ​​quando não precisam ser é apenas um desperdício.
Caleb
5

Não.

A reutilização é um bom recurso, pois pode acelerar o desenvolvimento futuro. (Embora, na prática, poucas organizações vejam o desenvolvimento futuro acelerado quase tanto quanto esperavam.) No entanto, qualquer parte significativa do software possui partes específicas para esse aplicativo. Além disso, quando pessoas sem experiência no domínio tentam escrever software reutilizável, geralmente ofuscam essa peça e reduzem o desempenho sem realmente conseguir torná-lo reutilizável.

Portanto, um bom design é modular e reutilizável somente onde você pode ver que a peça pode ser reutilizada e onde você possui o conhecimento necessário para obter a reutilização. Em outros lugares, você deve tentar limpar as coisas, mas não se preocupe com a reutilização. (Exceto na parte de trás da sua cabeça, onde você está fazendo anotações, para que em algum sistema futuro você tenha uma idéia de como fazer isso reutilizável.)

btilly
fonte
E o teste automatizado? Os testes de unidade não são uma forma de reutilização?
Matthew Rodatus
@ Matthew-Rodatus: Os testes de unidade fazem parte do fornecimento de software. A reutilização geralmente se refere à reutilização de código em algum outro software.
btilly
Bom ponto. Acho que estou usando "reutilização" em um sentido ontológico, o que é confuso. No entanto, observar como as características de reutilização também são características do código testável: en.wikipedia.org/wiki/Reusability
Matthew Rodatus
11
@ matthew-rodatus: Reutilização não é, "Possui esta lista de recursos." Se você tentar obter reutilização dessa maneira, falhará bastante. Confie em mim nisso.
btilly
Bom ponto. Vejo agora que não fiz a pergunta que pretendia fazer, mas ainda é um diálogo interessante.
Matthew Rodatus
4

Acredito (e essa é minha crença pessoal) que a relação entre reutilização e bom design não é reflexiva; portanto, a resposta básica e simples é não . Se você estiver interessado em alguns bons guias de design, consulte este artigo da Wikipedia.

Um bom design de software deve ser reutilizável, pelo menos em algumas partes principais, acho que muito poucas pessoas fazem uma reutilização real do código-fonte, devido ao fato de ser extremamente complexo projetar o núcleo de um sistema para ser reutilizável em muitos contextos diferentes (E eu estou dizendo isso por experiência própria)

Considere uma classe com uma enorme quantidade de responsabilidades (também conhecida como Blob) executando todas as tarefas necessárias, mas sem qualquer tipo de consideração de design, talvez você já tenha visto o caso. A maioria das pessoas com uma classe assim usaria repetidamente e acho que teremos que concordar que é reutilização, reutilização sem design.

Espero não ter estragado muito minhas explicações

David Conde
fonte
Foi por isso que disse "brilho" (com o que quero dizer que, praticamente, a reutilização captura a maioria, mas não tudo o que queremos dizer com bom design).
Matthew Rodatus
O que quero dizer é que você precisa de reutilização para ter um bom design , mas ter um monte de código "reutilizável" não significa que você tenha um bom design, então eu ainda diria que não, nem mesmo como brilho
David Conde
Isso faz sentido. Não sei se concordo, mas marquei +1 em uma resposta bem pensada.
Matthew Rodatus
2

Penso que um melhor indicador de bom design é a adesão a idéias fundamentais, como o princípio da responsabilidade única e a manutenção da coesão de cada componente. Usando abstrações com uma interface limpa e concisa e mantendo a conformidade com o Principal de Substituição de Liskov , incentivamos a reutilização, sem tentar prever o que será ou não reutilizado.

A adesão a esses princípios fundamentais de design facilita o teste e a reutilização do código .

Bom design == bom design, a reutilização é um subproduto.

Larry Hector
fonte
1

A reutilização geralmente é um objetivo implícito do projeto. Se você pode criar um componente ou um design inteiro, de forma que possa ser reutilizado posteriormente, parece óbvio que você deve fazer isso. O que nem sempre é óbvio é que pode levar muito tempo e esforço (e dinheiro) para tornar algo reutilizável, e o benefício da reutilização deve, portanto, ser ponderado em relação ao seu custo.

Um design reutilizável que custa duas vezes mais e / ou leva o dobro do tempo para construir do que o que o cliente precisa não é um bom design da perspectiva do cliente, principalmente se o cliente não precisar de reutilização.

Há vários atributos semelhantes que geralmente são considerados objetivos implícitos de design, porque parecem obviamente bons:

  • minimizando o custo

  • minimizando o tempo de desenvolvimento

  • minimizando a complexidade

  • maximizando a confiabilidade

Essas coisas são objetivamente boas, mas nem sempre são importantes para um cliente em particular em um determinado momento; portanto, é importante entender completamente o que seu cliente precisa (mesmo que esse cliente seja apenas seu chefe). Existem vários aforismos que nos lembram esse fato (por exemplo, "Feito é melhor que perfeito" e "Bom, barato, rápido: escolha dois"), mas ainda é fácil cair na armadilha de tentar crie um software que seja ótimo em todos os aspectos, quando, na verdade, nem sempre é necessário.

Para chegar à pergunta do título, então: Não , reutilização não é sinônimo de bom design. A reutilização pode ser um componente útil de um bom design específico, mas somente quando necessário.

Caleb
fonte
0

Não necessariamente. Se você tornar algo reutilizável que claramente nunca será reutilizado, será um projeto ruim.

Por exemplo, se você estiver gravando um arquivo cheio de dados exclusivos da sua empresa e esses dados forem importados uma vez para outro lugar, por que se preocupar em torná-los reutilizáveis?

Dito isto, se sua estrutura ainda não tiver uma, o código para gravar em um arquivo pode precisar ser reutilizável. Isso seria um bom design.

pdr
fonte
Como você tem certeza se algo nunca será reutilizado?
Matthew Rodatus
11
@Matthew - Essa seria a minha definição de um bom designer: Alguém que normalmente recebe essa pergunta certa
PDR
0

Eu diria que não, principalmente porque descreve apenas um pequeno segmento de código. Descobri que, onde a usabilidade é mais importante, está no cerne e nas bordas externas do território da concessionária, não muito no meio. Vou dar alguns exemplos de coisas em que acho que a reutilização é uma métrica útil do design de qualidade.

Material principal

  • Modelos de formulário da Web que permitem que uma página seja adicionada com facilidade e consistência (ou para qualquer tipo de interface do usuário)
  • Auxiliares de padrão de design como uma classe base do ViewModel que será incluída em todos os meus aplicativos MVVM

Material Utilitário

  • Classe de email que envia uma mensagem SMTP (use o tempo todo)
  • Uma classe de calculadora de distâncias GIS (usada em vários aplicativos)

Para o material CRUD que ocupa de 70 a 80% da maioria dos aplicativos, não acho que a reutilização seja uma métrica valiosa.

Morgan Herlocker
fonte