Abstraction is the elimination of the irrelevant and the amplification of the essential
Uncle Bob Martin
La Abstracción es donde el diseño de software empieza. Ayuda a eliminar código duplicado y facilita encontrar nuevas abstracciones.
No solo depende de la interfaz (si es que el lenguage provee), también del nombre, ya que a través de tal se puede intuir que funcionalidad ofrece el método o incluso la clase. Muchas ocasiones el código es duplicado porque no se intuyó correctamente la funcionalidad descrita en el nombre y es probable que se termine recreando una funcionalidad ya probada (existen muchos foros, posts y papers que tratan exclusivamente de la necesidad de escoger cuidadosamente el nombre de las clases y sus métodos).
Algo que se debe tener en cuenta es la necesidad de mover funcionalidades, que pueden estar duplicadas y que varían en ciertos parámetros o definiciones, a clases que las contengan y que permita su manejo de forma más óptima (esto también es abstracción), sin embargo algo que puede cruzarse por nuestra cabeza, al momento de querer realizar estas abstracciones, es performance; pero antes de decidir si estas modificaciones afectan o no el performance, deberíamos realizar pruebas y sobre todo considerar que una arquitectura bien pensada y correctamente implementada puede derivar en un software de calidad y en una vida más fácil para el desarrollador.
We hear the same resistance to these ideas all the time: “But all these new method calls and object instantiations are going to degrade performance.”…The world changes too fast to blindly follow rules of thumb about performance.
Como siempre les aconsejo leer el artículo sobre abstracción de Jeff Langr en pragprog.com