Provenance Manifesto
arrow_back Back to Blog

Agentic-Oriented Programming vs Object-Oriented Programming

Yauheni Kurbayeu

Table of Contents

expand_more

Agentic-Oriented Programming vs. Object-Oriented Programming

Agentic-Oriented Programming vs Object-Oriented Programming

Author: Yauheni Kurbayeu
Published: March 23, 2026

Why AI systems are not just “better objects” — and what replaces them

For decades, Object-Oriented Programming (OOP) has shaped how we design software systems. We think in classes, structure behavior into methods, and rely on encapsulation to manage complexity. The underlying assumption has always been stability: given the same input, the system produces the same output.

That assumption is now breaking.

With the rise of agentic systems, we are no longer dealing with components that simply execute predefined logic. We are dealing with entities that interpret, decide, and adapt. At first glance, it is tempting to describe agents as “smarter objects.” But that framing quickly falls apart once you examine how these systems actually behave.

This is where Agentic-Oriented Programming (AOP) begins—not as a replacement for OOP, but as its evolutionary continuation under fundamentally different constraints.


The Structural Mapping

OOP Agentic
Class Agent role
Object Agent instance
Method Skill / tool
Function call Task invocation
Interface Prompt / schema
Encapsulation Context boundary
Inheritance Skill composition
Polymorphism Model/tool switching

This mapping is useful, but only up to a point. It gives us a shared vocabulary, not a shared execution model. The deeper you go, the more the assumptions behind each concept start to diverge.


Determinism vs Interpretation

In OOP, behavior is defined upfront. A method encodes a specific algorithm, and execution follows a predictable path. If a function receives a certain input, it produces a known output. Bugs are deviations from expected behavior, and they can be traced, reproduced, and fixed.

In agentic systems, behavior is not fully predefined. When an agent receives a task, it interprets intent rather than executing a strict instruction. It may decide to call a tool, reformulate the problem, or even ask for clarification. Two identical inputs can lead to slightly different outputs depending on context, memory, or reasoning strategy.

Consider a simple example. In OOP, calling a pricing method like:

price = calculator.calculate_total(items)

will always follow the same logic path. In an agentic system, invoking a similar capability may involve selecting between multiple strategies, validating assumptions, and dynamically choosing tools before producing an answer. The invocation is not just execution—it is a decision process.


Class vs Agent Role

A class in OOP defines structure and behavior. It is a blueprint. Every instance created from that class behaves according to the same predefined logic.

An agent role, by contrast, defines responsibility rather than exact behavior. A "Code Review Agent" does not contain a fixed algorithm for reviewing code. Instead, it operates within a goal space: identify issues, suggest improvements, enforce standards. How it achieves that can vary from run to run.

For example, one invocation might focus on readability, another on performance, and another on architectural consistency. The role constrains intent, but not execution details.


Object vs Agent Instance

An object is an instance of a class with a well-defined state. Its behavior is predictable because it is bound by the class definition.

An agent instance carries state as well, but that state includes context, memory, and sometimes history of prior interactions. Two instances of the same agent role may behave differently because their context differs.

Imagine two "Support Agent" instances. One has access to a full customer history, previous tickets, and product usage data. The other operates with minimal context. Even though they share the same role, their outputs will diverge significantly. The variability is not a bug—it is part of the system design.


Method vs Skill / Tool

In OOP, a method is a deterministic unit of behavior. It performs a clearly defined function.

In agentic systems, a skill or tool is a capability that an agent may choose to use. The key difference is that the agent decides when and how to use it.

For example, a "search" tool might be available. One agent invocation may use it immediately. Another may attempt reasoning first and only fall back to search if uncertainty is high. A third may combine multiple tools before producing a result.

The capability exists, but its execution is conditional and context-dependent.


Function Call vs Task Invocation

A function call in OOP is explicit and direct. The caller knows exactly which function is executed.

A task invocation in an agentic system is more abstract. You provide a goal, and the system determines the execution path.

For instance, calling a function like:

generate_report(data)

is straightforward. In an agentic system, invoking "generate a report" may involve data validation, retrieval of additional context, formatting decisions, and iterative refinement before producing the final output. The invocation becomes a mini workflow rather than a single step.


Interface vs Prompt / Schema

In OOP, interfaces define contracts in strict, formal terms. They specify exactly what methods are available and how they should be used.

In agentic systems, prompts or schemas act as contracts, but they are more flexible. They guide behavior rather than enforce it strictly. Structured schemas can reduce ambiguity, but natural language instructions still leave room for interpretation.

For example, an interface guarantees that a method exists and behaves in a certain way. A prompt, however, suggests how an agent should behave, but the final execution depends on how the agent interprets it.


Encapsulation vs Context Boundary

Encapsulation in OOP protects internal state and hides implementation details. It ensures that only controlled access is allowed.

In agentic systems, the equivalent concept is the context boundary. Instead of protecting variables, we control what information the agent can see.

This becomes critical because context directly influences behavior. Too much context introduces noise. Too little context leads to incorrect reasoning. Incorrect context leads to incorrect decisions.

For example, an agent generating code without knowledge of system architecture may produce valid but incompatible components. The boundary of context defines the boundary of correctness.


Inheritance vs Skill Composition

Inheritance in OOP allows classes to extend behavior from parent classes. It creates structured hierarchies and promotes reuse.

Agentic systems rely less on inheritance and more on composition. Instead of extending a base class, systems orchestrate multiple agents or combine multiple skills.

A workflow might involve a planning agent, a coding agent, and a testing agent. Each contributes a piece of the solution, and their outputs are combined. The structure is not hierarchical—it is compositional and dynamic.


Polymorphism vs Model/Tool Switching

Polymorphism allows OOP systems to use a common interface with different implementations.

Agentic systems achieve a similar effect through model or tool switching. The same task can be executed using different reasoning engines, models, or external tools.

For example, an agent solving a problem may use a large language model in one case, a specialized API in another, or a cached result in a third. The interface remains consistent, but the execution strategy changes dynamically.


Control Flow: From Execution to Exploration

Traditional OOP systems follow explicit control flow. Developers define the sequence of operations, and the system executes them step by step.

Agentic systems introduce a different pattern. Instead of following a fixed path, they iterate through cycles of planning, acting, observing, and refining. The system explores possible solutions rather than executing a single predefined path.

This makes the system more adaptable, but also less predictable. Control shifts from static code to dynamic reasoning loops.


The Missing Layer: Decisions

There is a deeper issue that neither paradigm fully addresses on its own.

In OOP, decisions are embedded in code. They are implicit and static. Once implemented, they are rarely revisited explicitly.

In agentic systems, decisions are made continuously, but they are often not recorded in a structured way. An agent may choose a strategy, make assumptions, or resolve ambiguity, but those decisions are typically lost in transient execution.

This leads to a critical gap. You can observe what the system did, but not why it did it.


Toward a New Layer

If OOP systems can be described as combinations of objects, methods, and state, and agentic systems as combinations of agents, skills, context, and goals, then something is still missing.

What is missing is a structured representation of decisions.

When decisions become first-class entities, systems gain the ability to explain themselves, to evolve safely, and to maintain consistency over time. Instead of relying on logs or chat history, they can build a traceable graph of reasoning.

This is not a small enhancement. It is a necessary layer for systems where behavior is no longer fully deterministic.


Final Thought

We are not simply extending OOP. We are moving into a paradigm where execution is no longer guaranteed to follow a predefined path, and correctness is no longer ensured by construction.

Agentic-Oriented Programming introduces flexibility, adaptability, and the ability to operate under uncertainty. But it also introduces new risks: loss of traceability, inconsistency, and hidden decision-making.

To make these systems reliable, we need to evolve our mental models once again.

Not just toward agents.

But toward systems that can remember, explain, and govern their own decisions.

arrow_back Back to Blog