Cvičení - dynamická reflexe

Reflexe

SSŠVT


Dynamické použití reflexe (cvičení)

Intro

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:


Návrhové vzory

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.


Konfigurace

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).


Rozhraní IArithmetic

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:

  1. object Add(object operand1, object operand2)
  2. object Subtract(object operand1, object operand2)
  3. object Multiply(object operand1, object operand2)

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

Zadání úlohy

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
12
34
+
1011
1213
=
1113
1517
12
34
-
1011
1213
=
-9-9
-9-9
12
34
*
1011
1213
=
3437
7885

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.