Concrètement, quand tu raisonnes un logiciel, tu fais un parallèle avec ce qui est le plus proche, et dans beaucoup de cas, ce sont les mathématiques qui proposent un compromis raisonnable. Dans l'orienté Objet, on raisonne par effets (transformation) et on fait des raccourcis douteux pour converger vers ce qui ressemble le plus à un objet, les types de données abstraits (
http://www.cs.utexas.edu/~wcook/Drafts/2009/essay.pdf) et si tu lis ce papier, tu te rendras compte de la différence de portée fondamentale qui rend le code, complexe à générer. Après, certains essayistes essaient de présenter l'objet comme un réseau cognitif en relation avec la théorie des catégories, malheureusement, si un foncteur est facilement définissable, un objet l'est moins. Tu peux par exemple lire Roland Barthes sur la sémantique de l'objet, qui après des pages et des pages, en arrive à une conclusion particulière, l'objet est indéfinissable.
Si les définitions du spectre d'action des objets étaient vraiment limité à de l'imbrication de fonctions, ce serait effectivement évident et facile malheureusement, dans les langages moches, comme Java, on rajoute une couche de complexité drastique (développement par l'abstraction pour la spécialisation, soit, un paradoxe, et le polymorphisme add hoc, au moyen des interfaces), soit dans des langages plus honnête, par exemple, python/ruby qui propose des mécanismes d'héritages transversales, des routines de décorations très très complexes.