SOLID

A Wikipédiából, a szabad enciklopédiából

Az objektumorientált programozásban a SOLID egy mozaikszó, amely az öt tervezési alapelv (Single responsibility principle, Open/closed principle, Liskov substitution principle, Interface segregation principle, Dependency inversion principle) kezdőbetűjéből áll, és célja, hogy a szoftvertervezést még érthetőbbé, rugalmasabbá és karbantarthatóbbá tegye. A SOLID-nak nincs közvetlen köze a felelősségek hozzárendelésének általános mintáihoz (General Responsibility Assignment Software Patterns, GRASP). A SOLID alapelvek szülőatyja Robert Cecil Martin amerikai szoftverfejlesztő és -tanácsadó, aki nem csak a Clean Code mozgalom vezérszónoka, hanem többek között az agilis szoftverfejlesztés módszertanát elindító Agile Manifesto egyik eredeti megfogalmazója is. Az elméletét Design Principles and Design Patterns[1][2] című könyvében mutatta be, de mint mozaikszó csak később Michael Feathers révén terjedt el.

Összetevők[szerkesztés]

Egyetlen felelősség elve – Single Responsibility Principle[3]
Egy osztály vagy modul csak egyetlen felelősséggel rendelkezzen (azaz: egy oka legyen a változásra).
Azaz minden elkülönítve is értelmezhető funkció illetve felelősségi kör kezelése kerüljön külön osztályba vagy modulba.
Nyílt/zárt elv – Open/Closed Principle[4]
Egy osztály vagy modul legyen nyílt a kiterjesztésre, de zárt a módosításra.
Azaz a funkcionalitás bővítéséhez ne legyen szükség az osztály forráskódjának módosítására, ehelyett legyen mód leszármazással vagy kompozíción keresztül kiterjeszteni a meglévő implementációt.
Liskov helyettesítési elv – Liskov substitution principle[5]
Minden osztály legyen helyettesíthető a leszármazott osztályával anélkül, hogy a program helyes működése megváltozna.
Azaz garantáljuk, hogy egy adott (akár absztrakt) típussal átvett objektum teljesíti, amit a típustól elvárunk. Azaz típusörökléskor a leszármazottnak továbbra is megegyező módon támogatnia kell a felmenői által biztosított funkciókat. Árnyalja a képet, hogy a Java-világban elterjedt az opcionálisan implementálható metódusok használata, alapvetően az API egyszerűségének megőrzése érdekében. Ilyenkor az interfész technikailag ugyan tartalmazza az adott metódust, ám az implementációknak nem kötelező támogatniuk.
Interfész elválasztási elv – Interface segregation principle[6]
Az interfészek szétválasztásának elve: egyetlen kliens se legyen rákényszerítve arra, hogy olyan eljárásoktól függjön, amelyeket nem is használ.
Ez a gyakorlatban általában azt jelenti, hogy egy átvett paraméter típusa lehetőleg arra legyen specializálva, amilyen művelet(ek)et ténylegesen elvégzünk rajta. Az ilyen célra kialakított legáltalánosabb interfészek gyakran tartalmazzák az „-able” végződést (pl. Comparable, Iterable stb.).
Függőség megfordítási elv – Dependency inversion principle[7]
A magas szintű modulok ne függjenek az alacsony szintű moduloktól. Mindkettő absztrakcióktól függjön.
Tehát az alacsonyabb szint legyen egy API megvalósítása, a magasabb szint pedig ezen az API-n keresztül használja.

Jegyzetek[szerkesztés]

  1. Robert C. Martin: Getting a SOLID start. objectmentor.com . [2016. december 26-i dátummal az eredetiből archiválva]. (Hozzáférés: 2013. augusztus 19.)
  2. Robert C. Martin: Design Principles and Design Patterns. [2015. szeptember 6-i dátummal az eredetiből archiválva].
  3. Egy felelősség alapelve Single Responsibility Principle. objectmentor.com . [2015. június 1-i dátummal az [https://hu.wikipedia.org/wiki/Egy_felelősség_alapelve eredetiből archiválva].
  4. Open/Closed Principle. objectmentor.com . [2015. szeptember 5-i dátummal az eredetiből archiválva].
  5. Liskov Substitution Principle. objectmentor.com. [2015. szeptember 5-i dátummal az eredetiből archiválva].
  6. Interface Segregation Principle. objectmentor.com , 1996 [2015. szeptember 5-i dátummal az eredetiből archiválva].
  7. Dependency Inversion Principle. objectmentor.com. [2015. szeptember 5-i dátummal az eredetiből archiválva].

Források[szerkesztés]

Fordítás[szerkesztés]

  • Ez a szócikk részben vagy egészben a SOLID című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.