Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
OpublikowałZuzanna Czyż Został zmieniony 9 lat temu
1
Komponentowe i rozproszone Komponenty i zależności
2
Moduł Obecne rozwiązania pozwalają łatwo dzielić kod na moduły Nie utrudnia to kompilacji, relatywnie łatwo zmienić rozmieszczenie klas itd (zmiana przestrzeni nazw?). Serwery CI pozwalają wykrywać niespójności pomiędzy modułami Nie ma dużej różnicy czy dostarczamy program w postaci 1 pliku wykonywalnego czy grupy plików. Na potrzeby instalacji można scalić kilka assemblies w jedno np. (exe+dll-ki -> exe) Na poziomie kodu i tak dążymy do rozluźnienia zależności między klasami, użycie różnych assemblies jest właściwie “bezbolesne” Rozwiązania typu kontenery DI pozwalają na rozluźnienie zależności między klasami
3
Komponent Co jeżeli chcemy dostarczać poszczególne moduły oddzielnie? Jak testować komponent, który może być używany w kilku systemach/aplikacjach? Co jeżeli każdy użytkownik chce mieć swoje zmiany ? Co jeżeli zmiana zaindukowana przez jeden system wymusza testowanie kodu ze wszystkimi? Czy przy każdej zmianie trzeba testować wszystkich użytkowników ?
4
Komponenty vs. moduły Moduł – biblioteka ? – podział raczej widoczny w czasie wytwarzania Komponent Jest dostarczany niezależnie ma indywidualny cykl życia/testowania itd Poszczególni użytkownicy mogą używać swoich wersji. Mogą się “przesiąść” na nowszą wersję w wybranym, dogodnym momencie (jak robią własne zmiany) Można wersjonować komponenty na poziomie binarnym
5
Podział na komponenty REP: The Reuse/Release Equivalency Principle: The granule of reuse is the granule of release. Only components that are released through a tracking system can be effectively reused. This granule is the package. CRP: Common Reuse Principle:The classes in a package are reused together. if you reuse one of the classes in a package, you reuse them all. CCP: Common Closure Principle:The classes in a package should be closed together against the same kinds of changes. a change that affects a package affects all the classes in that package. Robert C. Martin
6
Komponent CRP: podział dla uniknięcia zbędnych wydań REP: Grupowanie dla reużycia CCP: Grupowanie dla potrzeb utrzymania Zbędne wydania Zmiany rozproszone między komponentami Niewygodne (re)użycie Kompo- nent Granice podziału determinują częstość wydań, wygodę wytwarzania i korzystania z komponentu
7
Zależności Rodzaje zależności: (Afferent) - kto zależy (Efferent) – od kogo zależy class X { … Y field; } class Y { … } afferent efferent
8
Zależności między modułami Acyclic Dependencies Principle: the dependency structure between packages must be a directed acyclic graph (dag). that is, there must be no cycles in the dependency structure. Stable Dependancies Principle: the dependencies between packages in a design should be in the direction of the stability of the packages. A package should only depend upon packages that are more stable that it is. Stable Abstractions Principle: packages that are maximally stable should be maximally abstract. instable packages should be concrete. The abstraction of a package should be in proportion to its stability. Robert C. Martin
9
Miara zależności C A (X) = liczba funkcji/klas/modułów, które zależą od (odwołują sie do) X C E (X) = liczba funkcji/klas/modułów do których odwołuje się X N = liczba typów N A = liczba typów abstrakcyjnych Niestabilność: I =C E / (C A + C E ) Abstakcyjność: A=N A /N
10
Stabilność Moduły stabilne (trudne do zmiany) nie powinny zależeć od niestabilnych (łatwych do zmiany) Co jest łatwe do zmiany? Klasy finalne, do których niewiele kodu się odwołuje. Co jest trudne do zmiany? Klasy finalne, do których odwołuje się dużo kodu, klasy bazowe, interfejsy. Co zmienia się często: klasy konkretne, implementacje logiki biznesowej Co zmienia się rzadko: abstrakcje – interfejsy, klasy abstrakcyjne
11
Optymalna sytuacja A1A1 1 I Strefa bólu: klasy konkretne, b. często używane w kodzie Strefa braku użyteczności: klasy abstakcyjne, z których nikt nie korzysta Klasy czysto abstrakcyjne o dużej stabilności Klasy konkretne o małej stabilności Miara pot. problemów: D = |A+I-1|
12
Wiecej nt. komponentów Robert C. Martin - Clean Design, Components Principles.wmv
13
TECHNIKALIA Jak to się robi w.Net, czyli
14
.Net CLI pozwala na wykorzystywanie kodu napisanego w dowolnym języku wspierającym.NET Zarządzalne biblioteki w połączeniu z refleksją pozwalają na łatwe użycie kodu na poziomie binarnym (CL) Wersjonowanie pozwala na jednoczesne użycie różnych wersji tej samej biblioteki Na poziomie systemowym można rejestrować biblioteki w GAC
15
.NET Podzespoły (assemblies) Logiczny zbiór wyników kompilacji jednego lub więcej projektów Może mieć formę EXE, DLL Wydzielone binaria, pliki z zasobami, manifest Definiowanie podzespołu: AL.EXE (ILDASM.EXE) IDE
16
.NET Manifest Definiuje obiekty wchodzące w skłąd podzespołu Może określać kulturę (język, formaty, itd) Może zawierać klucze publiczne Może zawierać prywatne atrybuty (ignorowane przez CLR) Może określać wymagany/pożądany CLR
17
.NET wdrażanie podzespołów Podzespoły mogą być współdzielne i mogą współdzielić pliki Najprostsza postać to pliki w jednym katalogu (nie wymagane żadne wpisy do rejestru) Brak ew. konfliktów Pot. multiplikacja bibliotek Współdzielenie zasobów: GlobalAssemblyCache (GACUTIL.EXE, AssemblyCacheViewer) Wymaga silnych nazw: Nazwa+fragment klucza publicznego SN.exe -> plik.snk -> project
18
.NET Wersjonowanie Alternatywa dla piekła DLLi „Docelowy plik jest nowszy niż kopiowany. Czy kontynuować ?” (90% - TAK) Manifest zawiera informację o wersji Główny i drugorzędny numer wersji Numer kompilacji Numer korekty Manifest zawiera wersję informacyjną CLR próbuje znaleźć wersje podzespołów wymagane lub dopuszczane przez klienta
19
Uprzedzajac fakty Komponent ≠ Serwis
20
Rozszerzalna architektura z MS Kontenery IoC/DI Wiele dostępnych rozwiązań Decoupling, testowanie, scentralizowana rejestracja, MEF Wprowadzony w.Net 4.0 Discovery, obsługa metadanych, opóźniona kreacja
21
MEF - koncepcja
22
MEF – Podstawowe pojęcia Export Export dla typu/funkcji/pól Wymuszony typ: Export(typeof(Ixxx)) Nazwany kontrakt: Export("name",typeof(Ixxx)) Export nie jest dziedziczony – można użyć InheritedExport Import Dla typu określonego w kodzie Import określonego typu/kontraktu
23
MEF – Zalecane praktyki Imort/Eksport Interfejsów zamiast konkretnych typow Stałe jako nazwy kontraktow stale/i kontrakty w oddzielnych assembly
24
.Net vs Java …. JNBridge IKVM WebServices ?
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.