Skip to content

Yo-yo Problem

A single object's inherited call path repeatedly crosses class levels, making its behavior difficult to reconstruct from any one method definition.

Version
v1 · 2026-10-25 · History
Domain-specific #
14456
Domain group
Applied Sciences & Engineering
Origin domain
Computer Science & Software Engineering
Subdomains
Object Oriented Design, Software Testing → Computer Science & Software Engineering
Aliases
Yoyo problem, Yo-yo effect in inheritance

Core Idea

A yo-yo problem occurs when understanding one object-oriented operation requires following its calls among method definitions at several levels of an inheritance hierarchy.[1] A call from an ancestor may select a descendant override, and the resulting path can move back through inherited methods.[2][3] The reader has to combine several class definitions to explain what happens for a particular receiver.[1][2][3]

The name describes this path-tracing difficulty. It does not require infinite recursion or a fixed number of levels.[1][2][3] Barbey's Ada example recurs indefinitely; Tyler's separate Java example provides a finite cross-level trace.[2][3]

Scope of Application

Use the label for an object-oriented program when inherited method selection makes the behavior of a chosen receiver and entry operation hard to reconstruct from one method body. A deep class hierarchy alone is not enough. The path may be difficult for one operation and straightforward for another.

The two source-worked examples are constructed illustrations in Ada 95 and Java.[2][3] They establish that the mechanism can occur in different language systems, not its frequency or measured cost in deployed software.

Clarity

Start with the runtime receiver and entry method. At each call, ask which class owns the selected method body and why dispatch or an ancestor call selects it. Record the order of definitions visited. This keeps the diagnosis about the actual inherited call path instead of treating every override as a problem.

A correctness failure is a separate finding. Barbey's particular program enters a nonterminating recurrence, while Tyler traces a finite path.[2][3]

Manages Complexity

The label narrows a large class diagram to the receiver, the relevant method bodies, and the transitions among them. Tyler's instrumented tracking subclass produces a graph of calls and returns for a chosen target class.[3] A trace for one receiver does not establish the path for every other receiver or branch.

Abstract Reasoning

Write down (hierarchy, receiver, entry method) and trace the method bodies selected by the program's dispatch rules. Mark each body's class. If the path repeatedly crosses ancestor and descendant levels, and reconstructing the operation requires joining those definitions, the yo-yo diagnosis fits. The pattern has no source-established numeric depth threshold.

Knowledge Transfer

The useful transfer is between object-oriented languages and tasks. Ada tagged types and Java subclasses use different selection details, but both require the reader to trace inherited definitions for a chosen receiver.[2][3] An unrelated search across documents may feel like “bouncing” but lacks the inherited method relation, so it is only an analogy.

Examples

Ada 95. Barbey's Three receiver passes through implementations in Three, Two, and One; the worked path then repeats a group of states and fails to terminate.[2] The receiver, inherited definitions, and cross-level selections all matter to predicting the result.

Java. Tyler's five-class example starts an invocation of a() on a C5 receiver at the inherited C4.a() body.[3] His instrumented TC5 tracking subclass records the finite cross-level call graph.[3] C5 is the original target class; TC5 is the tracking subclass.[3] Tyler corrects errors in an earlier hand-drawn graph.[3]

Relationships to Other Abstractions

Local relationship map for Yo-yo ProblemParents appear above the current abstraction, mutual partners to the right, and children below. Node labels state whether each abstraction is prime or domain-specific; colors identify relation types.Yo-yo ProblemDOMAINDomain-specific abstraction: Control flow — presupposesControl flowDOMAINPrime abstraction: Inheritance — presupposesInheritancePRIME

Current abstraction Yo-yo Problem Domain-specific

Parents (2) — outgoing typed relations

  • Yo-yo Problem presupposes Control flow Domain-specific

    A yo-yo diagnosis requires an executable receiver-specific call path whose possible successors are determined by transfer and dispatch semantics.

  • Yo-yo Problem presupposes Inheritance Prime

    Cross-level method selection requires lineage-based default carry-over with selective descendant override or extension.

Hierarchy paths (2) — routes to 2 parentless roots

Neighborhood in Abstraction Space

Yo-yo Problem sits in a sparse region of the domain-specific corpus (74th percentile for distinctiveness): few abstractions share its structure, so a faithful description tends to retrieve it precisely.

Family — Unclustered & Miscellaneous (2769 abstractions)

Nearest neighbors

Computed from structural-signature embeddings · 2026-10-25

Not to Be Confused With

  • Deep inheritance by itself: a structural feature that does not prove a bouncing call path.

  • Infinite recursion: one possible outcome in Barbey's example, not part of the definition.[2]

  • Refused bequest: a failure to honor an inherited obligation; a yo-yo path can exist while contracts are intact.

  • A generic code smell: the selected path and comprehension task can be identified without inferring a separate hidden design defect.

  • Exponential yo-yo: Sakkinen's multiple-inheritance extension multiplies invocations and creates a correctness anomaly, distinct from the ordinary comprehension problem.[1]

The typed catalog records two strict prerequisites. Control Flow supplies the executable successor path for the chosen receiver; Inheritance supplies lineage-based method carry-over and selective override. Remove either relation and this specific diagnosis loses part of its mechanism. These are separate curator inferences from the worked source cases, not claims that the authors proposed ontology edges.

References

[1] Markku Sakkinen, “A Critique of the Inheritance Principles of C++”, Computing Systems 5, no. 1 (1992), §5.6, printed pp. 102–103 / one-based PDF pp. 34–35. Original full paper inspected. Sakkinen describes the ordinary yo-yo lookup problem and distinguishes his exponential multiple-inheritance anomaly; he attributes the name to Taenzer and colleagues, whose exact 1989 wording was not independently verified. registry ↩a ↩b ↩c ↩d

[2] Stéphane Barbey, Test Selection for Specification-Based Unit Testing of Object-Oriented Software Based on Formal Specifications, EPFL doctoral thesis no. 1753 (1997), §3.2.4.2 and Fig. 37, printed p. 91. Author thesis text and figure code available in the hosted full-text rendering; original PDF pixels were not independently checked. The One/Two/Three program is a constructed testing example. registry ↩a ↩b ↩c ↩d ↩e ↩f ↩g ↩h ↩i

[3] Benjamin James Tyler, Specification and Runtime Monitoring of Object-Oriented Systems, Ohio State University dissertation (2006), chapter 4, especially Fig. 4.2 (one-based PDF pp. 112–114), discussion of Binder-drawing errors (PDF p. 110), and generated Fig. 4.7 (PDF p. 122). Original dissertation PDF inspected. The C1–C5 hierarchy is a constructed example, not an observed production case. registry ↩a ↩b ↩c ↩d ↩e ↩f ↩g ↩h ↩i ↩j ↩k ↩l