Stáhněte si archiv s projektem Arithmetic.
V projektu je kostra konzolové aplikace, která realizuje aritmetické operace. Uživatel si v konfiguračním souboru appsettings.json vybere, se kterými objekty a se kterou aritmetikou chce pracovat. Po spuštění aplikace uživatel zadává dvojice objektů zvolené aritmetiky (např. dvojice celých čísel, dvojice komplexních čísel apod.). Program mu po zadání obou objektů zobrazí výsledek tří operací, v nichž tyto objekty použije jako operandy:
Aplikace používá reflexi a návrhový vzor Factory Method, případně Abstract Factory. V aplikaci není třeba nikde uvádět "natvrdo v kódu" typ objektů a typ aritmetiky, které se mají použít. Toto stačí udělat v konfiguračním souboru, čili lze snadno změnit chování appky podle konfigurace, aniž by byla nutná její rekompilace.
Pokud bychom aplikaci rozdělili na 2 různé moduly (modul s uživatelskou funkcionalitou a modul s implementací aritmetiky a definicí jejích objektů), bylo by teoreticky možné přidávat nové aritmetiky bez nutnosti rekompilace hlavní aplikace, to ovšem za předpokladu, že bychom zachovali název assembly, ve které jsou interface IArithmetic a implementace aritmetik a jejich objektů definovány.
Tato aplikace ilustruje ještě několik dalších standardních postupů. Například načtení konfigurace z textového souboru ve formátu JSON. Na to bylo potřeba přidat 2 nugetové balíčky (pozor, přestože zatím pracujeme s verzí .NET 5.0, pro správnou funkčnost byly tyto nugety staženy ve verzi 6.0.0):
Balíček Json je potřeba pro parsování souboru appsettings.json, balíček Binder se používá pro namapování konfigurace na objektovou strukturu (viz třída Settings).
Pokud jde o zdrojový kód, klíčová část projektu leží v rozhraní IArithmetic. Toto rozhraní definuje, které aritmetické operace očekáváme od tříd, jež nám nějakou aritmetiku chtějí nabídnout. Jedná se o metody:
Dále jsou v projektu implementované tři vzorové aritmetiky: celočíselná, reálná a komplexní. Každá aritmetika dává do souvislosti dvě třídy: Třídu aritmetiky, která musí implementovat již zmíněné rozhraní IArithmetic, a třídu objektů aritmetiky, která definuje, nad jakými operandy (objekty jakého typu) jsou příslušné aritmetické operace definovány. Toto je vidět v následující tabulce:
Třída aritmetiky | Třída objektů aritmetiky | Poznámka |
---|---|---|
Int32Arithmetic (ArithmeticCon.Arithmetics.Int32Arithmetic) | int (System.Int32) | Pracuje nad celými čísly |
DoubleArithmetic (ArithmeticCon.Arithmetics.DoubleArithmetic) | double (System.Double) | Aritmetika nad reálnými čísly |
ComplexArithmetic (ArithmeticCon.Arithmetics.ComplexArithmetic) | Complex (ArithmeticCon.BusinessObjects.Complex) | Aritmetika nad komplexními čísly |
Cílem cvičení je vyzkoušet všechny výše uvedené aspekty aplikační architektury.
Vyberete si jednu z následujících tříd objektů aritmetiky a definujete ji (pokud není definována v .NETu, jako je tomu např. u System.Int32). Dále k této třídě objektů aritmetiky (definičnímu oboru a oboru hodnot) definujete vlastní aritmetiku (třídu, která implementuje rozhraní IArithmetic).
Typ objektů aritmetiky | Typ aritmetiky | Popis | Operace sčítání | Operace odčítání | Operace násobení | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
string (System.String) | StringArithmetic | Aritmetika řetězců | Např. "Ahoj " + "mami!" ---> "Ahoj mami!" | Např. "Ahoj" - "hola" ---> "Aj" (odstraní z prvního operandu znaky, které najde ve druhém operandu) | Např. "abc" * "EF" ---> "aEaFbEbFcEcF" (spojí každý znak z prvního operandu s každým znakem z druhého operandu) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Set | SetArithmetic | Množinová aritmetika (sjednocení jako sčítání, množinový rozdíl jako odčítání a kartézský součin jako násobení) | Např. {1, 2, 5} + {2, 3} ---> {1, 2, 3, 5} | Např. {1, 2, 5} - {2, 3} ---> {1, 5} | Např. {1, 2, 5} * {2, 3} ---> {(1, 2), (1, 3), (2, 2), (2, 3), (5, 2), (5, 3)} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Matrix | MatrixArithmetic | Aritmetika nad čtvercovými maticemi NxN, v příkladech je N=2 |
+
=
|
-
=
|
*
=
|
Můžete si případně i vymyslet vlastní (jiný) typ objektů aritmetiky, než ty, které jsou obsažené v nabídce.
Důležitá poznámka:
Vzhledem k tomu, jak je aplikace navržena, je potřeba aby:
Metoda Parse je dalším příkladem tovární metody.