V reálu to vypadá stejně a také funkčnost je prakticky stejná. V C# se to liší velikostí písmene, v PHP se to neliší vůbec. Je otevřené další rozhraní zvenku do objektu, zapouzdření je porušeno. Přimhouříme oko a prohlásíme, že porušeno není.
Ne, není potřeba přivírat oči, je to naprosto korektní. Podívejte se, jak je zapouzdření formalizováno - nejjednodušší je to
na modulech, těžší pak
na objektech, a uvidíte, že se nic neporušilo. Ve zkratce: před vnějším světem se schová (zapouzdří) část objektu (v odkazovaných materiálech pomocí existenciálních typů) a vnější svět přistupuje pouze k neschovaným částem, přičemž gettery ani settery to nijak nenarušují.
- Změním typ atributu. Musím změnit getter i setter
- Změním typ vstupní hodnoty. Musím změnit setter
- Změním typ výstupní hodnoty. Musím změnit getter
Tři různé požadavky, tři změny. SRP se v principu nekoná, ale opět přimhouříme oko a řekneme, že to SRP vyhovuje.
Ta třída má jen jednu odpovědnost a to držení dat. Gettery a settery slouží k tomu, abychom v té třídě ta data mohli držet. Mj. můžete si představit třeba automaticky implementované vlastnosti v F# nebo C#, kde ten typ je pouze na jednom místě.
Anemické třídy raději obhajovat nebudeme, že?
Ale ano. Ve funckionálních jazycích, i moderních OO jazycích jako je Scala a F# se to normálně používá a je to užitečné (viz třeba můj příklad). Navíc
o přidání podpory pro anemické třídy uvažoval i C# - př.:
abstract class Expr;
record class X() : Expr;
record class Const(double Value) : Expr;
record class Add(Expr Left, Expr Right) : Expr;
record class Mult(Expr Left, Expr Right) : Expr;
record class Neg(Expr Value) : Expr;