Upload
rufina
View
28
Download
0
Embed Size (px)
DESCRIPTION
z. z. Nowoczesne tworzenie projektów w .Net. Andrzej „ Siranen ” Piotrowski [email protected] www.anens.pl UPPoznan.Net User Experiance /Designer. Agenda. Design i Design Pattern jako marka Wzorce Projektowe Design Patterns & Best Practices and Paterns - PowerPoint PPT Presentation
Citation preview
Andrzej „Siranen”„Siranen” [email protected]
User Experiance/Designer User Experiance/Designer
z
z
Nowoczesne Nowoczesne tworzenie tworzenie projektów w projektów w .Net.Net
Design i Design Pattern jako markaDesign i Design Pattern jako markaWzorce Projektowe Wzorce Projektowe Design Patterns & Best Practices and Design Patterns & Best Practices and
Paterns Paterns A) A) Microsoft Enterprise LibraryMicrosoft Enterprise Library((MGRMGR))*Test-driven development (TDD)*Test-driven development (TDD)B) Model View Presenter (MVP) B) Model View Presenter (MVP) WPFWPFC) Model View ViewModel (MVVM) C) Model View ViewModel (MVVM) WPFWPFD) Model View Controler (MVC)D) Model View Controler (MVC)ASP.NET ASP.NET
MVCMVCPodsumowaniePodsumowanie
AgendaAgenda
Design PatternDesign Pattern
=
SSRP—Single Responsibility PrincipleRP—Single Responsibility Principle OOCP—Open Closed PrincipleCP—Open Closed Principle LLSP—Liskov Substitution PrincipleSP—Liskov Substitution Principle IISP—Interface Segregation PrincipleSP—Interface Segregation Principle DDIP—Dependency Inversion PrincipleIP—Dependency Inversion Principle
SOLIDSOLID
Podziel problem na Podziel problem na mniejsze mniejsze podproblemypodproblemyPodziel podproblemy na Podziel podproblemy na pod-pod-podproblemypodproblemy
public class Operation{ private OperationType type; public OperationType Type { get { return this.type; } } private decimal amount; public decimal Amount { get { return this.amount; } set { this.amount = value; } } public Operation (OperationType type) { this.type = type; }}
Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.
public void Execute ( Operation[] operationList ){ for ( int i = 0; i < operationList.Length; i++) { Operation operation = operationList[i]; if ( operation.Type == OperationType.Income ) { ProcessIncome( operation ); } else if ( operation.Type == OperationType.Outcome ) { ProcessOutcome ( operation ); } else if ( operation.Type == OperationType.Transfer ) { ProcessTransfer( operation ); } }}
Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.
Klasa powinna być otwarta na rozszerzanie, ale zamknięta na modyfikacje.
public interface IOperation{ void Calculate();}
public void Execute( IOperation[ ] operationList ){ for ( int i = 0; i < operationList.Length; i++ ) { IOperation operation = operationList[i]; operation.Calculate(); }}
void przetwarzajFigurę(Figura iFigura) { if(typeid(iFigura) == typeid(Prostokąt)) przetwarzajProstokąt(static_cast<Prostokąt>(iFigura)); else if(typeid(iFigura) == typeid(Koło)) przetwarzajOkrąg(static_cast<Okrąg>(iFigura)); else if(typeid(iFigura) == typeid(Kwadrat)) przetwarzajKwadrat(static_cast<Kwadrat>(iFigura)); }
interface IWorkable { public void Work(); } interface IFeedable { public void Eat(); } class Worker: IWorkable, IFeedable { public void Work() { } public void Eat() { } } class Robot: IWorkable { public void Work() { } }
class Bclass B{{public void public void ZrobCos() { }ZrobCos() { }}}
class Aclass A{{public void public void Metoda()Metoda(){{B b = new B();B b = new B();
b.ZrobCos();b.ZrobCos();}}}}
interface IB{void ZrobCos() { }}
class B : IB{public void ZrobCos() { }}
class A{public void Metoda(){IB b = new B();
b.ZrobCos();}}
Co osiągnęliśmy?Co osiągnęliśmy?-odwróciliśmy zależności -odwróciliśmy zależności (wyeliminowaliśmy zależność (wyeliminowaliśmy zależność między abstrakcją a między abstrakcją a szczegółami implementacji)szczegółami implementacji)-klasa A może sterować -klasa A może sterować dowolnymi klasami dowolnymi klasami implementującymi interface implementującymi interface IBIB
Również zasada DIP przydaje Również zasada DIP przydaje się bardzo podczas tworzenia się bardzo podczas tworzenia struktury projektu do struktury projektu do wyeliminowania zależności wyeliminowania zależności między modułami.między modułami.
BudulceBudulce
Świat Microsoftu Świat Microsoftu
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Microsoft Enterprise Library jest to zbiór najlepszych praktyk oraz wzorców projektowych przygotowanych przez grupę specjalistów, które przydają się podczas budowy aplikacji na platformie .net, w wielu samodzielnych bibliotek które dołącza się do projektu w postaci referencji.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Consistency – Zwiozłość. Zbiór Enterprise Library zawiera bloki które cechuje rozszerzalność modułowa dodając nowe funkcjonalności oraz asocjację z wzorcami projektowymi , umożliwiając korzystanie cały czas z najnowszych porad które są dostarczane w postaci nowszych wersji biblioteki.
Extensibility – Rozszerzalność. Wszystkie bloki mogą być rozbudowywane do celów pod własny projekt, udostępniony kod źródłowy można dowolnie zmieniać i kompilować dodając referencje do projektu.
Integration – Integracyjność. Wszystkie bloki Enterprise Library są tak zaprojektowane aby współdziałały osobno i razem.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Cryptography Application Block - Blok Kryptografii Aplikacji
Blok zabezpiecza dane przy użyciu algorytmów kryptograficznych. Dane które aplikacja używa mogą być zaszyfrowane. Dodatkowo wszelkie dane dostępowe jak i hasła powinny być chronione hashem. Zabezpieczenia te mogą być wprowadzane poprzez konfigurator dostarczony do biblioteki , unika się styczności z kodem źródłowym.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Data Access Application Block - Blok Dostępu Do Danych Aplikacji
Blok umożliwia aplikacji czytanie danych do wyświetlenia komunikatu , przekazanie danych do innych warstw aplikacji. Pozwala również na wszelkie operacje bazo danowe z ADO.NET , zarządzanie pytaniami SQL , ustanawianie połączeń z bazą czy obsługę samego procesu przesyłania danych.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Exception Handling Application Blok - Block Wyjątków Aplikacji
Blok służy do szybkiego i łatwego budowania implementacji strategii w przypadku wyjątków z różnych modułów aplikacji. Może przechowywać informacje z wyjątków, ukrywać ważne dane z wyjątków maskując je innym wyjątkiem czy nadzorować proces pojawiania się wyjątków w czasie działania aplikacji.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Logging Application Block - Blok Logowania Aplikacji
Blok ten ma zastępować kod odpowiedzialny za odbieranie informacji z logowania. Posiada liczne funkcje logowania takie jak zapisywanie informacji do Windows Event Log, wysyłanie logu za pomocą wiadomości e-mail , zapisu do bazy danych , do Windows Management Instrumentation* (WMI) czy innej wskazanej lokalizacji.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
Validation Application Block - Blok Walidacji Aplikacji
Blok ma za zadanie sprawdzenie czy informacje uzyskiwane od użytkownika są poprawne w obrębie reguł ustanowionych w regułach biznesowych.
Jeżeli występuje błąd, gdyż wpisana nazwa jest błędna , blok ten automatycznie wysyła komunikat do użytkownika. Proste do edycji mechanizmy walidacji korzystające z atrybutów i szeregu zasad umożliwa integracje z różnymi interfaceami aplikacji.
Microsoft Enterprise LibraryMicrosoft Enterprise Library
TDDTDD
1.Napisz test kodu2. Skompiluj test kodu ( oczywiście będzie
błąd gdyż nic nie jest zaimpelemntowane)3. Dopisz resztę implementacji4. Uruchom test i sprawdz czy wystąpi błąd5. Skończy implementacje aby przejść test6.Uruchom test i sprawdz czy działa.7. Korzystając z techniki Refaktoryzacji ,
upraszczaj kod8. Powtarzaj aż do minimalizacji kodu.
TDDTDD
Silverlight i Silverlight i WPFWPF
MVVM , MVPMVVM , MVP
MVVMMVVM
MVC vs MVPMVC vs MVP
Programista „drag and drop” Używa zaawansowanej techniki
programistycznej o nazwie „drag & drop” Najwięcej czasu spędza korzystając z trybu
„design” Programista świadomy
Samodzielnie tworzy ~100% kodu W tym JavaScript
Często walczy z ASP.NET starając się zachować maksymalną kontrolę nad generowanym kodem
Problemem są pewne wstępne założenia, promowane do dziś odnośnie tzw. dobrych praktyk użycia ASP.NET (WebForms w szczególności)
ASP.NET 4.0 stara się pomóc świadomym programistom Nowe (właściwe) podejście do pracy z
ViewState Identyfikatory kontrolek (IDs) Nowe trybu renderingu niektórych kontrolek Kontrola URL XHTML i standardy zwiększające dostępność
stron WWW ASP.NET Ajax – inwestycja w warstwę kliencką ASP.NET MVC - NASZ WZORZEC
ASP.NET 4.0ASP.NET 4.0
Wyłączenie viewstate w web.config
…sprawi, że poniższe ustawienia przestaną działać:
Tak samo ja właściwość ViewStateMode
ViewStateViewState
Możliwe wyłączenie na poziomie np. całej strony i uaktywnianie na poziomie poszczególnych kontrolek
Control.ViewStateMode Enabled Disabled Inherit (ustawienie domyślne, dziedziczymy po
kontrolce nadrzędnej) Możliwość wyłączenia ViewState w
Web.config
ViewStateViewState
Control.ClientIdMode AutoID (jak w starym ASP.NET) Static („manualne” ustawianie ID, ryzyko błędu) Predictable (nowy algorytm przyznawania ID,
możliwość używania z „RowClientIdSuffix”) Inherit (ustawienie domyślne)
Web.config<system.web> <pages clientIdMode="Predictable"> </pages></system.web>
Identyfikatory IDIdentyfikatory ID
Funkcjonalność dostępna w ASP.NET 3.5 SP1, w ASP.NET 4.0 będzie nieco łatwiej…
Request:Products/Bikes
ASP.NET RoutingRoute:
Product/{name} -> Product.aspx
WebForms PageFile Name:
Product.aspxRoute Values:
Name = “Bikes”
Response
Identyfikatory IDIdentyfikatory ID
Przykłady użycia: Kod C#
Kod .aspx
string searchterm = Page.RouteData.Values["searchterm"] as string;label1.Text = searchterm;
<asp:Literal Text="<%$ RouteValue:Category %>" runat="server" />
<asp:EntityDataSource
…
<WhereParameters>
<asp:RouteParameter
Name="Category"
RouteKey="Category"
Type="String" />
</WhereParameters>
</asp:EntityDataSource>
Identyfikatory IDIdentyfikatory ID
Kontrolka Chart Istnieje w postaci dodatkowego komponentu
już od jakiegoś czasu 35 typów wykresów w tym tryby 3D Zaawansowane formatowanie Funkcje statystyczne Wykorzystanie Ajax i obsługa zdarzeń
Nowa kontrolki: ChartNowa kontrolki: Chart
Kilka nowości…
Kilka usprawnień Wsparcie dla CSS 2.1, lepsze zachowywanie
integralności HTML, lepszy intellisense w JavaScript
Snippets (~200) HTMLdiv, table, img …
ASP.NETscriptmanager, sqldatasource, formview
ASP.NET AJAXbehavior, control …
JavaScriptfunction, forin …
ASP.NET(VS2010)ASP.NET(VS2010)
Wdrażanie (Deployment) Paczki wdrożeniowe (Web packages)
Mogą zawierać: Dodatkowe biblioteki Skrypty SQL Ustawienia Certyfikaty, wpisy do rejestru, biblioteki itd..
Wdrażanie: „Import Application” w IIS 7.0 MsDeploy (np. z linii poleceń, PowerShell, Team Build) Deployment API
Transformacje plików Web.config
ASP.NET(VS2010)ASP.NET(VS2010)
Budowa paczki, zależności Web publishing pipeline
Microsoft.Web.Publishing.targets
ASP.NET(VS2010)ASP.NET(VS2010)
Areas Pozwala zorganizować
większy projekt w obszary (Area).
Każdy taki obszar może reprezentować logiczny moduł takiego projektu, grupując powiązane kontrolery i widoki
ASP.NET(MVC)ASP.NET(MVC)
Wiele więcej… Asynchroniczne kontrolery Bindowanie do danych binarnych Wsparcie dla atrybutów DataAnnotations Lepsza walidacja po stronie klienta Przeciążanie metod HTTP (np. PUT) Lepsze wspracie w Visual Studio
ASP.NET(MVC R2)ASP.NET(MVC R2)
Istnieje kilka cech ASP.NET MVC, które są naprawdę fajne: Pełna i naturalna kontrola nad HTML (w tym IDs
itp.) Łatwość użycia JavaScript frameworks (Jquery, Dojo,
ExtJS) Rozszerzalność i elastyczność (niemal naturalne
wsparcie dla IoC (dependency injection) ) Testowalność – i nie chodzi tu koniecznie o
podejście TDD, ale stary dobry Unit Testing Dla wyjadaczy tradycyjnego „ASP.NET” możliwość
nauczenia się nowych koncepcji, wzorców i podejścia do tworzenia stron WWW
ASP.NET MVC wydaję się być produktem udanym i jego używanie jest naprawdę fajne (casus Entity Framework ;-( )
Co wybraćCo wybrać
Dlaczego ew. warto zostać przy ASP.NET Baza wiedzy („use google before asking dump
questions”) Design Patterns i Guidlines – te które pojawiły się z
ASP.NET MVC zostały dość ostro skrytykowane (Oxite i Kobe)
Baza kontrolek (darmowych i komercyjnych – Telerik, DevExpress)
Ilość gotowych elementów infrastruktury i tzw. features (Membership, Navigation itp) – ich mała ilość drastycznie zmniejsza produktywność. Ich brak oznacza, że jeżeli chodzi o Rapid Development gorszy jest chyba tylko Perl (ale jest przynajmniej Intelisense i debugger). W praktyce musimy wspomagać się zewnętrznymi
komponentami (np. MvcContrib, FluentNHibernate lub L2S, xVal, Castle.*, jQuery) – niska spójność rozwiązania (cohesion)
Słabe wsparcie w Visual Studio Osiągamy efekt w postaci działającej aplikacji, ale
wymagana jest większa wiedza i większy nakład pracy (a uzasadnienie biznesowe?)
Co wybraćCo wybrać
Wokół ASP.NET MVC narosło wiele mitów… „Tylko ASP.NET MVC zapewnia czystą architekturę”
(separation of concerns) To już chyba zależy od programistów? A istniejące już referencyjne architektury? (np.:
Web Client Software Factory) „Tylko ASP.NET MVC zapewnia testowalność”
WatiN, xUnit itp... „Wsparcie dla Jquery”, „Ładne adresy URL” –
c’mon! „Niepoprawny HTML” – to nie wina WebForms tylko
programistów kontrolek ASP.NET to dojrzała, stabilna i sprawdzona
technologia Pamiętajmy że ASP.NET to infrastruktura na
podstawie której zbudowany został również ASP.NET MVC
Co wybraćCo wybrać
Bez „wzorca”Bez „wzorca”
KsiążkiKsiążki