Aplicando os princípios SOLID com AdvPL/TL++ (Parte 3— LSP)
Liskov Substitution Principle
“Se q (x) é uma propriedade demonstrável dos objetos do tipo T. Então q (y) é um verdadeiro objeto para objetos de tipo S, onde é um subtipo de T”.
Este talvez seja um dos princípios mais difíceis de compreender. Ela foi elaborada por Barbara Liskov e Jeannette Wing em 1994.
Este principio define o uso de um dos conceitos mais importantes da programação orientada à objetos, a herança.
A herança possibilita que as entidades do software possam ser extensíveis e reaproveitas. Na herança temos dois tipos de classes:
- Classe Base
- Classe Derivada
Chamamos de Base a classe que concede as características a uma outra classe e de Derivada a classe que herda. Agora que conceituamos os tipos de classes, vamos a um enunciado mais simples do LSP.
"Toda classe derivada deve ser substituível por sua classe pai"
Class Report From LongClassName
Method Gerar()
EndClass
Method Gerar() Class Report
Return(Nil)
Class ReportPdf From Report
Method Gerar()
EndClass
Method Gerar() Class ReportPdf
Return(Nil)
Class ReportWord From Report
Method Gerar()
EndClass
Method Gerar() Class ReportWord
Return(lSucess)
Class RunReports From LongClassName
Method RunReport()
EndClass
Method RunReport(aObjects) Class RunReports
Local nX
For nX := 1 To Len(aObjects)
aObjects[nX]:Gerar()
Next nX
O exemplo acima demonstra a aplicação do LSP, se observamos o método "Gerar" da Classe ReportPdf, ele pode ser substituído pelo da classe Base Report. Porém o mesmo não é verdadeiro no caso da classe ReportWord, pelo fato de terem retornos diferentes, o que "quebraria" o software.
O uso deste principio, nos remete a um uso mais adequado da herança, evitando o seu uso para propostas diferentes do que uma extensão da classe, deixando o código fonte organizado, extensível, coeso e sem as famosas "gambiarras".