A maioria desses cheiros são apenas indícios de algo que pode estar errado. Portanto, eles não precisam ser consertados per se... (Você deve dar uma olhada nisso, no entanto.)
Você pode encontrar todos os cheiros de código anteriores (Parte i - XXVIII) aqui.
Você já viu um IEngine em estado selvagem?
TL;DR: Não prefixe ou sufixe suas classes
public interface IEngine { void Start(); } public class ACar { } public class ImplCar { } public class CarImpl { }
public interface Engine { void Start(); } public class Vehicle { } public class Car { }
Algumas pessoas, quando confrontadas com um problema, pensam “eu sei, vou usar expressões regulares”. Agora eles tem dois problemas.
Jamie Zawinski
Grandes Citações de Engenharia de Software
Acessar um banco de dados em objetos de domínio é um cheiro de código. Fazer isso em um construtor é um cheiro duplo.
TL;DR: Construtores devem construir (e provavelmente inicializar) objetos.
De acordo com o princípio da responsabilidade única, eles só devem construir objetos válidos
public class Person { int childrenCount; public Person(int id) { childrenCount = database.sqlCall("SELECT COUNT(CHILDREN) FROM PERSON WHERE ID = " . id); } }
public class Person { int childrenCount; // Create a class constructor for the Main class public Person(int id, int childrenCount) { childrenCount = childrenCount; // We can assign the number in the constructor // Accidental Database is decoupled // We can test the object } }
Minha crença ainda é que, se você acertar as estruturas de dados e suas invariantes, a maior parte do código se escreverá sozinho.
Peter Deustch
Grandes Citações de Engenharia de Software
Alguns objetos estão sempre juntos. Por que não os separamos?
TL;DR: Faz com que objetos primitivos coesos viajem juntos
Se dois ou mais objetos primitivos estiverem colados, com lógica de negócios repetida e regras entre eles, precisamos encontrar o conceito existente de bijeção .
public class DinnerTable { public DinnerTable(Person guest, DateTime from, DateTime to) { Guest = guest; From = from; To = to; } private Person Guest; private DateTime From; private DateTime To; }
public class TimeInterval { public TimeInterval(DateTime from, DateTime to) { // We should validate From < To From = from; To = to; } } public DinnerTable(Person guest, DateTime from, DateTime to) { Guest = guest; Interval = new TimeInterval(from, to); } // Even Better... public DinnerTable(Person guest, Interval reservationTime) { Guest = guest; Interval = reservationTime; }
Code Smell 122 - Obsessão Primitiva
Cheiro de Código 01 - Modelos Anêmicos
Cheiro de Código 27 - Arrays Associativos
O coração do software é sua capacidade de resolver problemas relacionados ao domínio para seu usuário. Todos os outros recursos, por mais vitais que sejam, suportam esse propósito básico.
Eric Evans
Grandes Citações de Engenharia de Software
Ouvimos muito sobre NFTs. Agora, dominamos o conceito Fungível.
TL;DR: Respeite o MAPPER . Tornar fungível o que é fungível no mundo real e vice-versa.
Fungibilidade é a propriedade de um bem ou mercadoria cujas unidades individuais são essencialmente intercambiáveis e cada uma de cujas partes é indistinguível de outra parte.
Ao mapear nossos objetos com os reais, às vezes nos esquecemos do modelo parcial e construímos sobre o design.
public class Person implements Serializable { private final String firstName; private final String lastName; public Person(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } } shoppingQueueSystem.queue(new Person('John', 'Doe'));
public class Person { } shoppingQueueSystem.queue(new Person()); // The identity is irrelevant for queue simulation
As pessoas pensam que a ciência da computação é a arte dos gênios, mas a realidade é o oposto, apenas muitas pessoas fazendo coisas que constroem umas sobre as outras, como uma parede de minipedras.
Donald Knuth
Não use a avaliação booleana como um atalho de legibilidade.
TL;DR: Não use comparação booleana para funções de efeito colateral.
userIsValid() && logUserIn(); // this expression is short circuit // Does not value second statement // Unless the first one is true functionDefinedOrNot && functionDefinedOrNot(); // in some languages undefined works as a false // If functionDefinedOrNot is not defined does // not raise an error and neither runs
if (userIsValid()) { logUserIn(); } if(typeof functionDefinedOrNot == 'function') { functionDefinedOrNot(); } // Checking for a type is another code smell
Code Smell 140 - Avaliação de Curto Circuito
Code Smell 06 - Programador Muito Inteligente
Um computador é uma máquina estúpida com a capacidade de fazer coisas incrivelmente inteligentes, enquanto os programadores de computador são pessoas inteligentes com a capacidade de fazer coisas incrivelmente estúpidas. Eles são, em suma, uma combinação perfeita.
Bill Bryson