O código legado se faz presente na vida de todo engenheiro de software. Saber como lidar com ele é um grande ganho para o negócio, aprenda formas de como manipula-lo e por fim vencê-lo.
internas * desse objeto podem estar sendo alteradas! * * E essas alterações podem se propagar no * consumo do objeto. */ private CustomData customData; public Effect(CustomData customData) { this.customData = customData; }
estado estático * representa um alto risco de volatilidade * no consumidor da variável. */ public static CustomData customData = new CustomData("start"); public void changeState() { customData = new CustomData("execute"); }
{ const balance = this.getBalance() if (value <= balance) { console.log("Sucesso no saque") } else { console.log("Erro no saque") } } private getBalance() { // Mundo externo que chama uma API para retorno do saldo. return 1000.0 } } const bank= new Bank() bank.withdraw(500)
= "Atualizar as bases"; String key = "teste"; String expectedMessage = "TESTE:ATUALIZAR AS BASES"; MessageDispatcherFake fakeDispatcher = new MessageDispatcherFake(key); // When fakeDispatcher.processMessage(message); // Then String lastMessage = fakeDispatcher.getLastMessage(); boolean isEquals = lastMessage.equals(expectedMessage); System.out.println("Resultado: " + isEquals); } Os elos da herança e do polimorfismo
Rectangle(int x, int y, int width, int height) { ... } public void setWidth(int width) { ... } public void setHeight(int height) { ... } public int getArea() { ... } } public class Square extends Rectangle { public Square(int x, int y, int width) { ... } } public static void main(String[] args) { Rectangle rectangle = new Square(...); rectangle.setHeight(3); rectangle.setHeight(4); }
def speak(self): print("O gato fala Meow!") def make_animal_speak(animal): animal.speak() dog = Dog() cat = Cat() make_animal_speak(dog) # Saída: O cachorro fala Woof! make_animal_speak(cat) # Saída: O gato fala Meow! Os perigos do duck typing
= ProcessInfo() processInfo.startNewScope(hardWork.getStrategy()) } class ProcessInfo { fun startNewScope( legacyStrategy: LegacyStrategy ) { val immutableData = legacyStrategy.getData() println(immutableData.name) } } data class NewInfo( val name: String ) fun interface LegacyStrategy { fun getData(): NewInfo } class HardWorkClazz { private var legacyName = "" fun getStrategy(): LegacyStrategy { return LegacyStrategy { NewInfo(legacyName) } } /** * Conjunto de funções de * manipulação com alto risco. * ... */ }
fun interface LegacyStrategy { fun getData(): NewInfo } interface FinishExecution { fun terminate(message: String) } class FakeFinish : FinishExecution { private var lastMessage = String() override fun terminate(message: String) { lastMessage = message } fun getLastMessage(): String = lastMessage } class ProcessInfo( private val finishExecution: FinishExecution ) { fun startNewScope( legacyStrategy: LegacyStrategy ) { val immutableData = legacyStrategy.getData() val name = immutableData.name finishExecution.terminate(name) } }
var state = "runtime" /** Estrutura não compreensível */ } // Interface de recepção interface TerminateState { fun sendMessage(message: String) } // Interface de controle interface ProcessState { fun createState() } // Interface de isolamento interface ExecutionScope { // Criação do contexto funcional fun onScope(block: (NewContext) -> Unit) } Functional Replacement
class ImpossibleObject { private var impossibleData = ImpossibleData( state = "execution", status = "good" ) fun getCurrentState(): ImpossibleData { return impossibleData } // Operações extras e "impossíveis de entender". } Humble Object
"mário" private var age = 58 fun getData(): ContextData { return ContextData(name, age) } /** Objeto monstruoso com dados diversos */ } class ContextNew { fun getData(): ContextData { return ContextData("gabriel", 24) } } class ContextToggle { fun isEnabled(): Boolean = true } interface ContextDecider { fun getData(): ContextData } class ContextScopeDecider( private val contextLegacy: ContextLegacy, private val contextNew: ContextNew, private val contextToggle: ContextToggle ) : ContextDecider { override fun getData(): ContextData { return if (contextToggle.isEnabled()) { contextNew.getData() } else { contextLegacy.getData() } } }