Ein Framework (englisch für Rahmenstruktur) ist ein Programmiergerüst, das in der Softwaretechnik eingesetzt wird – insbesondere in der objektorientierten Softwareentwicklung sowie in komponentenbasierten Ansätzen.
Ein Framework ist kein eigenständiges Programm, sondern stellt eine Struktur bereit, innerhalb derer Entwickler Anwendungen erstellen. Durch die im Framework verwendeten Entwurfsmuster beeinflusst es typischerweise auch die Architektur der entstehenden Software. So unterstützen etwa die Microsoft Foundation Classes das Model-View-Controller-Muster.
Ralph E. Johnson und Brian Foote beschrieben ein Framework 1988 im Artikel Designing Reusable Classes im Journal of Object-Oriented Programming als:
„Ein Framework ist eine semi-vollständige Applikation. Es stellt für Applikationen eine wiederverwendbare, gemeinsame Struktur zur Verfügung. Die Entwickler bauen das Framework in ihre eigene Applikation ein und erweitern es derart, dass es ihren spezifischen Anforderungen entspricht. Frameworks unterscheiden sich von Toolkits dahingehend, dass sie eine kohärente Struktur zur Verfügung stellen, anstatt einer einfachen Menge von Hilfsklassen.“
Frameworks geben in der Regel die grundlegende Anwendungsarchitektur vor. Charakteristisch ist dabei die (Inversion of Control) (Umkehrung der Steuerung): Programmierer registrieren konkrete Implementierungen, die anschließend vom Framework aufgerufen und verwaltet werden. Wird diese Registrierung nicht im Quellcode festgelegt, sondern extern konfiguriert, spricht man von Dependency Injection.
Ein Framework definiert insbesondere den Kontrollfluss einer Anwendung sowie die Schnittstellen, die konkrete Klassen implementieren müssen. Es dient damit der Wiederverwendung bewährter architektonischer Muster. Da solche Muster stets auf eine bestimmte Problemdomäne zugeschnitten sind, sind Frameworks meist domänenspezifisch oder auf bestimmte Anwendungstypen beschränkt – etwa grafische Editoren, Buchhaltungssysteme oder Webshops.
Eine allgemeingültige Definition existiert nicht, da Frameworks sehr unterschiedlich ausgeprägt sein können. Der Begriff wird daher häufig unscharf verwendet; mitunter werden bereits umfangreiche Klassensammlungen als Framework bezeichnet.
Die Unterscheidung zwischen White-Box- und Black-Box-Frameworks bezieht sich auf die Sichtbarkeit und Zugänglichkeit der Implementierung hinter einer Schnittstelle.
Einige Autoren unterscheiden zusätzlich zwischen White-Boxes (Erweiterung möglich) und Glass-Boxes (nur Einsicht möglich).
Frameworks lassen sich – ohne strikte Abgrenzung – in folgende Kategorien einteilen:
Aufgrund der uneinheitlichen Begriffsverwendung ist die Zuordnung einzelner Systeme nicht immer eindeutig. Beispiele sind: